From 5d9fffce130fff9f2d5da2370fac649f48f70a3e Mon Sep 17 00:00:00 2001 From: filipriec Date: Fri, 21 Feb 2025 01:55:33 +0100 Subject: [PATCH] grpc endpoint showing database schema for the frontend, now working --- proto/api.proto | 14 +++ src/adresar/handlers.rs | 2 + src/adresar/handlers/get_table_structure.rs | 116 ++++++++++++++++++++ src/proto/descriptor.bin | Bin 5944 -> 6913 bytes src/server/mod.rs | 13 ++- 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/adresar/handlers/get_table_structure.rs 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 29076a184c772e13ecd1e97928053aed3bc7ea9d..2455e494c195c7faf550848b424cef616b0a2925 100644 GIT binary patch literal 6913 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 ahg04IEO, + ) -> 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> {