diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 11:44:54 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-10-24 12:02:00 +0200 |
commit | da8ebeea878bfd46b07e7027e7315a114289782e (patch) | |
tree | aa6f27fb580d8e2284f5f0f42d0e2ee05b015ebb | |
parent | 745d117949fbaf4fd065a114680cf79cafbf250a (diff) |
model: address: Add database interfacing code
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | service-person/src/model/address.rs | 72 |
1 files 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<Self> { + 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::<Address>(&conn) + .map_err(Error::from) + }) + } } |