From 11a7121a0efca380ed98ee3d652860175298bcc6 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 24 Oct 2021 12:52:54 +0200 Subject: Implement create_person api endpoint Signed-off-by: Matthias Beyer --- service-person/src/main.rs | 33 +++++++++++++++++++++++++++++---- 1 file 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, person: web::Json) -> Result { +#[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, person: web::Json) -> 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()) } -- cgit v1.2.3