From 44dc6cc57265ec94b353842c6e3380a735e9941d Mon Sep 17 00:00:00 2001 From: Priec Date: Mon, 7 Sep 2026 18:27:43 +0200 Subject: [PATCH] decoupled module system with exchange rates --- AGENTS.md | 2 +- common/build.rs | 1 + common/proto/exchange_rates.proto | 4 + common/proto/table_definition.proto | 27 +++ common/src/proto/descriptor.bin | Bin 253439 -> 255596 bytes common/src/proto/komp_ac.common.rs | 3 + common/src/proto/komp_ac.exchange_rates.rs | 8 + common/src/proto/komp_ac.table_definition.rs | 215 +++++++++++++++++++ generic_rust_todo.txt | 12 ++ server | 2 +- 10 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 generic_rust_todo.txt diff --git a/AGENTS.md b/AGENTS.md index 51dd9027..57d2eab8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ - When creating a new Rust file, format ONLY that new file with the Cargo formatter (`rustfmt --edition 2024 --config skip_children=true path/to/new_file.rs`). Use the file’s actual Rust edition. Never run workspace-wide or package-wide `cargo fmt`, and never format existing files unless explicitly requested. - Do not run other automatic code-formatting commands unless explicitly requested. -- Write new or changed SQL in a human-readable layout. Use indented multiline queries, put SQL clauses and JOIN conditions on separate lines, and indent subqueries. Rust formatting does not format SQL inside strings; review that SQL manually. +- Keep SQL easy to scan and preserve existing readable layouts. Short queries and simple subqueries may stay on one line; for example, keep each simple `EXISTS (SELECT 1 FROM ... WHERE ...)` condition together, with successive `OR EXISTS` conditions on separate lines. Use multiline layout and indentation when query complexity or line length warrants it, especially for long SELECT lists, multiple JOINs, or nested logic. Do not mechanically put every clause on its own line or expand compact SQL just to satisfy a formatting rule. Review SQL inside Rust strings manually; do not reformat unrelated queries. - Preserve existing formatting. Make only the smallest hand-edited changes required for the task. - Do not run builds, checks, linters, or pre-existing tests. Only run tests that an agent wrote or modified as part of the current task; if the agent did not write or modify any tests, run no tests. - Check if what you are doing is running. Server can be running, tauri app might be running. No need to turn on redundant systems. diff --git a/common/build.rs b/common/build.rs index 33791b95..f8bdcc54 100644 --- a/common/build.rs +++ b/common/build.rs @@ -9,6 +9,7 @@ fn main() -> Result<(), Box> { .type_attribute(".komp_ac.accounting", serde) .type_attribute(".komp_ac.analytics", serde) .type_attribute(".komp_ac.auth", serde) + .type_attribute(".komp_ac.common", serde) .type_attribute(".komp_ac.document_data", serde) .type_attribute( ".komp_ac.document_data.TypstTemplateVersion", diff --git a/common/proto/exchange_rates.proto b/common/proto/exchange_rates.proto index 7d21fdec..a38e1a25 100644 --- a/common/proto/exchange_rates.proto +++ b/common/proto/exchange_rates.proto @@ -127,6 +127,8 @@ message PreviewDirectConversionResponse { ExchangeRateDateRule applied_date_rule = 23; ExchangeRateSource applied_source = 24; string selection_reason = 25; + string module_id = 26; + string provider_evidence_json = 27; } message ListConversionEvidenceRequest { @@ -167,6 +169,8 @@ message ConversionEvidence { optional string custom_rate_note = 26; string selection_reason = 27; optional string selected_by_user_id = 28; + string module_id = 29; + string provider_evidence_json = 30; } message ListConversionEvidenceResponse { diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 8c37b5ee..a334d495 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -9,6 +9,9 @@ import "common.proto"; // logical "profiles" (schemas). Each table has stored structure, links, and // validation rules. service TableDefinition { + rpc GetModuleConfiguration(GetModuleConfigurationRequest) returns (ModuleConfiguration); + rpc SetModuleConfiguration(SetModuleConfigurationRequest) returns (ModuleConfiguration); + // Creates a new table (and schema if missing) with system columns, // linked-table foreign keys, user-defined columns, and optional indexes. // Also inserts metadata and default validation rules. Entirely transactional. @@ -102,6 +105,30 @@ service TableDefinition { rpc DeleteProfile(DeleteProfileRequest) returns (DeleteProfileResponse); } +message ModuleScope { + oneof target { + komp_ac.common.Empty global = 1; + string profile_name = 2; + } +} + +message GetModuleConfigurationRequest { + ModuleScope scope = 1; +} + +message SetModuleConfigurationRequest { + ModuleScope scope = 1; + repeated string enabled_modules = 2; +} + +message ModuleConfiguration { + ModuleScope scope = 1; + repeated string available_modules = 2; + repeated string selected_modules = 3; + repeated string inherited_modules = 4; + repeated string effective_modules = 5; +} + message CreateCustomExchangeRatesTableRequest { string profile_name = 1; } diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 9b3568c209ff59704a0402657090bc829d23918c..001cb632ffd2a260e2f8da537c463aaf55a69529 100644 GIT binary patch delta 25006 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 BFm3<< delta 22942 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, + #[prost(string, tag = "29")] + pub module_id: ::prost::alloc::string::String, + #[prost(string, tag = "30")] + pub provider_evidence_json: ::prost::alloc::string::String, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index e824406f..7bd22837 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -1,6 +1,51 @@ // This file is @generated by prost-build. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ModuleScope { + #[prost(oneof = "module_scope::Target", tags = "1, 2")] + pub target: ::core::option::Option, +} +/// Nested message and enum types in `ModuleScope`. +pub mod module_scope { + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Target { + #[prost(message, tag = "1")] + Global(super::super::common::Empty), + #[prost(string, tag = "2")] + ProfileName(::prost::alloc::string::String), + } +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct GetModuleConfigurationRequest { + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetModuleConfigurationRequest { + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, + #[prost(string, repeated, tag = "2")] + pub enabled_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ModuleConfiguration { + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, + #[prost(string, repeated, tag = "2")] + pub available_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, repeated, tag = "3")] + pub selected_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, repeated, tag = "4")] + pub inherited_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, repeated, tag = "5")] + pub effective_modules: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateCustomExchangeRatesTableRequest { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, @@ -1314,6 +1359,64 @@ pub mod table_definition_client { self.inner = self.inner.max_encoding_message_size(limit); self } + pub async fn get_module_configuration( + &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/GetModuleConfiguration", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "GetModuleConfiguration", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn set_module_configuration( + &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/SetModuleConfiguration", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "SetModuleConfiguration", + ), + ); + self.inner.unary(req, path, codec).await + } /// Creates a new table (and schema if missing) with system columns, /// linked-table foreign keys, user-defined columns, and optional indexes. /// Also inserts metadata and default validation rules. Entirely transactional. @@ -2044,6 +2147,20 @@ pub mod table_definition_server { /// Generated trait containing gRPC methods that should be implemented for use with TableDefinitionServer. #[async_trait] pub trait TableDefinition: std::marker::Send + std::marker::Sync + 'static { + async fn get_module_configuration( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn set_module_configuration( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Creates a new table (and schema if missing) with system columns, /// linked-table foreign keys, user-defined columns, and optional indexes. /// Also inserts metadata and default validation rules. Entirely transactional. @@ -2332,6 +2449,104 @@ pub mod table_definition_server { } fn call(&mut self, req: http::Request) -> Self::Future { match req.uri().path() { + "/komp_ac.table_definition.TableDefinition/GetModuleConfiguration" => { + #[allow(non_camel_case_types)] + struct GetModuleConfigurationSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for GetModuleConfigurationSvc { + type Response = super::ModuleConfiguration; + 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 { + ::get_module_configuration( + &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 = GetModuleConfigurationSvc(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/SetModuleConfiguration" => { + #[allow(non_camel_case_types)] + struct SetModuleConfigurationSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for SetModuleConfigurationSvc { + type Response = super::ModuleConfiguration; + 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 { + ::set_module_configuration( + &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 = SetModuleConfigurationSvc(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/PostTableDefinition" => { #[allow(non_camel_case_types)] struct PostTableDefinitionSvc(pub Arc); diff --git a/generic_rust_todo.txt b/generic_rust_todo.txt new file mode 100644 index 00000000..1a2e0a15 --- /dev/null +++ b/generic_rust_todo.txt @@ -0,0 +1,12 @@ +1. - Your Rust module can define a column type XX, which you can add through the table definition. + - When a row is saved, the framework calls the registered modules’ row hooks. + - You implement your module’s hook and choose whether its logic runs for every table, only tables containing XX, or + another condition. + + - If you want it to affect only the XX column, your hook selects and processes that column’s value from the supplied + row. + + - The framework doesn’t automatically make those choices. You implement the filtering and column-specific behavior; + modules without a row-hook implementation default to doing nothing. + +2. diff --git a/server b/server index cc585a2a..1da33d65 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit cc585a2a9c7be3e3dfe4ab1fcfeafb7a79ef4864 +Subproject commit 1da33d65622004d0005b672a7b67b2f69d7c9492