From e13447e3d6a92ad835945fa7a22c042ecca846f4 Mon Sep 17 00:00:00 2001 From: Priec Date: Mon, 17 Aug 2026 20:22:39 +0200 Subject: [PATCH] custom ecb is dynamic table and not system table from now on2 --- client | 2 +- common/proto/table_definition.proto | 19 +++- common/src/proto/descriptor.bin | Bin 185772 -> 186516 bytes common/src/proto/komp_ac.table_definition.rs | 114 ++++++++++++++++++- server | 2 +- web/src/schema/mod.rs | 3 +- 6 files changed, 131 insertions(+), 9 deletions(-) diff --git a/client b/client index 42f163be..bfe8d72e 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit 42f163beaec0c66337487698542924e02f5172b3 +Subproject commit bfe8d72e32be69ad5a3358397d9418939fbbba10 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 36d94322..afc76d58 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -14,6 +14,10 @@ service TableDefinition { // Also inserts metadata and default validation rules. Entirely transactional. rpc PostTableDefinition(PostTableDefinitionRequest) returns (TableDefinitionResponse); + // Explicitly creates the optional administrator-managed exchange-rate table + // in an existing profile. The server owns its core shape and constraints. + rpc CreateCustomExchangeRatesTable(CreateCustomExchangeRatesTableRequest) returns (CreateCustomExchangeRatesTableResponse); + // Creates a regular user-table bundle from the restricted komp_ac_fields // contract embedded in a Typst invoice template. This is invoked explicitly // by the user; templates do not provision tables merely by existing. @@ -53,14 +57,23 @@ service TableDefinition { rpc DeleteTable(DeleteTableRequest) returns (DeleteTableResponse); } +message CreateCustomExchangeRatesTableRequest { + string profile_name = 1; +} + +message CreateCustomExchangeRatesTableResponse { + int64 table_definition_id = 1; + bool created = 2; +} + // Defines the input for creating a new table definition. message PostTableDefinitionRequest { // Table name to create inside the target profile. // Must be lowercase, alphanumeric with underscores, // start with a letter, and be <= 63 chars. - // Forbidden names: "id", "deleted", "created_at", "row_revision" -- the - // system columns, which share one namespace with table names wherever the - // two are named side by side. The "_id" suffix is allowed. + // Forbidden names include the system columns and tables owned by dedicated + // server operations, such as "custom_exchange_rates". The "_id" suffix is + // allowed. string table_name = 1; // The table's columns, including its links and stored linked projections. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 12ce2b91ddc517103747510a69f7ae53747dfd64..ddd598dbc09369f9840e7303cb329da8a1f9b838 100644 GIT binary patch delta 10010 zcmai(eRx&XmB#Ph`{d@{bBVyoCrN;7K#@{|l+a?Kh=AHb)Pg8&$LFyrq>?s#ltio3 zae_j%kuQf*cNGCgFg8;VL2RVZ2xtYBj@W{&LaiblwRVcnV>?Afo!{E~oLuIQ>HK%! zv)B9Xwbx#I?T@?pC%HA-a*KDUOPh16WgRfmUpeih$ z?S$r3>AX5GGb4fB9nES&rT$CKKD$`09=cJ5gZ{o;bdmk`t*Uz1-?y64^z9p)THC58 zI^+LGvU|pD>X{(-U%yacaa5#Idjq@dOZsd(>(4%8>?AO}acbGmvU3KAj*j``ne` z4?QV}%wRkFF7<=@0Mg)eS!@BtPThnA^3N2XC8*6U6h8`3 zqIO9Z0MMJLi=7?_!-*L;Kxsp7;-JAXji!rrX>6#VU98gylD6Wr5(Mqy{!uuEQR$*6 zxFog6-nL3jtd#V=BvTje)Qn4uAJcSI^-t_?SE&u{tiahVH_l-}%8I+CwXJC$3#;YE zd8|2EWNw|d=2?R*;jiD4pVKs_c{U4pPMECE1q+*4(X9N|Pv={2oIN++*qX1K?W*SW z$(p}j)_iN7U)OclH_xfV^c&x3zIjT%xi!o;wzMqxPSYH}ip52SIW3Mh2>+*LeF#7d zb6Q1Z_!jwsDQ(m34gac6T*Pk{+H~zofwZtVrssT6L1I`t#Kj7P$n?X;ML2`t=W2dKwjE zp`H38b=SpO7vuB7UZ0CmT$mdi)12{N?aaRSwC6W!hKi`929p8`mxe}fu>_k{M)unvNJ|{HC~CF@5QHi) zoj`22D5`ecis}|gJ5QzY5v3dAMhcohKT&C^Xu#ZgNvks+J~FKKQWBR()MrMAm*Ze@ zl-{mVPuroJ)TO1Y!(hA03<}T3zhd!khrM-^8a|rec()@NGZ4!iNg4r>+#zW++7W5& zwl8l|BO8j{9Ca6nGDqFX^wJ8kTc(#|t#rv8?Xu$^QX3}mn^EmbMg?S4yA*|5Mgc@< zm!eX~5TRX)QvG?S1M0B@JJn||E7p?6Jp~<^y`ChEX+@_;QLMd=%wCV8T7SpsK;5VG zXRDj-RXK)m|*iUOxMH1MzI1qMCULsRH{H zr4OpqQf;4nSdA^?ToxQunX0hEFv5&u9FoJ9hKsK6c_Os;v9fE_GdcG~ZF7!LJXXvy00W5S72mluvXbczVjtdsK~w zC{uh&>ArD)(!nX!&#z}%A)b;!EpSB8X?yHZ^{s}CTal-ewF88BS`}BsIx?rH)qv{o z7Dr_A7Hj+6ZK@3>g$mT`tIXYEo%Ji7R+x)*S$X&+$HaDtwnMh7%VDy8g5vcGgtf$mExxt+}Gnkej$V&V>wEY_`4FEJd5=|hc9XhT7 zKr}lvH9)+{N_3WM+wvIR0AMap#sPGVaZLikT&}4}a_9@A^xZmjz`paCx~PIPb8xrj zOnDWWp&>t4Yki-cxI=xh5=iT69hQZ|!?d)Dw`=T%9csvUhv;+-f??mV*f(RpM(4^4 zALw|ECTq8-SOJTB?Z-RR!%jimzV}Q8ar|DLtLRk_*YDL#-U#QQiqh+}{;7TaaWxbN z#eAK{c&d}9)JDMuTl-TrWgLwzo*RgNti}iIH)z(I_m~gJZ;;4b7z<$Vpk4b@HQEV? ze-9S?Q!cO%>RjJm0rBrandpCx1xV;lo9$LNO%o5Kh;{0q(4pjbr!J}N6_9!C)Kztb z4=8r(bIuK~jTOON_W5r0C8sFmtm{lgDQI1~q_kH+(!WcW4J&*Q1^uZJT+(D3l{mH8 z-tdIF+6_|Hz~(atDXU;}VH&YVV6#l)q*wsPR{Pf{)Oco5xuvj`Letx!EQYN*TZob@ zhpiH&Ejm^p43Bru+o^^rC&8&Qc>GKsWUqW&=L&J+Y{>_XZNpt6=qSBY>nH7@pQ$<$ zL88dTr9YdR3{kEx>?GM;>Jo{4HtDgv^_ z_7tMd2L{liOQLwpd=P>z9Z>jy!#$d<#AU8Hw9oe2t%gkwbqck8I^IBlXzkOv$ki(# zO8a!F-|2wp?9*KI4#*xE%1HOyf7-2{zLMXBZGW=tfzqZq#mm+Mgt=dHjA!c!a#8v@ zo%*GATTj5fH+W97)pG|Aa^l=UyZq;zQTUB>2NUOjba7C}$37s$gE|`Ix&YF}L49_e z>!MGTenF>RjJxQA=Z<3D9q$Kq7ER=Z1#E#d9#+L;9Q%i8Z|( z()A;$QaUJ!(uZ~GH+D&nnp#?d;bEQ0hvVp^L^^rNzSg5Y*T8Qae<_I#5X+ZzeDVb% z`I4mcG$hZ8(y!>$@9gDIs>|BX!tfQHk!Oe?I7=jt>i857LKNutHXyb~6Hy?dM@7_A zX*{NNog2hiE`@-8$UugCOe&p>80d^E2l`VQ7^!1Af3_>xeWUbiI(5R1*rP6L?~CPY zIwMaGLC{zHdtK|ZoeT*7fZjhKwy!4%0Yvn5pAbT&@pyqMxdcq8;?VH|Rs1)@(l)Ga%Hrb!nNu zDD;y<=pU0A2f+mv$Hp?2KkAIXx6umskI9Vp6ZDSOe&vFo0u!p#<#%+(&p55ln4Rrf z!q7iTpQH%=#eQ?2nto+}EKlnAqR?OB@NVJ|2vwjT3=rFQlN1D^`mQ+iMMBtLynWAR zpHfpM^P4sIUNT8Qbl%fB9|fS8>i$FBIDzQAr-z;ACMk;2f77W??A=c>NfCyB)A4OC z66a3o_{;`E6zGQx#P$@fI#D2^r*w%tMRA4}=iX1o1%e9n;{v+Yc)bFlzAxi)x7yF>nXDcVTwv0zD1RV%6t}|tKq{#37WAQxFV~TqBw*65OwxxsKCRN~jN|)fBpYY@ zX&qlcfpiN@xUz4a*6{_DR=B4%2Ug!LwjUL!a(o0PRM{~sRD7IxJSLJS z7{Liww#ttSF3U#wvBqUNdX`4%+fC|w#?JqRn%G{7jZ>J(sILLS(21i6}5vae3b+{GF8$`;l&CQKh2c68z?Z5k~~~t;ys#H zoLa#@8nLqE;R?gcj90>TrO~6~#v;4`x?bCHLlSYN8C0J%!(C}ceJ18&yvoE&r_ALc zFqsj_!&N3;ITniWSsta=n$*AB{?DlyRpl72HPmhX;|R(nE7uuaUVXX!>UT0iE>x{x{{dyLhLe`geY0pWgt!_o)uAgi%C6ZbH7v*+AA>J zVlsZKu8?>>Vzl2CL4*V7mnsn3M-ovWqK}BEq;iD}bgPNCTM$&B4+GG(W)oqFsEP%tnx=qyn%q=0u!z%KWegm1ECe}qbA-!Dg>_lag8Gj;KIiGJ%w`y(Z_Y zEfA@_W{@wLK&19c$^5Dt0O%?E=R@k+_9{2sPbJ|6LVU{bZ-h)YP)tpHn7~%V$h{ZW= zTOiy6Qb8mr10?OAO@aadx&n7_uny4R`sEl$_2tRLU{7RkQFu+CS z`6Mbpn9nCw87QVQGZV?2YHo=p^^$$;S87~oHHI%p9#28CT7vSTRlimf8~DwzUQC7s z#PY=?Pk>0iD0#9}3VpS>dc@xNYqc1r1msA8DFHc>qzSDskBBq%I8zg)UpA@V+u?`R z@X{I#Up5>Y<)5J%aptIPI;>`n<~Nc@llcK+c{G_HAd*LAe&iNfBfh+9|8$sJD8C`T zn)m{gHWN<{5aO#cIov|odDF*D>RmhQh`PM*aZ^+&i@V6ZX`Qg!j;JdJpNNZ{d}Ja| zNJ)B*@q^KQ+YWq59UT0&(e8FGA2E8{a6A8RZv;GPGrv)%@+S*Qk`gCHX_Fx!wNd(g zliJ&z|E=1fDr%8^-*AVQ?Wb0r2R}6W=l00U>WV5Ltsfem2lvbC9#}&5iT(U5YVQ{u zV(g!o_#{Y?-I`XHHSHNOvV8 zbx=2iM`|xXm-pDKf3I5IAmqAm&zT;`IqjZ+KdcfDW< zmxi@xD#&qdZNUDRD9C|rZNLtBb?gF1w)M8`b#;YvL5^(e&lHeD+xj3|7=xVJ*2@^4 zPh8;Ow$ZM8UHxK$L_v;j8_%3fIlOHQxPm4w$nkAsz$>d8<7)Nf7}HNzknY2CU^X$Kr>>x+|CyiYt4pTrYrR4kZLv?k zp}rgoN%n2|-$IgqTLRv13)-@Xw*(xpT6={^!EN^X6Y5)&yhoCQ+k$j>21~MVTac?g z^Akeb0ydAIn|KB|zV7bs^9R+frXr-XWYumS(|Y5TWsY|TCAEbQsO}C1))zjYxjPs& x+Wp;7E1}wBOWstI8u*Rco**v%K(zJ*@qGk{(w?Bgzg_{++0(t`O*Q<_{{#B`@=5>z delta 9373 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, + ) -> 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/CreateCustomExchangeRatesTable", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "CreateCustomExchangeRatesTable", + ), + ); + self.inner.unary(req, path, codec).await + } /// Creates a regular user-table bundle from the restricted komp_ac_fields /// contract embedded in a Typst invoice template. This is invoked explicitly /// by the user; templates do not provision tables merely by existing. @@ -1111,6 +1156,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Explicitly creates the optional administrator-managed exchange-rate table + /// in an existing profile. The server owns its core shape and constraints. + async fn create_custom_exchange_rates_table( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Creates a regular user-table bundle from the restricted komp_ac_fields /// contract embedded in a Typst invoice template. This is invoked explicitly /// by the user; templates do not provision tables merely by existing. @@ -1329,6 +1383,60 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/CreateCustomExchangeRatesTable" => { + #[allow(non_camel_case_types)] + struct CreateCustomExchangeRatesTableSvc( + pub Arc, + ); + impl< + T: TableDefinition, + > tonic::server::UnaryService< + super::CreateCustomExchangeRatesTableRequest, + > for CreateCustomExchangeRatesTableSvc { + type Response = super::CreateCustomExchangeRatesTableResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::CreateCustomExchangeRatesTableRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_custom_exchange_rates_table( + &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 = CreateCustomExchangeRatesTableSvc(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/CreateInvoiceTemplateTable" => { #[allow(non_camel_case_types)] struct CreateInvoiceTemplateTableSvc(pub Arc); diff --git a/server b/server index 2cec55d9..4fa445cc 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 2cec55d9e90ff116ecfa0c9908d15ca5a7fa3be1 +Subproject commit 4fa445ccf882e1341c732b4eef2e025b4fc60733 diff --git a/web/src/schema/mod.rs b/web/src/schema/mod.rs index 9bcdd80b..1b2c809c 100644 --- a/web/src/schema/mod.rs +++ b/web/src/schema/mod.rs @@ -1235,11 +1235,12 @@ pub(crate) const MAX_TABLE_NAME_LENGTH: usize = MAX_IDENTIFIER_LENGTH /// constants of three server modules rather than anything the catalog carries. /// A name the server adds to that set is a name this list will not know about /// until it is added here as well. -pub(crate) const RESERVED_TABLE_NAMES: [&str; 4] = [ +pub(crate) const RESERVED_TABLE_NAMES: [&str; 5] = [ "general_ledger", "journal_lines", "quantity_ledger", LEDGER_ACCOUNTS_TABLE, + "custom_exchange_rates", ]; /// The identifier rules, plus the two a table name alone is held to.