diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 13:24:00 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 13:25:02 +0200 |
commit | 1a835554bcb1ef327458b0fb318abbcdb9c9cf0a (patch) | |
tree | 954d6c22a9434ff116cf91caf432e187ec254568 | |
parent | fc77074cb4ba232981af3edc9684a05bdb68c75b (diff) |
Add implementation for fetching a person
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | service-person/src/main.rs | 40 | ||||
-rw-r--r-- | service-person/src/model/person.rs | 9 |
2 files changed, 49 insertions, 0 deletions
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<DbPool>, person: web::Json<PersonCreateRequ } +async fn fetch_person(db: web::Data<DbPool>, person: web::Json<PersonByIdData>) -> Result<HttpResponse> { + log::debug!("Fetching person = {:?}", person); + + let inner = |db: &DbPool, person: &PersonByIdData| -> anyhow::Result<Option<PersonByIdResponse>> { + 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::<Address>(&db.get()?) .map_err(Error::from) } + + pub fn fetch_by_id(db: &DbPool, id: i32) -> Result<Option<Self>> { + use diesel::QueryDsl; + use diesel::OptionalExtension; + schema::persons::dsl::persons.find(id) + .first::<Self>(&db.get()?) + .optional() + .map_err(Error::from) + } } |