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
commit7a9b14189703c4d1f7d5ba67615609a2e08fffab (patch)
tree4edc05bca00b1849183bb021da99ba8d39106e8d
parent2bdb5753e9b56ec3d5f26e54c62e5133548796bf (diff)
model: streets: Add database interfacing code
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--service-person/src/model/street.rs45
1 files changed, 43 insertions, 2 deletions
diff --git a/service-person/src/model/street.rs b/service-person/src/model/street.rs
index 3b132fa..1c78f4b 100644
--- a/service-person/src/model/street.rs
+++ b/service-person/src/model/street.rs
@@ -1,5 +1,46 @@
use serde::Deserialize;
+use anyhow::Error;
+use anyhow::Result;
-#[derive(Debug, Deserialize)]
-pub struct Street(String);
+use diesel::ExpressionMethods;
+use diesel::RunQueryDsl;
+use diesel::query_dsl::methods::FilterDsl;
+use diesel::Connection;
+use crate::db::DbPool;
+use crate::schema::streets;
+
+#[derive(Debug, Deserialize, diesel::Queryable, getset::Getters)]
+pub struct Street {
+ id: i32,
+
+ #[getset(get = "pub")]
+ name: String,
+}
+
+#[derive(Insertable)]
+#[table_name = "streets"]
+struct NewStreet<'a> {
+ name: &'a str
+}
+
+impl Street {
+ pub fn create_or_fetch(db: &DbPool, name: &str) -> Result<Self> {
+ use crate::schema;
+
+ let conn = db.get()?;
+
+ conn.transaction::<_, Error, _>(|| {
+ let new_street = NewStreet { name };
+ diesel::insert_into(schema::streets::table)
+ .values(&new_street)
+ .on_conflict_do_nothing()
+ .execute(&conn)?;
+
+ schema::streets::table
+ .filter(schema::streets::name.eq(name))
+ .first::<Street>(&conn)
+ .map_err(Error::from)
+ })
+ }
+}