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