diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-11-05 13:43:50 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-11-05 14:47:57 +0100 |
commit | 9c6bbb86c562cb0a4b8a35f5aa2416afb2b03c37 (patch) | |
tree | fcd522348be7c9e6af1613ed29a5716e989fb02d /src/db/models/image.rs | |
parent | 700ef542d6cf874ad4cf80e0253fc8820962504b (diff) |
Move create-or-fetch logic into functions on model types
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/db/models/image.rs')
-rw-r--r-- | src/db/models/image.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/db/models/image.rs b/src/db/models/image.rs index bb050c3..32623d5 100644 --- a/src/db/models/image.rs +++ b/src/db/models/image.rs @@ -1,3 +1,11 @@ +use std::ops::Deref; + +use anyhow::Error; +use anyhow::Result; +use diesel::PgConnection; +use diesel::prelude::*; + +use crate::schema::images::*; use crate::schema::images; #[derive(Queryable)] @@ -8,7 +16,23 @@ pub struct Image { #[derive(Insertable)] #[table_name="images"] -pub struct NewImage<'a> { +struct NewImage<'a> { pub name: &'a str, } +impl Image { + pub fn create_or_fetch(database_connection: &PgConnection, image_name: &str) -> Result<Image> { + let new_image = NewImage { name: image_name }; + + diesel::insert_into(images::table) + .values(&new_image) + .on_conflict_do_nothing() + .execute(database_connection)?; + + dsl::images + .filter(name.eq(image_name)) + .first::<Image>(database_connection) + .map_err(Error::from) + } +} + |