diff --git a/Cargo.lock b/Cargo.lock index 079904a..5ba30b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1377,6 +1377,7 @@ dependencies = [ "toml", "tonic", "tonic-build", + "tonic-reflection", "tracing", "tracing-subscriber", ] @@ -2665,6 +2666,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tonic-reflection" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878d81f52e7fcfd80026b7fdb6a9b578b3c3653ba987f87f0dce4b64043cba27" +dependencies = [ + "prost", + "prost-types", + "tokio", + "tokio-stream", + "tonic", +] + [[package]] name = "tower" version = "0.4.13" diff --git a/Cargo.toml b/Cargo.toml index 9b52bce..cb09ae3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ tokio = { version = "1.43.0", features = ["full", "macros"] } toml = "0.8.20" tonic = "0.12.3" tonic-build = "0.12.3" +tonic-reflection = "0.12.3" tracing = "0.1.41" tracing-subscriber = "0.3.19" diff --git a/build.rs b/build.rs index 1f5f767..96d5fa7 100644 --- a/build.rs +++ b/build.rs @@ -1,4 +1,8 @@ // build.rs -fn main() { - tonic_build::compile_protos("proto/api.proto").unwrap(); +fn main() -> Result<(), Box> { + tonic_build::configure() + .build_server(true) + .file_descriptor_set_path("src/proto/descriptor.bin") // Generate the file descriptor set + .compile_protos(&["proto/api.proto"], &["proto"])?; // Use compile_protos() instead of compile() + Ok(()) } diff --git a/proto/api.proto b/proto/api.proto index 9d8a00c..ebe0ec4 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -9,6 +9,11 @@ service DataProcessor { service Adresar { rpc CreateAdresar (AdresarRequest) returns (AdresarResponse); + rpc GetAdresar (GetAdresarRequest) returns (AdresarResponse); +} + +message GetAdresarRequest { + int64 id = 1; // The ID of the Adresar entry to retrieve } message AdresarRequest { diff --git a/src/adresar/handlers.rs b/src/adresar/handlers.rs index 18bb451..3c235c5 100644 --- a/src/adresar/handlers.rs +++ b/src/adresar/handlers.rs @@ -1,4 +1,7 @@ // src/adresar/handlers.rs pub mod create_adresar; +pub mod get_adresar; + pub use create_adresar::create_adresar; +pub use get_adresar::get_adresar; diff --git a/src/adresar/handlers/get_adresar.rs b/src/adresar/handlers/get_adresar.rs new file mode 100644 index 0000000..d4b8064 --- /dev/null +++ b/src/adresar/handlers/get_adresar.rs @@ -0,0 +1,42 @@ +// src/adresar/handlers/get_adresar.rs +use tonic::{Request, Response, Status}; +use sqlx::PgPool; +use crate::adresar::models::Adresar; +use crate::proto::multieko2::{GetAdresarRequest, AdresarResponse}; + +pub async fn get_adresar( + db_pool: &PgPool, + request: GetAdresarRequest, +) -> Result { + let adresar = sqlx::query_as!( + Adresar, + r#" + SELECT id, firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, skladm, ico, kontakt, telefon, skladu, fax + FROM adresar + WHERE id = $1 + "#, + request.id + ) + .fetch_one(db_pool) + .await + .map_err(|e| Status::not_found(e.to_string()))?; + + Ok(AdresarResponse { + id: adresar.id, + firma: adresar.firma, + kz: adresar.kz.unwrap_or_default(), + drc: adresar.drc.unwrap_or_default(), + ulica: adresar.ulica.unwrap_or_default(), + psc: adresar.psc.unwrap_or_default(), + mesto: adresar.mesto.unwrap_or_default(), + stat: adresar.stat.unwrap_or_default(), + banka: adresar.banka.unwrap_or_default(), + ucet: adresar.ucet.unwrap_or_default(), + skladm: adresar.skladm.unwrap_or_default(), + ico: adresar.ico.unwrap_or_default(), + kontakt: adresar.kontakt.unwrap_or_default(), + telefon: adresar.telefon.unwrap_or_default(), + skladu: adresar.skladu.unwrap_or_default(), + fax: adresar.fax.unwrap_or_default(), + }) +} diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin new file mode 100644 index 0000000..dcd6086 Binary files /dev/null and b/src/proto/descriptor.bin differ diff --git a/src/proto/mod.rs b/src/proto/mod.rs index 0ca672e..54ea90a 100644 --- a/src/proto/mod.rs +++ b/src/proto/mod.rs @@ -1,3 +1,7 @@ +// src/proto/mod.rs pub mod multieko2 { tonic::include_proto!("multieko2"); + + // Include the file descriptor set + pub const FILE_DESCRIPTOR_SET: &[u8] = include_bytes!("descriptor.bin"); } diff --git a/src/server/mod.rs b/src/server/mod.rs index f8ce8ee..7a1d79c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,10 +1,12 @@ // src/server/mod.rs use tonic::{Request, Response, Status}; +use tonic_reflection::server::Builder as ReflectionBuilder; // Import tonic-reflection use crate::db; -use crate::adresar::handlers::create_adresar; +use crate::adresar::handlers::{create_adresar, get_adresar}; use crate::proto::multieko2::{ - AdresarRequest, AdresarResponse, + AdresarRequest, AdresarResponse, GetAdresarRequest, adresar_server::{Adresar, AdresarServer}, + FILE_DESCRIPTOR_SET, // Import the generated file descriptor set }; pub struct AdresarService { @@ -20,6 +22,14 @@ impl Adresar for AdresarService { let response = create_adresar(&self.db_pool, request.into_inner()).await?; Ok(Response::new(response)) } + + async fn get_adresar( + &self, + request: Request, + ) -> Result, Status> { + let response = get_adresar(&self.db_pool, request.into_inner()).await?; + Ok(Response::new(response)) + } } pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box> { @@ -28,8 +38,15 @@ pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box