From 0420108ff07462514c92baebdcbb03688d1a6a75 Mon Sep 17 00:00:00 2001 From: Priec Date: Thu, 3 Sep 2026 16:05:07 +0200 Subject: [PATCH] delete empty profile --- client-gui2 | 2 +- common/proto/table_definition.proto | 14 +++ common/src/proto/descriptor.bin | Bin 240813 -> 241103 bytes common/src/proto/komp_ac.table_definition.rs | 102 +++++++++++++++++++ komp-app/src/grpc.rs | 13 +++ server | 2 +- 6 files changed, 131 insertions(+), 2 deletions(-) diff --git a/client-gui2 b/client-gui2 index 3993395d..052ee017 160000 --- a/client-gui2 +++ b/client-gui2 @@ -1 +1 @@ -Subproject commit 3993395df02afe72920c1b44a86bcefda373be2b +Subproject commit 052ee01763576378dd0c378849b2e4e121312b29 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index cf331750..3444dbea 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -85,6 +85,10 @@ service TableDefinition { // Drops a table and its metadata, then deletes the profile if it becomes empty. rpc DeleteTable(DeleteTableRequest) returns (DeleteTableResponse); + + // Deletes an entire profile only when none of its user or backend-managed + // tables, audit stores, document stores, or accounting stores contain data. + rpc DeleteProfile(DeleteProfileRequest) returns (DeleteProfileResponse); } message CreateCustomExchangeRatesTableRequest { @@ -716,6 +720,16 @@ message DeleteTableResponse { string message = 2; } +message DeleteProfileRequest { + string profile_name = 1; +} + +message DeleteProfileResponse { + bool success = 1; + string message = 2; + int32 tables_deleted = 3; +} + // How a column type is spelled in ColumnDefinition.field_type. enum ColumnTypeSpelling { // The name is the whole spelling: "text", "money", "gtin_13". diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index d1f188562d7425945f527bc192aff866e08cd1fc..1c04fca64a624d948d753452cfcb35495086a329 100644 GIT binary patch delta 17372 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 z zC&A(yGe72wUy4$1CdW@x=eK()ipu4h&42YU_shw`Y3jo9FGu#tK^h6{%MlL)@?lUO z6km;${GTfV^3US0My2Mryn>kWScss3@_(-o(YrGlUZW0WcNW;?i{MUS|26-BsE1|Z z-PDAZbFNqS1zm<=tNEdWX+U6KS)3^5H*91x1t@|zNAq2W-} zGOSMZ4o))|jzh5D>LnP%RARYEcGNu8lqY*!m_sYnV z+R=!ww(oeKF#DWXcdvLpNJiB0{`caIYKw`GybIG)Ad{!HIWf;!o=hIs=EOW`UFP)S zb$DL#=X!OaA&}SMdB+mS`|!NDq+pml5YLM->{3U-6Y+xNq6T$=@vVG=T5v3ZJQgpA zOM10xAkW1M;y(S-&v|orFkYOz-k|>UL$O~zJuQxp$ufB_UL5nu*xMj4#*1TC-f30^ z$>Sw4N12_CYGe;MOeQah+jLJa57NaFKzPaJrOBWs^~*CIW}c;S+=ibDmG~jdv@|a3 zaBLHEEse>9iLFEoT9$m|WA z;<6sC4wTpQHF3|XLIa#@;t?awZw7~ntJWoF&r)Zc$=|T8i``KM2-mvUeLDfdv@Y&q zKePbhSr_xGG;_clCfaXIo|~oSkK%8LHWrA)Ya3(t<%C`t8fWbPegGlbIB(v~s%75I I;khIK2T|V40ssI2 diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index a573ed90..7947782a 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -805,6 +805,22 @@ pub struct DeleteTableResponse { #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct DeleteProfileRequest { + #[prost(string, tag = "1")] + pub profile_name: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct DeleteProfileResponse { + #[prost(bool, tag = "1")] + pub success: bool, + #[prost(string, tag = "2")] + pub message: ::prost::alloc::string::String, + #[prost(int32, tag = "3")] + pub tables_deleted: i32, +} /// Response describing the whole column-type vocabulary. /// /// This is the authority a client builds its column-type picker from: every rule @@ -1764,6 +1780,37 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Deletes an entire profile only when none of its user or backend-managed + /// tables, audit stores, document stores, or accounting stores contain data. + pub async fn delete_profile( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::unknown( + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic_prost::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/komp_ac.table_definition.TableDefinition/DeleteProfile", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "DeleteProfile", + ), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -1951,6 +1998,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Deletes an entire profile only when none of its user or backend-managed + /// tables, audit stores, document stores, or accounting stores contain data. + async fn delete_profile( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// The TableDefinition service manages the entire lifecycle of user-defined /// tables (stored as both metadata and physical PostgreSQL tables) inside @@ -2947,6 +3003,52 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/DeleteProfile" => { + #[allow(non_camel_case_types)] + struct DeleteProfileSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for DeleteProfileSvc { + type Response = super::DeleteProfileResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::delete_profile(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = DeleteProfileSvc(inner); + let codec = tonic_prost::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { let mut response = http::Response::new( diff --git a/komp-app/src/grpc.rs b/komp-app/src/grpc.rs index de04bd7c..66bf2747 100644 --- a/komp-app/src/grpc.rs +++ b/komp-app/src/grpc.rs @@ -1299,6 +1299,19 @@ impl GrpcClient { .into_inner()) } + pub async fn delete_profile( + &mut self, + request: common::proto::komp_ac::table_definition::DeleteProfileRequest, + ) -> Result { + let request = self.authenticated_request(request)?; + Ok(self + .table_definition_client + .delete_profile(request) + .await + .context("gRPC DeleteProfile call failed")? + .into_inner()) + } + pub async fn copy_profile( &mut self, request: common::proto::komp_ac::table_definition::CopyProfileRequest, diff --git a/server b/server index d3c676d6..a1ce6f6d 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit d3c676d64a760acbc1e35bc05af800c014deb81d +Subproject commit a1ce6f6d6c227d3a4700338295909666f723955c