From da8ebeea878bfd46b07e7027e7315a114289782e Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 24 Oct 2021 11:44:54 +0200 Subject: model: address: Add database interfacing code Signed-off-by: Matthias Beyer --- service-person/src/model/address.rs | 72 +++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/service-person/src/model/address.rs b/service-person/src/model/address.rs index d09240d..707545f 100644 --- a/service-person/src/model/address.rs +++ b/service-person/src/model/address.rs @@ -1,11 +1,71 @@ use serde::Deserialize; +use anyhow::Error; +use anyhow::Result; +use diesel::ExpressionMethods; +use diesel::RunQueryDsl; +use diesel::query_dsl::methods::FilterDsl; +use diesel::Connection; +use diesel::BoolExpressionMethods; -use crate::model::*; +use crate::db::DbPool; +use crate::model::City; +use crate::model::Country; +use crate::model::Street; +use crate::schema::address; -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, diesel::Associations, diesel::Queryable, getset::CopyGetters)] +#[belongs_to(Country)] +#[belongs_to(City)] +#[belongs_to(Street)] +#[table_name = "address"] pub struct Address { - country: Country, - city: City, - street: Street, - number: usize, + id: i32, + + country_id: i32, + city_id: i32, + street_id: i32, + + #[getset(get_copy = "pub")] + addr_number: i32, +} + +#[derive(Insertable)] +#[table_name = "address"] +struct NewAddress { + country_id: i32, + city_id: i32, + street_id: i32, + addr_number: i32, +} + +impl Address { + pub fn create_or_fetch(db: &DbPool, country: &Country, city: &City, street: &Street, number: i32) -> Result { + use crate::schema; + + let conn = db.get()?; + + conn.transaction::<_, Error, _>(|| { + let new_address = NewAddress { + country_id: country.id, + city_id: city.id, + street_id: street.id, + addr_number: number, + }; + + diesel::insert_into(schema::address::table) + .values(&new_address) + .on_conflict_do_nothing() + .execute(&conn)?; + + schema::address::table + .filter({ + schema::address::country_id.eq(country.id) + .and(schema::address::city_id.eq(city.id)) + .and(schema::address::street_id.eq(street.id)) + .and(schema::address::addr_number.eq(number)) + }) + .first::
(&conn) + .map_err(Error::from) + }) + } } -- cgit v1.2.3