diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 12:52:54 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 13:25:02 +0200 |
commit | 11a7121a0efca380ed98ee3d652860175298bcc6 (patch) | |
tree | d5904e0084c5f220774b1f9f1b63399a01d3e05d | |
parent | f72defcfa608d626d3bfcc1f536fc741db3455ed (diff) |
Implement create_person api endpoint
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | service-person/src/main.rs | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/service-person/src/main.rs b/service-person/src/main.rs index 60318ca..1350115 100644 --- a/service-person/src/main.rs +++ b/service-person/src/main.rs @@ -6,20 +6,45 @@ extern crate diesel_migrations; use std::str::FromStr; use anyhow::Context; -use actix_web::{web, App, HttpServer, HttpResponse, Result}; +use actix_web::{web, App, HttpServer, HttpResponse, Responder, Result}; mod db; mod model; mod schema; -use crate::model::*; use crate::db::DbPool; embed_migrations!("migrations"); -async fn create_person(db: web::Data<DbPool>, person: web::Json<Person>) -> Result<HttpResponse> { +#[derive(Debug, serde::Deserialize)] +pub struct PersonCreateRequestData { + name: String, + age: i32, + + country: String, + city: String, + street: String, + number: i32, +} + +async fn create_person(db: web::Data<DbPool>, person: web::Json<PersonCreateRequestData>) -> impl Responder { log::debug!("Creating person = {:?}", person); - Ok(HttpResponse::Ok().finish()) + + let inner = |db: &DbPool, person: &PersonCreateRequestData| { + let country = crate::model::Country::create_or_fetch(&db, &person.country)?; + let city = crate::model::City::create_or_fetch(&db, &person.city)?; + let street = crate::model::Street::create_or_fetch(&db, &person.street)?; + let address = crate::model::Address::create_or_fetch(&db, &country, &city, &street, person.number)?; + let person = crate::model::Person::create_or_fetch(&db, &address, &person.name, person.age)?; + Ok(()) + }; + + inner(&db, &person) + .map_err(|anyhow_error: anyhow::Error| { + log::error!("{}", anyhow_error); + HttpResponse::build(actix_web::http::StatusCode::INTERNAL_SERVER_ERROR).finish() + }) + .map(|_| HttpResponse::Ok().finish()) } |