From 3c6aa56e272bd0d08c3b3a8eb9da695fd1e1df60 Mon Sep 17 00:00:00 2001 From: Priec Date: Thu, 6 Aug 2026 12:32:52 +0200 Subject: [PATCH] table definition column types is shared --- common/proto/table_definition.proto | 20 ++++ common/src/proto/descriptor.bin | Bin 145579 -> 146638 bytes common/src/proto/komp_ac.table_definition.rs | 107 +++++++++++++++++++ server | 2 +- tui-canvas | 2 +- tui-pages | 2 +- 6 files changed, 130 insertions(+), 3 deletions(-) diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 8df16a08..705caedd 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -27,6 +27,10 @@ service TableDefinition { // This provides a tree-like overview of table relationships. rpc GetProfileTree(komp_ac.common.Empty) returns (ProfileTreeResponse); + // Lists every column type a table may declare, along with the SQL type it + // maps to. Pure data retrieval - no business logic. + rpc ListColumnTypes(komp_ac.common.Empty) returns (ListColumnTypesResponse); + // Fetches all tables with their columns and scripts for a specific profile. // Pure data retrieval - no business logic. rpc GetProfileDetails(GetProfileDetailsRequest) returns (GetProfileDetailsResponse); @@ -357,3 +361,19 @@ message DeleteTableResponse { // Human-readable summary of what was removed. string message = 2; } + +// Response listing every column type a table may declare. +message ListColumnTypesResponse { + // One declared column type and the SQL type it maps to. + message ColumnType { + // Logical column type (e.g. "money", "instant"). Passed to the server as + // ColumnDefinition.field_type. + string name = 1; + + // Underlying PostgreSQL type the logical type maps to (e.g. "NUMERIC"). + string sql_type = 2; + } + + // All declared column types. + repeated ColumnType column_types = 1; +} diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 0cb612c9a2d95ccf021c598f5c643da0d0ed808b..0f2d982831a908f7cab15156f47c15b830986ae6 100644 GIT binary patch delta 6984 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 A4gdfE delta 6039 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, +} +/// Nested message and enum types in `ListColumnTypesResponse`. +pub mod list_column_types_response { + /// One declared column type and the SQL type it maps to. + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] + pub struct ColumnType { + /// Logical column type (e.g. "money", "instant"). Passed to the server as + /// ColumnDefinition.field_type. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// Underlying PostgreSQL type the logical type maps to (e.g. "NUMERIC"). + #[prost(string, tag = "2")] + pub sql_type: ::prost::alloc::string::String, + } +} #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum MoneyRounding { @@ -636,6 +657,37 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Lists every column type a table may declare, along with the SQL type it + /// maps to. Pure data retrieval - no business logic. + pub async fn list_column_types( + &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/ListColumnTypes", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "ListColumnTypes", + ), + ); + self.inner.unary(req, path, codec).await + } /// Fetches all tables with their columns and scripts for a specific profile. /// Pure data retrieval - no business logic. pub async fn get_profile_details( @@ -840,6 +892,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Lists every column type a table may declare, along with the SQL type it + /// maps to. Pure data retrieval - no business logic. + async fn list_column_types( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Fetches all tables with their columns and scripts for a specific profile. /// Pure data retrieval - no business logic. async fn get_profile_details( @@ -1155,6 +1216,52 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/ListColumnTypes" => { + #[allow(non_camel_case_types)] + struct ListColumnTypesSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for ListColumnTypesSvc { + type Response = super::ListColumnTypesResponse; + 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 { + ::list_column_types(&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 = ListColumnTypesSvc(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) + } "/komp_ac.table_definition.TableDefinition/GetProfileDetails" => { #[allow(non_camel_case_types)] struct GetProfileDetailsSvc(pub Arc); diff --git a/server b/server index 976e859b..0a685313 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 976e859bf00c3863482c5c269f2553700d90a795 +Subproject commit 0a685313f4b134a6b86d864b7e54a9c3e4041565 diff --git a/tui-canvas b/tui-canvas index 5f354874..eca3d629 160000 --- a/tui-canvas +++ b/tui-canvas @@ -1 +1 @@ -Subproject commit 5f3548747c071ff59b1ce34763be4e7023da15fa +Subproject commit eca3d6294feb8a08cd1946b134f93ff05de4722e diff --git a/tui-pages b/tui-pages index afbbb218..1a33d6d8 160000 --- a/tui-pages +++ b/tui-pages @@ -1 +1 @@ -Subproject commit afbbb218c3fb801db188f5fe80b57d97028bfaa5 +Subproject commit 1a33d6d8dff878c0d882c01484b9e66c8c1a8a6a