From 1a835554bcb1ef327458b0fb318abbcdb9c9cf0a Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 24 Oct 2021 13:24:00 +0200 Subject: Add implementation for fetching a person Signed-off-by: Matthias Beyer --- service-person/src/main.rs | 40 ++++++++++++++++++++++++++++++++++++++ service-person/src/model/person.rs | 9 +++++++++ 2 files changed, 49 insertions(+) diff --git a/service-person/src/main.rs b/service-person/src/main.rs index 75964b0..64b9551 100644 --- a/service-person/src/main.rs +++ b/service-person/src/main.rs @@ -38,6 +38,45 @@ async fn create_person(db: web::Data, person: web::Json, person: web::Json) -> Result { + log::debug!("Fetching person = {:?}", person); + + let inner = |db: &DbPool, person: &PersonByIdData| -> anyhow::Result> { + let person = match crate::model::Person::fetch_by_id(&db, person.id)? { + Some(p) => p, + None => return Ok(None), + }; + + let address = person.address(&db)?; + let street = address.street(&db)?; + let city = address.city(&db)?; + let country = address.country(&db)?; + + Ok(Some({ + PersonByIdResponse { + name: person.name().clone(), + age: person.age(), + + country: country.name().clone(), + city: city.name().clone(), + street: street.name().clone(), + number: address.addr_number() + } + })) + }; + + match inner(&db, &person) + .map_err(|anyhow_error: anyhow::Error| { + log::error!("{}", anyhow_error); + HttpResponse::build(actix_web::http::StatusCode::INTERNAL_SERVER_ERROR).finish() + })? + { + None => Ok(HttpResponse::build(actix_web::http::StatusCode::NOT_FOUND).finish()), + Some(resp) => Ok(HttpResponse::Ok().json(resp)) + } +} + + #[actix_web::main] async fn main() -> anyhow::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); @@ -59,6 +98,7 @@ async fn main() -> anyhow::Result<()> { App::new() .data(db_connection_pool.clone()) .route("/create", web::post().to(create_person)) + .route("/fetch", web::post().to(fetch_person)) }) .bind(format!("{}:{}", bind, port))? .run() diff --git a/service-person/src/model/person.rs b/service-person/src/model/person.rs index 0a1d5c5..6482714 100644 --- a/service-person/src/model/person.rs +++ b/service-person/src/model/person.rs @@ -68,4 +68,13 @@ impl Person { .first::
(&db.get()?) .map_err(Error::from) } + + pub fn fetch_by_id(db: &DbPool, id: i32) -> Result> { + use diesel::QueryDsl; + use diesel::OptionalExtension; + schema::persons::dsl::persons.find(id) + .first::(&db.get()?) + .optional() + .map_err(Error::from) + } } -- cgit v1.2.3