From 9ff6dada406db278f0d34f467c008d7b6273249d Mon Sep 17 00:00:00 2001 From: filipriec Date: Tue, 18 Feb 2025 14:40:23 +0100 Subject: [PATCH] working get count properly for adresar --- proto/api.proto | 13 +++++++ src/adresar/docs/get_example.txt | 33 ++++++++++++++++++ src/adresar/handlers.rs | 4 +++ .../handlers/get_adresar_by_position.rs | 26 ++++++++++++++ src/adresar/handlers/get_adresar_count.rs | 19 ++++++++++ src/proto/descriptor.bin | Bin 5290 -> 5985 bytes src/server/mod.rs | 20 +++++++++-- 7 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/adresar/docs/get_example.txt create mode 100644 src/adresar/handlers/get_adresar_by_position.rs create mode 100644 src/adresar/handlers/get_adresar_count.rs diff --git a/proto/api.proto b/proto/api.proto index 0ec6d99..6dc98d9 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -12,6 +12,8 @@ service Adresar { rpc GetAdresar (GetAdresarRequest) returns (AdresarResponse); rpc PutAdresar (PutAdresarRequest) returns (AdresarResponse); rpc DeleteAdresar (DeleteAdresarRequest) returns (DeleteAdresarResponse); + rpc GetAdresarCount (Empty) returns (CountResponse); // New endpoint + rpc GetAdresarByPosition (PositionRequest) returns (AdresarResponse); // New endpoint } message GetAdresarRequest { @@ -89,3 +91,14 @@ message DataResponse { message DeleteAdresarResponse { bool success = 1; // Indicates whether the deletion was successful } + +// New messages for the additional endpoints +message Empty {} // Empty request for count + +message CountResponse { + int64 count = 1; // Response with the count of items +} + +message PositionRequest { + int64 position = 1; // Request with the position of the item to retrieve +} diff --git a/src/adresar/docs/get_example.txt b/src/adresar/docs/get_example.txt new file mode 100644 index 0000000..5093a47 --- /dev/null +++ b/src/adresar/docs/get_example.txt @@ -0,0 +1,33 @@ +# TOTAL items in the adresar +❯ grpcurl -plaintext localhost:50051 multieko2.Adresar/GetAdresarCount +{ + "count": "43" +} + +# Item at this count. If there are 43 items, number 1 is the first item +❯ grpcurl -plaintext -d '{"position": 1}' localhost:50051 multieko2.Adresar/GetAdresarByPosition +{ + "id": "2", + "firma": "asdfasf", + "kz": " ", + "drc": " ", + "ulica": " ", + "psc": "sdfasdf", + "mesto": "asf", + "stat": "as", + "banka": "df", + "ucet": "asf", + "skladm": "f", + "ico": "f", + "kontakt": "f", + "telefon": "f", + "skladu": "f", + "fax": " " +} +# Item fetched by id. The first item was created and removed, therefore number 1 in ids doenst exists, since first to exist now has number 2 +❯ grpcurl -plaintext -d '{"id": 1}' localhost:50051 multieko2.Adresar/GetAdresar +ERROR: + Code: NotFound + Message: no rows returned by a query that expected to return at least one row +╭─    ~ ············································· 69 ✘ +╰─ diff --git a/src/adresar/handlers.rs b/src/adresar/handlers.rs index 294b352..72ae187 100644 --- a/src/adresar/handlers.rs +++ b/src/adresar/handlers.rs @@ -4,8 +4,12 @@ pub mod post_adresar; pub mod get_adresar; pub mod put_adresar; pub mod delete_adresar; +pub mod get_adresar_count; +pub mod get_adresar_by_position; pub use post_adresar::post_adresar; pub use get_adresar::get_adresar; 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; diff --git a/src/adresar/handlers/get_adresar_by_position.rs b/src/adresar/handlers/get_adresar_by_position.rs new file mode 100644 index 0000000..17b73b5 --- /dev/null +++ b/src/adresar/handlers/get_adresar_by_position.rs @@ -0,0 +1,26 @@ +// src/adresar/handlers/get_by_position.rs +use tonic::{Status}; +use sqlx::PgPool; +use crate::proto::multieko2::{PositionRequest, AdresarResponse, GetAdresarRequest}; +use super::get_adresar; + +pub async fn get_adresar_by_position( + db_pool: &PgPool, + request: PositionRequest, +) -> Result { + if request.position < 1 { + return Err(Status::invalid_argument("Position must be at least 1")); + } + let offset = request.position - 1; + + let id: i64 = sqlx::query_scalar!( + "SELECT id FROM adresar ORDER BY id ASC OFFSET $1 LIMIT 1", + offset + ) + .fetch_optional(db_pool) + .await + .map_err(|e| Status::internal(e.to_string()))? + .ok_or_else(|| Status::not_found("Position out of bounds"))?; + + get_adresar(db_pool, GetAdresarRequest { id }).await +} diff --git a/src/adresar/handlers/get_adresar_count.rs b/src/adresar/handlers/get_adresar_count.rs new file mode 100644 index 0000000..ac5c943 --- /dev/null +++ b/src/adresar/handlers/get_adresar_count.rs @@ -0,0 +1,19 @@ +// src/adresar/handlers/get_adresar_count.rs +use tonic::{Status}; +use sqlx::PgPool; +use crate::proto::multieko2::{CountResponse, Empty}; + +pub async fn get_adresar_count( + db_pool: &PgPool, + _request: Empty, +) -> Result { + let count: i64 = sqlx::query_scalar!( + "SELECT COUNT(*) as count FROM adresar" + ) + .fetch_one(db_pool) + .await + .map_err(|e| Status::internal(e.to_string()))? + .unwrap_or(0); // Handle the case where the count is None + + Ok(CountResponse { count }) +} diff --git a/src/proto/descriptor.bin b/src/proto/descriptor.bin index de2945fe7196bc009e373beb888752a710c01e71..3d50045a97378c8db773e24faf704e63476c43bf 100644 GIT binary patch literal 5985 zcmeI0S#ul55yyd@!8ITNa(KZ!LY_eMur!l*>w4sZxQ&(n9e7LoA{w zA282($zzhQl7G+iHbJ^vR{1$^+dK2?p6==Y>|y>hV{)~t#>~}qGiuu0Mf*HzglEn9 z>bU9I38S_8b=az1ABBHuhposKP0*;9la=H{b%d+xr0LrX&%-GEjd}kJjD6c|-F4Sz zQm2jUi<m_s*EI9Ec6nASXZ=iP(9HHp7?pE=CSBVBlWv`z*XkE# z`#GF1VC;>gy|cx4v9OE_Y{reHr6&i}yB{(tDTscHh+Zzk%s_ z+rHbecLebN3SV-g{*DUYH~Gz4REy6Rh^-Ej&jNQ{T{2yM3OD$KDdM0y30tkO{;^|r zLGIG@>YVAnb1X3r;kDW)#Je!rqu8uwOls@mD*95LFolg~`!YHTnSqE-=msBq-l#q@ zB^+ptsL{NP6BshtE55~Z#hyPj1zOo#zxd|0{iDgVLHF&zjGVkPbc1~k4gTW3U)B6S zl*zFC?Jj)X9Ike>gXy>*yBz8mzI%Xd8*_8$+mVi$H@Cmi&y99&`MJ6MHGYmzw$A5^ z9qU-qt&!MU<<}?hetvICH_5oIw%r|&>w=+j$DP~laA5jw@bxco6WGqO#y8_db&lOB z`ToDgOxo&X;^(9pHpwolk_kK1Q$a&V%~^Re8|M(?i80r!%0M;c~Kx2Xh zz`6v3QP6MLqXJeyIj923KmjWZej8gfbNLl2tudypD(aPLv2qZ8u7sEMt7hXeGCWno zO))zdTX0kS#+MEt+!Uvm*-gr-lHU6jHz~L&Wk=Xe3T{gG9>o^ilvZ|V2Q)U+Ci>hC zXezVKeq)x6)^0<4bx(D=^24XFvbR}jo>n4UaUWsb(e;-~)T~^G(RCyIYv>Xn4(saG zIf_LVeA33Tg~+|7ZWkGQKaeQ<$h1=fSnVPryS*Po2U;|5j_CH~;!(pC>;ho}p5Ks`6C-3F2Ycf;B{hlPp5`EKV97TgW@_A!Q`5$(DR zSQ6NXV3gNLzQ9-#*hqH|W7v{W?Rpwm0Blq+TGnX3$Qbq9XpdzK#ywf20(MU@>cD%l zNJTSck?6TGiKc;#2}T_^Cef(J#v~dhRwP==S#e3I!zvOj1*{^`(pKHqeZ2lOu=^4% z4eWlt6psPBZ+khnj8#>MmH}23ECZ}6(K5iQ5-n@hxJ1hW8y74KY+RycfsISFoK+9B z6B;%k2ke1hIbaX+?);)LU=R8Rc#+1c35jNaO$cUyO-LmTu!){Hx4c!8y3A?kflUgQ z2R50HJ17rqvVV}H;b5K;tP9wbU|qnb1nUAeC0N0#hmu&$13-Alj^8B&b=|A;y5svJMp)k69To zfISwBvU$uoV~l39G87%+bFxSh)SO@>s5x0A32IIjiHY+PjRZ9>7zt`#qLHBHB^m^^ zAkj!r3xbiL79?64*n&iZpcZ*QRX~DT6pRG5$jZPNutipe3LvN@iAI825{v}3B+*Dv zOA-x&S{951wJaD3YFVO@pqB9sxT45ck0D^kTf`S3;sbD0irz|Lp0ei}VQUL_@OfVAEGr>qu&jceuJrfLq zdM>$jxf_g5wk)WPSZY8T;NNy!yF9a(Adm*`%fW2THYO7x+-g+HU3%yc851!JHhSzGA^@66|YM9t>cw1tY<}X60cF*lSjv zCc(ZDj0F2eFcRz=!AP)g1cP7?BsUW5fnX%q1Idj9dmy<%u!oWx3HDGh66~SmMuI(L z!KSP}O8npjOTBc2PaHZDQzY1Tfqx-@0eA0$tb0_#!o+tu|4Io9?%qKe^c=?L+>ePr zd3V%fKW6<2n|NIJH#7=cmCv6-d>mZ6F9i2mj{g&t&$U*Ce|wy^&;5HNXvF`ZeLAq< z`9sdXSi?g64`|P2q=TORnCKq*)_o=64{EFSGXkA9eUMtc?tX&Q&gBcLg=HJ1so_6n z3oeJ8)wRTl&w)C+hVQdkrxxZ700FNmNaVJP$TR?fDyvLdTn#R*iIH3gSnanQ+8^dFDWe=YAG&arO|GZ zXUKcx5%L;&fmB{4|1*7b5Zc;W*M82oIn(_+r~6F*Mi=wXCnnpty_mmkx1yHKUU#pe zi}13wT%R`Oy)fEpw!==NeH#AI4Lgx78td@qP$YYbD?4OVvwaq*_y%2CaNVnmvqqrfdoG}Px1F;f z<>uj%=3Qgitsw2@#eua(ccMlVWa69gHO>64adX)Sd^a-=XlC~;jDoD2N!Rv)Np~)< z8qMp##CJKO>KA9NAQ#`HOB96Z#+-vE;HMer0zpj&m{pBulyZig=+SqHiWbbk-U3Tg3&|QE3 z>zVRNcksjx2=M<7-|#{G4IQ2`xt&JT=)GGYTN5F_3*zhgn#sE?^+@!5eCjOi>V5Sfv5d;`A{%|isIx{lYi;&JNZ!w06IlaY0lriVqUIZ*x zndwEqa*MAS!%$u@4_IC>kH!S^faL{4P|(MmQ2{HU9n^uOr+^h6KJ7&`bNz_+tkJ@u zgpK#CX=6kFs985!$1N=Da{Wo|^jyw~PX$8`Um3B1|034aMmYA>HV3g)t0O zb^Kg`C4p51qkUC#1;&!VszYVQ@JPmVe2Rd1z{UilWsT*EjL}mbD_h18jLRYwuyMiY znUBjN70r}IYO5xsng%u@m)ikgPsfLM7)TRUGD8IXVqgJaJ3w; z$Aaa6JyvbO@TS-}dxW@T>$V6(Ef zqE&OUw<54P!HU45dqRYWj_&NBE65u zPee%f6n>J2icbGCJ_ZPYJ>yj%qA@-Oh=4ugW1#5O_?$gN0PMM7l=3-yh%sQ#*+WIa zJez?4*t}r0n|aw=L`>(WUQYMnh)9)#Lpp%4Ju5R8P{V4*MuY=ebT9)x-!7zy=4FcRv8U?kKF!64L2 z*&7M|0qRCT>eL5_VfK5_Vgvk+9oR4Z`k7H4=75FcNl0s*$ieQVqhs;|H%}Vc!Wx!oFjL zFb3=$3#&=kU8zRG?g~c2?n*Thc2}xF*ge5W*ge5W*gdI6!tSxK8vpC4eLmC(fb9!L z!tV2-#u%`DKGd3oJ&?VTum^&Xum{pf683, + ) -> Result, Status> { + let response = get_adresar_count(&self.db_pool, request.into_inner()).await?; + Ok(Response::new(response)) + } + + async fn get_adresar_by_position( + &self, + request: Request, + ) -> Result, Status> { + let response = get_adresar_by_position(&self.db_pool, request.into_inner()).await?; + Ok(Response::new(response)) + } } pub async fn run_server(db_pool: sqlx::PgPool) -> Result<(), Box> {