From ddb799a80db46aded5f9e59be77d41b7d199ca4e Mon Sep 17 00:00:00 2001 From: filipriec Date: Fri, 21 Feb 2025 22:50:32 +0100 Subject: [PATCH] get by count --- proto/uctovnictvo.proto | 1 + src/proto/descriptor.bin | Bin 8838 -> 9001 bytes src/server/mod.rs | 12 +++++- src/uctovnictvo/handlers.rs | 6 ++- .../handlers/get_uctovnictvo_by_position.rs | 35 ++++++++++++++++++ 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/uctovnictvo/handlers/get_uctovnictvo_by_position.rs 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 d601206785ac5f9841f68bee40b1df039ad1efe4..1377e33c3e88c71275b845016befdcabafb1abc7 100644 GIT binary patch delta 1528 zcmX|=yKWOf6oz*$w%4->-W_`{PU8C&#SsM(1uY6e6m&cQSSg^u2w5p;wm{+q{0b-% z9a4IpfQkn~{AYdkbpCbbn}25K^Y`nYFMs{W^|$=tKL4xry?OY0_FQ@Y(G@qh`?uTu z?(Wlv?f!0e_|tlFcy@m2UjI9FO>b3jb@+XLtxgX1;-QS3Z3fzS6WOghaSaLzDIC{H zBTZk_iB`UO=bY0v@b*z~rtsU?0L-Is=&+p)bl^?L_6ecTpwzAt7Is{(POq?ECoh=8 zEEZ0Ii>>38ie^#GDPS?MZB>U8CWo8BZJEe&jpa!cGfekOx;<_|@X}(?;sv9tducJW zQVwUm>DrWcw7|N8Szz5LF6$w=PwE;~sxQ?5*OR&iu%6U4y-97xJ2ru(Qr85Q zMoB#bmiAIyuB30@@+PyMXDx7Y=bMZ`lX#WeYu?j))&kH>&w$QVEt}d38%ch2p%7WBOflp z^XeFigd5o8`2CTv-++xn!pZ>-K{g^`zdRwCSyaq`4f$=9hHxXn zG_X;1`jQIByb-@C61b6Y2xC@AX)jv+2}b74>N?#7Hj}oNFU_3aRB1AAE*zORXJat~ zH?NGf_+T(^!NMW{TL?zxEm&C0fGt>9rD5LE7W}Ft-qM!G{}pE7mTW8%xMiC2lf%4~ z+>Xp!NgbKDVqujg^HwaZ(vdf7xm*NnEm#C>P2X}`85V(Cv$5LS%i!v0EQxU$4yt2l iGInE+e_;gdw_)>;uyDh|B4N8tCw|}j{AIV_J^c^HHdSE& delta 1446 zcmX|>JC4*q5Qg24@p!tK9lQNp=KV%9n~{+(0mooPyemXR;*1OI6%Z2HN|SK`a!x?Z zDfr7%uCP?~_1}-r{`vmf{mb`S|1B>+>OWfl(wDEV-zoRu_t?e3s_5?dG`m;+`Du1( zozpf7b{yR*=bW*T3TB)voOjknItu2--nv(AK*fNnQD0&3#ua^KP}L1%XiWrDz$Vu5 zprW4dF_nRvfP3iTbTH}jzxk&&m3fW%)Tc~qjHh|QF(@*LF^I_oGr%&5F*GT=v%v&g z@`@H%5X=G#K5hFZxFB(u%q4EnRsE?3;Btu@0LvvV4yLdbuNVU>BrXP4_^j^%D~b|_ zYw7NX!IU;|ZwRgwZV0aQr+z|~d%)GnAtPUnC%f;nJ~Je>p9imaLG{WZsfbjSAS3PmPKu*&wB1-b&)gyp>>N-l|V)wFS45I83f3j?7yN zN9L_1j?7z29L(ED9GSNfjLh5gaXJRJk+flG&6eL(X)&$zk3>PDkb)B#z8G zu&_##c?T9&X&=l{4(EX#1@pj;be9jEVIJI(jn%=PqPwfHB*rP3ciYfp?AcyFVH8;J Z%;urO;F*O*h2_qZ^ke+=`SHu++y4<4Npk=I 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 +}