From 7a9b14189703c4d1f7d5ba67615609a2e08fffab Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 24 Oct 2021 11:44:54 +0200 Subject: model: streets: Add database interfacing code Signed-off-by: Matthias Beyer --- service-person/src/model/street.rs | 45 ++++++++++++++++++++++++++++++++++++-- 1 file 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 { + 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::(&conn) + .map_err(Error::from) + }) + } +} -- cgit v1.2.3