summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--service-person/src/main.rs33
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())
}