From ef751e241f16ac533ed93e96241d17db1bd834bf Mon Sep 17 00:00:00 2001 From: Priec Date: Sat, 18 Jul 2026 17:32:41 +0200 Subject: [PATCH] jiff for table definition added --- client | 2 +- common/proto/auth.proto | 10 +++ common/proto/table_definition.proto | 7 +- common/src/proto/descriptor.bin | Bin 113813 -> 114553 bytes common/src/proto/komp_ac.auth.rs | 86 +++++++++++++++++++ common/src/proto/komp_ac.table_definition.rs | 7 +- server | 2 +- 7 files changed, 110 insertions(+), 4 deletions(-) diff --git a/client b/client index 0fd324c..9c8ae0b 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit 0fd324cf74df78be99d25a91dea038cad3803614 +Subproject commit 9c8ae0b6fa843155195f83d4e7026996e7925edd diff --git a/common/proto/auth.proto b/common/proto/auth.proto index e7b5e7a..0842709 100644 --- a/common/proto/auth.proto +++ b/common/proto/auth.proto @@ -8,6 +8,7 @@ service AuthService { rpc Register(RegisterRequest) returns (AuthResponse); rpc Login(LoginRequest) returns (LoginResponse); rpc GetAuthorization(GetAuthorizationRequest) returns (AuthorizationSnapshot); + rpc SetTimezone(SetTimezoneRequest) returns (UserPreferences); } message RegisterRequest { @@ -38,6 +39,15 @@ message LoginResponse { string role = 5; // User's role string username = 6; AuthorizationSnapshot authorization = 7; + string timezone = 8; +} + +message SetTimezoneRequest { + string timezone = 1; // IANA timezone, for example Europe/Bratislava +} + +message UserPreferences { + string timezone = 1; } message GetAuthorizationRequest {} diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 75f802b..0a9abba 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -120,11 +120,16 @@ message ColumnDefinition { // Logical column type. Supported values (case-insensitive): // TEXT // BOOLEAN - // TIMESTAMPTZ + // INSTANT (absolute timestamp, displayed in the viewer timezone) + // USER_DATETIME (local input resolved in the user's timezone) + // RAW_DATETIME (timezone-free civil datetime) + // TIME (timezone-free time of day) // MONEY (= unconstrained NUMERIC; currency comes from the table) // INT // BIGINT // DATE + // DURATION + // PERIOD // DECIMAL(p,s) → NUMERIC(p,s) // DECIMAL args must be integers (no sign, no dot, no leading zeros); // s ≤ p and p ≥ 1. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 39ec23c763b4ca4c83f233c7500865f57f14d851..ebcf3c9551bcedd91d14813101361bf6eda1751d 100644 GIT binary patch delta 5873 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 diff --git a/common/src/proto/komp_ac.auth.rs b/common/src/proto/komp_ac.auth.rs index 22bd686..c0057e1 100644 --- a/common/src/proto/komp_ac.auth.rs +++ b/common/src/proto/komp_ac.auth.rs @@ -56,6 +56,19 @@ pub struct LoginResponse { pub username: ::prost::alloc::string::String, #[prost(message, optional, tag = "7")] pub authorization: ::core::option::Option, + #[prost(string, tag = "8")] + pub timezone: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetTimezoneRequest { + /// IANA timezone, for example Europe/Bratislava + #[prost(string, tag = "1")] + pub timezone: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct UserPreferences { + #[prost(string, tag = "1")] + pub timezone: ::prost::alloc::string::String, } #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetAuthorizationRequest {} @@ -230,6 +243,30 @@ pub mod auth_service_client { .insert(GrpcMethod::new("komp_ac.auth.AuthService", "GetAuthorization")); self.inner.unary(req, path, codec).await } + pub async fn set_timezone( + &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.auth.AuthService/SetTimezone", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("komp_ac.auth.AuthService", "SetTimezone")); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -260,6 +297,10 @@ pub mod auth_service_server { tonic::Response, tonic::Status, >; + async fn set_timezone( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; } #[derive(Debug)] pub struct AuthServiceServer { @@ -470,6 +511,51 @@ pub mod auth_service_server { }; Box::pin(fut) } + "/komp_ac.auth.AuthService/SetTimezone" => { + #[allow(non_camel_case_types)] + struct SetTimezoneSvc(pub Arc); + impl< + T: AuthService, + > tonic::server::UnaryService + for SetTimezoneSvc { + type Response = super::UserPreferences; + 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_timezone(&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 = SetTimezoneSvc(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/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index 2f3565b..78374ed 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -82,11 +82,16 @@ pub struct ColumnDefinition { /// Logical column type. Supported values (case-insensitive): /// TEXT /// BOOLEAN - /// TIMESTAMPTZ + /// INSTANT (absolute timestamp, displayed in the viewer timezone) + /// USER_DATETIME (local input resolved in the user's timezone) + /// RAW_DATETIME (timezone-free civil datetime) + /// TIME (timezone-free time of day) /// MONEY (= unconstrained NUMERIC; currency comes from the table) /// INT /// BIGINT /// DATE + /// DURATION + /// PERIOD /// DECIMAL(p,s) → NUMERIC(p,s) /// DECIMAL args must be integers (no sign, no dot, no leading zeros); /// s ≤ p and p ≥ 1. diff --git a/server b/server index 23f5fee..cbbf1ac 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 23f5feeaa175f5b9b77c95a1ed503b39d86d2df9 +Subproject commit cbbf1ac16b38e2fc00faeaefb7023ba62bfa469c