use super::entities::*; use super::DBConn; use crate::models; use diesel::{insert_into, prelude::*, result::Error, update}; pub fn store(conn: &DBConn, mut photo_set: models::PhotoSet) -> Result { use crate::schema::photo_sets::dsl::*; if photo_set.id.is_some() { // update let form = PhotoSetForm::from(photo_set.clone()); update(photo_sets).set(&form).execute(conn)?; } else { // insert photo_set.id = Some(find_next_id(conn)?); let form = PhotoSetForm::from(photo_set.clone()); insert_into(photo_sets).values(&form).execute(conn)?; } Ok(photo_set) } pub fn find(conn: &DBConn, dbid: i32) -> Result, Error> { use crate::schema::photo_sets::dsl::*; let query = photo_sets .filter(id.eq(dbid)) .select((id, original, fullsize, base, thumbnail)); let photo_set = query.first::(conn).map(|p| p.into()); match photo_set { Ok(p) => Ok(Some(p)), Err(e) => { if e == Error::NotFound { Ok(None) } else { Err(e) } } } } fn find_next_id(conn: &DBConn) -> Result { use crate::schema::photo_sets::dsl::*; Ok(photo_sets.select(id).order(id.desc()).first::(conn)? + 1) }