summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-10-24 12:52:54 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-10-24 13:25:02 +0200
commit11a7121a0efca380ed98ee3d652860175298bcc6 (patch)
treed5904e0084c5f220774b1f9f1b63399a01d3e05d
parentf72defcfa608d626d3bfcc1f536fc741db3455ed (diff)
Implement create_person api endpoint
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-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())
}