summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-10-24 11:44:54 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-10-24 12:02:00 +0200
commitda8ebeea878bfd46b07e7027e7315a114289782e (patch)
treeaa6f27fb580d8e2284f5f0f42d0e2ee05b015ebb
parent745d117949fbaf4fd065a114680cf79cafbf250a (diff)
model: address: Add database interfacing code
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--service-person/src/model/address.rs72
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)
+ })
+ }
}