get by count

This commit is contained in:
filipriec
2025-02-21 22:50:32 +01:00
parent 4a2b5d0c12
commit ddb799a80d
5 changed files with 50 additions and 4 deletions

View File

@@ -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 {

Binary file not shown.

View File

@@ -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<crate::proto::multieko2::adresar::PositionRequest>,
) -> Result<Response<UctovnictvoResponse>, 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<dyn std::error::Error>> {

View File

@@ -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;

View File

@@ -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<crate::proto::multieko2::uctovnictvo::UctovnictvoResponse, Status> {
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
}