diff --git a/src/model.rs b/src/model.rs index 1150624..3069c5b 100644 --- a/src/model.rs +++ b/src/model.rs @@ -77,6 +77,12 @@ pub struct ClerkMonthsQuery { pub months: i32, } +#[derive(Deserialize)] +pub struct PersonQuery { + pub firstname: Option, + pub lastname: Option, +} + #[derive(Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct BookingBody { diff --git a/src/routes/persons.rs b/src/routes/persons.rs index 0cf0f8d..f1bf0d5 100644 --- a/src/routes/persons.rs +++ b/src/routes/persons.rs @@ -1,7 +1,15 @@ -use axum::{Router, routing::BoxRoute, extract::{Path, Extension}, response::IntoResponse, Json, handler::{get, post}}; +use axum::{Router, routing::BoxRoute, extract::{Path, Extension, Query}, response::IntoResponse, Json, handler::get}; use hyper::StatusCode; -use crate::{Service, error::ServiceError, model::{PersonBody, Person}}; +use crate::{Service, error::ServiceError, model::{PersonBody, Person, PersonQuery}}; + +async fn persons( + Query(query): Query, + Extension(service): Extension, +) -> Result { + let persons = service.get_persons(query).await?; + Ok(Json(persons)) +} async fn person( Path(id): Path, @@ -29,7 +37,7 @@ async fn add_person( pub fn routes() -> Router { Router::new() - .route("/", post(add_person)) + .route("/", get(persons).post(add_person)) .route("/:id", get(person)) .boxed() } \ No newline at end of file diff --git a/src/sql/persons.rs b/src/sql/persons.rs index 4ceb9e8..89f24b3 100644 --- a/src/sql/persons.rs +++ b/src/sql/persons.rs @@ -1,9 +1,41 @@ use hyper::StatusCode; use sibyl::Row; -use crate::{ServiceInner, error::ServiceError, model::{PersonBody, Person, Address}}; +use crate::{ServiceInner, error::ServiceError, model::{PersonBody, Person, Address, PersonQuery}}; impl ServiceInner { + + pub async fn get_persons(&self, filter: PersonQuery) -> Result, ServiceError> { + let session = self.pool.get_session().await?; + let stmt = session.prepare(" + SELECT + p.personId, + p.name, + p.lastName, + p.age, + ad.street, + ad.houseNumber, + ad.postalCode, + ad.city, + ad.country + FROM Person p + INNER JOIN Address ad ON p.addressId = ad.addressId + WHERE p.name LIKE :FIRST AND p.lastName LIKE :LAST + ").await?; + + let rows = stmt.query(( + (":FIRST", format!("%{}%", filter.firstname.unwrap_or_default())), + (":LAST", format!("%{}%", filter.lastname.unwrap_or_default())) + )).await?; + + let mut persons: Vec = vec![]; + + while let Some(row) = rows.next().await? { + persons.push(Self::map_person_row(row, 0)?); + } + + Ok(persons) + } pub async fn get_person(&self, id: i32) -> Result, ServiceError> { let session = self.pool.get_session().await?;