diff --git a/proto/uctovnictvo.proto b/proto/uctovnictvo.proto index af97e17..07e5815 100644 --- a/proto/uctovnictvo.proto +++ b/proto/uctovnictvo.proto @@ -9,6 +9,7 @@ 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); } message PostUctovnictvoRequest { diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index d601206..1377e33 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 411628d..bfe320f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -4,7 +4,7 @@ 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 }; -use crate::uctovnictvo::handlers::{post_uctovnictvo, get_uctovnictvo, get_uctovnictvo_count}; +use crate::uctovnictvo::handlers::{post_uctovnictvo, get_uctovnictvo, get_uctovnictvo_count, get_uctovnictvo_by_position}; use crate::proto::multieko2::{ FILE_DESCRIPTOR_SET, }; @@ -16,7 +16,7 @@ use crate::proto::multieko2::adresar::{ }; use crate::proto::multieko2::uctovnictvo::{ uctovnictvo_server::{Uctovnictvo, UctovnictvoServer}, - PostUctovnictvoRequest, UctovnictvoResponse, GetUctovnictvoRequest // Add this import + PostUctovnictvoRequest, UctovnictvoResponse, GetUctovnictvoRequest, }; pub struct AdresarService { @@ -112,6 +112,14 @@ impl Uctovnictvo for UctovnictvoService { let response = get_uctovnictvo_count(&self.db_pool, request.into_inner()).await?; Ok(Response::new(response)) } + + async fn get_uctovnictvo_by_position( + &self, + request: Request, + ) -> Result, Status> { + let response = get_uctovnictvo_by_position(&self.db_pool, request.into_inner()).await?; + Ok(Response::new(response)) + } } pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box> { diff --git a/src/uctovnictvo/handlers.rs b/src/uctovnictvo/handlers.rs index b978290..c0e515a 100644 --- a/src/uctovnictvo/handlers.rs +++ b/src/uctovnictvo/handlers.rs @@ -1,8 +1,10 @@ // src/uctovnictvo/handlers.rs pub mod post_uctovnictvo; pub mod get_uctovnictvo; -pub mod get_uctovnictvo_count; // Add this line +pub mod get_uctovnictvo_count; +pub mod get_uctovnictvo_by_position; pub use post_uctovnictvo::post_uctovnictvo; pub use get_uctovnictvo::get_uctovnictvo; -pub use get_uctovnictvo_count::get_uctovnictvo_count; // Add this line +pub use get_uctovnictvo_count::get_uctovnictvo_count; +pub use get_uctovnictvo_by_position::get_uctovnictvo_by_position; diff --git a/src/uctovnictvo/handlers/get_uctovnictvo_by_position.rs b/src/uctovnictvo/handlers/get_uctovnictvo_by_position.rs new file mode 100644 index 0000000..bb7df21 --- /dev/null +++ b/src/uctovnictvo/handlers/get_uctovnictvo_by_position.rs @@ -0,0 +1,35 @@ +// src/uctovnictvo/handlers/get_uctovnictvo_by_position.rs +use tonic::Status; +use sqlx::PgPool; +use crate::proto::multieko2::adresar::PositionRequest; +use crate::uctovnictvo::models::Uctovnictvo; +use super::get_uctovnictvo; + +pub async fn get_uctovnictvo_by_position( + db_pool: &PgPool, + request: PositionRequest, +) -> Result { + if request.position < 1 { + return Err(Status::invalid_argument("Position must be at least 1")); + } + + // Find the ID of the Nth non-deleted record + let id: i64 = sqlx::query_scalar!( + r#" + SELECT id + FROM uctovnictvo + WHERE deleted = FALSE + ORDER BY id ASC + OFFSET $1 + LIMIT 1 + "#, + request.position - 1 + ) + .fetch_optional(db_pool) + .await + .map_err(|e| Status::internal(e.to_string()))? + .ok_or_else(|| Status::not_found("Position out of bounds"))?; + + // Now fetch the complete record using the existing get_uctovnictvo function + get_uctovnictvo(db_pool, crate::proto::multieko2::uctovnictvo::GetUctovnictvoRequest { id }).await +}