diff --git a/proto/api.proto b/proto/api.proto index 4143ada..19031fb 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -14,8 +14,10 @@ service Adresar { rpc DeleteAdresar (DeleteAdresarRequest) returns (DeleteAdresarResponse); rpc GetAdresarCount (Empty) returns (CountResponse); // New endpoint rpc GetAdresarByPosition (PositionRequest) returns (AdresarResponse); // New endpoint + rpc GetTableStructure (Empty) returns (TableStructureResponse); // New endpoint for table structure } +// Existing messages message GetAdresarRequest { int64 id = 1; // The ID of the Adresar entry to retrieve } @@ -102,3 +104,15 @@ message CountResponse { message PositionRequest { int64 position = 1; // Request with the position of the item to retrieve } + +// New messages for the table structure endpoint +message TableStructureResponse { + repeated TableColumn columns = 1; // List of columns in the table +} + +message TableColumn { + string name = 1; // Name of the column + string data_type = 2; // Data type of the column (e.g., TEXT, INT, etc.) + bool is_nullable = 3; // Whether the column allows NULL values + bool is_primary_key = 4; // Whether the column is a primary key +} diff --git a/src/adresar/handlers.rs b/src/adresar/handlers.rs index 72ae187..99c3808 100644 --- a/src/adresar/handlers.rs +++ b/src/adresar/handlers.rs @@ -6,6 +6,7 @@ pub mod put_adresar; pub mod delete_adresar; pub mod get_adresar_count; pub mod get_adresar_by_position; +pub mod get_table_structure; pub use post_adresar::post_adresar; pub use get_adresar::get_adresar; @@ -13,3 +14,4 @@ pub use put_adresar::put_adresar; pub use delete_adresar::delete_adresar; pub use get_adresar_count::get_adresar_count; pub use get_adresar_by_position::get_adresar_by_position; +pub use get_table_structure::get_table_structure; diff --git a/src/adresar/handlers/get_table_structure.rs b/src/adresar/handlers/get_table_structure.rs new file mode 100644 index 0000000..6800ce6 --- /dev/null +++ b/src/adresar/handlers/get_table_structure.rs @@ -0,0 +1,116 @@ +// src/adresar/handlers/get_table_structure.rs +use tonic::Status; +use sqlx::PgPool; +use crate::proto::multieko2::{TableStructureResponse, TableColumn, Empty}; + +pub async fn get_table_structure( + db_pool: &PgPool, + _request: Empty, +) -> Result { + let columns = vec![ + TableColumn { + name: "id".to_string(), + data_type: "BIGSERIAL".to_string(), // Updated field name + is_nullable: false, + is_primary_key: true, + }, + TableColumn { + name: "firma".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: false, + is_primary_key: false, + }, + TableColumn { + name: "kz".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "drc".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "ulica".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "psc".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "mesto".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "stat".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "banka".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "ucet".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "skladm".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "ico".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "kontakt".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "telefon".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "skladu".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "fax".to_string(), + data_type: "TEXT".to_string(), // Updated field name + is_nullable: true, + is_primary_key: false, + }, + TableColumn { + name: "created_at".to_string(), + data_type: "TIMESTAMPTZ".to_string(), // Updated field name + is_nullable: false, + is_primary_key: false, + }, + ]; + + Ok(TableStructureResponse { columns }) +} diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index 29076a1..2455e49 100644 Binary files a/src/proto/descriptor.bin and b/src/proto/descriptor.bin differ diff --git a/src/server/mod.rs b/src/server/mod.rs index 6492d82..0b424cb 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,10 +1,13 @@ // src/server/mod.rs 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}; +use crate::adresar::handlers::{ + post_adresar, get_adresar, put_adresar, delete_adresar, get_adresar_count, get_adresar_by_position, get_table_structure +}; use crate::proto::multieko2::{ PostAdresarRequest, AdresarResponse, GetAdresarRequest, PutAdresarRequest, DeleteAdresarRequest, DeleteAdresarResponse, PositionRequest, CountResponse, Empty, + TableStructureResponse, // Add this import adresar_server::{Adresar, AdresarServer}, FILE_DESCRIPTOR_SET, }; @@ -62,6 +65,14 @@ 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)) + } } pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box> {