From bf48f827f7da396bdce45eb78a4ef7834f0a34a3 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 24 Oct 2021 11:44:54 +0200 Subject: model: person: Add database interfacing code Signed-off-by: Matthias Beyer --- service-person/src/model/address.rs | 2 +- service-person/src/model/person.rs | 65 ++++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/service-person/src/model/address.rs b/service-person/src/model/address.rs index dcce3ce..8df5774 100644 --- a/service-person/src/model/address.rs +++ b/service-person/src/model/address.rs @@ -20,7 +20,7 @@ use crate::schema; #[belongs_to(Street)] #[table_name = "address"] pub struct Address { - id: i32, + pub(super) id: i32, country_id: i32, city_id: i32, diff --git a/service-person/src/model/person.rs b/service-person/src/model/person.rs index 338d6ff..90dff1f 100644 --- a/service-person/src/model/person.rs +++ b/service-person/src/model/person.rs @@ -1,9 +1,64 @@ use serde::Deserialize; -use crate::model::*; +use anyhow::Error; +use anyhow::Result; +use diesel::ExpressionMethods; +use diesel::RunQueryDsl; +use diesel::query_dsl::methods::FilterDsl; +use diesel::Connection; +use diesel::BoolExpressionMethods; -#[derive(Debug, Deserialize)] +use crate::db::DbPool; +use crate::model::Address; +use crate::schema::persons; +use crate::schema; + +#[derive(Debug, Deserialize, diesel::Associations, diesel::Queryable, getset::Getters, getset::CopyGetters)] +#[belongs_to(Address)] +#[table_name = "persons"] pub struct Person { - name: Name, - age: Age, - addr: Address, + id: i32, + + #[getset(get = "pub")] + name: String, + + #[getset(get_copy = "pub")] + age: i32, + address_id: i32, +} + +#[derive(Insertable)] +#[table_name = "persons"] +struct NewPerson<'a> { + name: &'a str, + age: i32, + address_id: i32, +} + + +impl Person { + pub fn create_or_fetch(db: &DbPool, addr: &Address, name: &str, age: i32) -> Result { + let conn = db.get()?; + + conn.transaction::<_, Error, _>(|| { + let new_person = NewPerson { + name, + age, + address_id: addr.id, + }; + + diesel::insert_into(schema::persons::table) + .values(&new_person) + .on_conflict_do_nothing() + .execute(&conn)?; + + schema::persons::table + .filter({ + schema::persons::name.eq(name) + .and(schema::persons::age.eq(age)) + .and(schema::persons::address_id.eq(addr.id)) + }) + .first::(&conn) + .map_err(Error::from) + }) + } } -- cgit v1.2.3