diff --git a/build.rs b/build.rs index 7a8b1eb..279bd55 100644 --- a/build.rs +++ b/build.rs @@ -4,7 +4,12 @@ fn main() -> Result<(), Box> { .build_server(true) .file_descriptor_set_path("src/proto/descriptor.bin") .compile_protos( - &["proto/adresar.proto", "proto/uctovnictvo.proto"], + &[ + "proto/common.proto", + "proto/adresar.proto", + "proto/uctovnictvo.proto", + "proto/table_structure.proto" + ], &["proto"], )?; Ok(()) diff --git a/proto/adresar.proto b/proto/adresar.proto index a2f41bb..91db0af 100644 --- a/proto/adresar.proto +++ b/proto/adresar.proto @@ -1,16 +1,17 @@ // proto/adresar.proto syntax = "proto3"; - package multieko2.adresar; +import "common.proto"; +import "table_structure.proto"; + service Adresar { rpc PostAdresar (PostAdresarRequest) returns (AdresarResponse); rpc GetAdresar (GetAdresarRequest) returns (AdresarResponse); rpc PutAdresar (PutAdresarRequest) returns (AdresarResponse); rpc DeleteAdresar (DeleteAdresarRequest) returns (DeleteAdresarResponse); - rpc GetAdresarCount (Empty) returns (CountResponse); - rpc GetAdresarByPosition (PositionRequest) returns (AdresarResponse); - rpc GetTableStructure (Empty) returns (TableStructureResponse); + rpc GetAdresarCount (common.Empty) returns (common.CountResponse); + rpc GetAdresarByPosition (common.PositionRequest) returns (AdresarResponse); } message GetAdresarRequest { @@ -80,24 +81,3 @@ message PutAdresarRequest { message DeleteAdresarResponse { bool success = 1; } - -message Empty {} - -message CountResponse { - int64 count = 1; -} - -message PositionRequest { - int64 position = 1; -} - -message TableStructureResponse { - repeated TableColumn columns = 1; -} - -message TableColumn { - string name = 1; - string data_type = 2; - bool is_nullable = 3; - bool is_primary_key = 4; -} diff --git a/proto/common.proto b/proto/common.proto new file mode 100644 index 0000000..e54271e --- /dev/null +++ b/proto/common.proto @@ -0,0 +1,6 @@ +syntax = "proto3"; +package multieko2.common; + +message Empty {} +message CountResponse { int64 count = 1; } +message PositionRequest { int64 position = 1; } diff --git a/proto/table_structure.proto b/proto/table_structure.proto new file mode 100644 index 0000000..21cbcb5 --- /dev/null +++ b/proto/table_structure.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package multieko2.table_structure; + +import "common.proto"; + +message TableStructureResponse { + repeated TableColumn columns = 1; +} + +message TableColumn { + string name = 1; + string data_type = 2; + bool is_nullable = 3; + bool is_primary_key = 4; +} + +service TableStructureService { + rpc GetAdresarTableStructure (common.Empty) returns (TableStructureResponse); + rpc GetUctovnictvoTableStructure (common.Empty) returns (TableStructureResponse); +} diff --git a/proto/uctovnictvo.proto b/proto/uctovnictvo.proto index 0209b15..11f3f76 100644 --- a/proto/uctovnictvo.proto +++ b/proto/uctovnictvo.proto @@ -1,17 +1,15 @@ // proto/uctovnictvo.proto syntax = "proto3"; - package multieko2.uctovnictvo; -import "adresar.proto"; +import "common.proto"; service Uctovnictvo { rpc PostUctovnictvo (PostUctovnictvoRequest) returns (UctovnictvoResponse); rpc GetUctovnictvo (GetUctovnictvoRequest) returns (UctovnictvoResponse); - rpc GetUctovnictvoCount (multieko2.adresar.Empty) returns (multieko2.adresar.CountResponse); - rpc GetUctovnictvoByPosition (multieko2.adresar.PositionRequest) returns (UctovnictvoResponse); + rpc GetUctovnictvoCount (common.Empty) returns (common.CountResponse); + rpc GetUctovnictvoByPosition (common.PositionRequest) returns (UctovnictvoResponse); rpc PutUctovnictvo (PutUctovnictvoRequest) returns (UctovnictvoResponse); - rpc GetTableStructure (multieko2.adresar.Empty) returns (multieko2.adresar.TableStructureResponse); } message PostUctovnictvoRequest { diff --git a/src/adresar/handlers/get_adresar_by_position.rs b/src/adresar/handlers/get_adresar_by_position.rs index 2f9c824..5545566 100644 --- a/src/adresar/handlers/get_adresar_by_position.rs +++ b/src/adresar/handlers/get_adresar_by_position.rs @@ -1,7 +1,8 @@ // src/adresar/handlers/get_adresar_by_position.rs use tonic::{Status}; use sqlx::PgPool; -use crate::proto::multieko2::adresar::{PositionRequest, AdresarResponse, GetAdresarRequest}; +use crate::proto::multieko2::adresar::{AdresarResponse, GetAdresarRequest}; +use crate::proto::multieko2::common::PositionRequest; use super::get_adresar; pub async fn get_adresar_by_position( diff --git a/src/adresar/handlers/get_adresar_count.rs b/src/adresar/handlers/get_adresar_count.rs index 6f11802..14bace6 100644 --- a/src/adresar/handlers/get_adresar_count.rs +++ b/src/adresar/handlers/get_adresar_count.rs @@ -1,7 +1,7 @@ // src/adresar/handlers/get_adresar_count.rs use tonic::Status; use sqlx::PgPool; -use crate::proto::multieko2::adresar::{CountResponse, Empty}; +use crate::proto::multieko2::common::{CountResponse, Empty}; pub async fn get_adresar_count( db_pool: &PgPool, diff --git a/src/lib.rs b/src/lib.rs index 9b46fd6..cb6703b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,3 +6,4 @@ pub mod proto; pub mod adresar; pub mod uctovnictvo; pub mod shared; +pub mod table_structure; diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index 84b6f96..5a45110 100644 Binary files a/src/proto/descriptor.bin and b/src/proto/descriptor.bin differ diff --git a/src/proto/mod.rs b/src/proto/mod.rs index a76de70..c222846 100644 --- a/src/proto/mod.rs +++ b/src/proto/mod.rs @@ -10,5 +10,13 @@ pub mod multieko2 { tonic::include_proto!("multieko2.uctovnictvo"); } + pub mod common { + tonic::include_proto!("multieko2.common"); + } + + pub mod table_structure { + tonic::include_proto!("multieko2.table_structure"); + } + pub const FILE_DESCRIPTOR_SET: &[u8] = include_bytes!("descriptor.bin"); } diff --git a/src/server/mod.rs b/src/server/mod.rs index d3170ca..1c7fc0d 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,26 +1,36 @@ // src/server/mod.rs +use crate::table_structure::handlers; use tonic::{Request, Response, Status}; use tonic_reflection::server::Builder as ReflectionBuilder; use crate::adresar::handlers::{ - post_adresar, get_adresar, put_adresar, delete_adresar, get_adresar_count, get_adresar_by_position, get_table_structure + post_adresar, get_adresar, put_adresar, delete_adresar, get_adresar_count, get_adresar_by_position, }; use crate::uctovnictvo::handlers::{ post_uctovnictvo, get_uctovnictvo, get_uctovnictvo_count, get_uctovnictvo_by_position, - put_uctovnictvo, get_table_structure as get_uctovnictvo_table_structure, + put_uctovnictvo, }; use crate::proto::multieko2::{ + common::{Empty, CountResponse, PositionRequest}, + table_structure::{TableStructureResponse, TableColumn}, FILE_DESCRIPTOR_SET, }; use crate::proto::multieko2::adresar::{ adresar_server::{Adresar, AdresarServer}, PostAdresarRequest, AdresarResponse, GetAdresarRequest, PutAdresarRequest, - DeleteAdresarRequest, DeleteAdresarResponse, PositionRequest, CountResponse, Empty, - TableStructureResponse, + DeleteAdresarRequest, DeleteAdresarResponse, }; use crate::proto::multieko2::uctovnictvo::{ uctovnictvo_server::{Uctovnictvo, UctovnictvoServer}, PostUctovnictvoRequest, UctovnictvoResponse, GetUctovnictvoRequest, PutUctovnictvoRequest, }; +use crate::proto::multieko2::table_structure::{ + table_structure_service_server::{TableStructureService, TableStructureServiceServer}, + TableStructureResponse +}; +use crate::proto::multieko2::{ + common::{Empty, CountResponse, PositionRequest}, + table_structure::{TableStructureResponse, TableColumn} +}; pub struct AdresarService { db_pool: sqlx::PgPool, @@ -30,6 +40,10 @@ pub struct UctovnictvoService { db_pool: sqlx::PgPool, } +pub struct TableStructureHandler { + db_pool: sqlx::PgPool +} + #[tonic::async_trait] impl Adresar for AdresarService { async fn post_adresar( @@ -79,14 +93,6 @@ impl Adresar for AdresarService { let response = get_adresar_by_position(&self.db_pool, request.into_inner()).await?; Ok(Response::new(response)) } - - async fn get_table_structure( - &self, - request: Request, - ) -> Result, Status> { - let response = get_table_structure(&self.db_pool, request.into_inner()).await?; - Ok(Response::new(response)) - } } #[tonic::async_trait] @@ -99,7 +105,6 @@ impl Uctovnictvo for UctovnictvoService { Ok(Response::new(response)) } - // Add this method async fn get_uctovnictvo( &self, request: Request, @@ -131,13 +136,22 @@ impl Uctovnictvo for UctovnictvoService { let response = put_uctovnictvo(&self.db_pool, request.into_inner()).await?; Ok(Response::new(response)) } +} - async fn get_table_structure( +#[tonic::async_trait] +impl TableStructureService for TableStructureHandler { + async fn get_adresar_table_structure( &self, - request: Request, + request: Request, ) -> Result, Status> { - let response = get_uctovnictvo_table_structure(&self.db_pool, request.into_inner()).await?; - Ok(Response::new(response)) + handlers::get_adresar_table_structure(&self.db_pool, request.into_inner()).await + } + + async fn get_uctovnictvo_table_structure( + &self, + request: Request, + ) -> Result, Status> { + handlers::get_uctovnictvo_table_structure(&self.db_pool, request.into_inner()).await } } @@ -145,6 +159,7 @@ pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box Result<(), Box Result { + let columns = vec![ + TableColumn { + name: "firma".to_string(), + data_type: "TEXT".to_string(), + is_nullable: false, + is_primary_key: false, + }, + // ... other columns from original adresar handler + ]; + Ok(TableStructureResponse { columns }) +} + +pub async fn get_uctovnictvo_table_structure( + _db_pool: &PgPool, + _request: Empty, +) -> Result { + let columns = vec![ + TableColumn { + name: "adresar_id".to_string(), + data_type: "BIGINT".to_string(), + is_nullable: false, + is_primary_key: false, + }, + // ... other columns from original uctovnictvo handler + ]; + Ok(TableStructureResponse { columns }) +} diff --git a/src/table_structure/mod.rs b/src/table_structure/mod.rs new file mode 100644 index 0000000..b6c37d9 --- /dev/null +++ b/src/table_structure/mod.rs @@ -0,0 +1,3 @@ +// src/table_structure/mod.rs + +pub mod handlers; diff --git a/src/uctovnictvo/handlers/get_uctovnictvo_count.rs b/src/uctovnictvo/handlers/get_uctovnictvo_count.rs index 1c72321..a4e5607 100644 --- a/src/uctovnictvo/handlers/get_uctovnictvo_count.rs +++ b/src/uctovnictvo/handlers/get_uctovnictvo_count.rs @@ -1,7 +1,7 @@ // src/uctovnictvo/handlers/get_uctovnictvo_count.rs use tonic::Status; use sqlx::PgPool; -use crate::proto::multieko2::adresar::{CountResponse, Empty}; +use crate::proto::multieko2::common::{CountResponse, Empty}; pub async fn get_uctovnictvo_count( db_pool: &PgPool,