diff options
-rw-r--r-- | service-person/src/model/street.rs | 45 |
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) + }) + } +} |