summaryrefslogtreecommitdiffstats
path: root/src/db/models/image.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-11-05 13:43:50 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-11-05 14:47:57 +0100
commit9c6bbb86c562cb0a4b8a35f5aa2416afb2b03c37 (patch)
treefcd522348be7c9e6af1613ed29a5716e989fb02d /src/db/models/image.rs
parent700ef542d6cf874ad4cf80e0253fc8820962504b (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.rs26
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)
+ }
+}
+