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:14:05 +0200
commitbf48f827f7da396bdce45eb78a4ef7834f0a34a3 (patch)
tree67c73445f1c4b39408899b312d7493c101bdbc00
parent37ba57833b789573b9ae473ab281fa97022838de (diff)
model: person: Add database interfacing code
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--service-person/src/model/address.rs2
-rw-r--r--service-person/src/model/person.rs65
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<Self> {
+ 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::<Person>(&conn)
+ .map_err(Error::from)
+ })
+ }
}