use crate::models; use diesel::insert_into; use diesel::prelude::*; use diesel::result::Error; use diesel::update; use entities::*; pub mod entities; type DBConn = SqliteConnection; pub fn store_photo_set( 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_photo_set_id(conn)?); let form = PhotoSetForm::from(photo_set.clone()); insert_into(photo_sets).values(&form).execute(conn)?; } Ok(photo_set) } pub fn store_product( conn: &DBConn, mut product: models::Product, ) -> Result { use crate::schema::products::dsl::*; if product.id.is_some() { // update let form = ProductForm::from(product.clone()); update(products).set(&form).execute(conn)?; } else { // insert product.id = Some(find_next_product_id(conn)?); let form = ProductForm::from(product.clone()); insert_into(products).values(&form).execute(conn)?; } Ok(product) } pub fn find_all(conn: &DBConn) -> Result, Error> { use crate::schema::*; let query = products::table.inner_join(photo_sets::table).select(( products::id, products::name, products::description, products::quantity, products::cents, products::featured, photo_sets::id, photo_sets::original, photo_sets::fullsize, photo_sets::base, photo_sets::thumbnail, )); Ok(query .load::(conn)? .into_iter() .map(|p| p.into()) .collect::>()) } pub fn find(conn: &DBConn, id: i32) -> Result, Error> { use crate::schema::*; let query = products::table .inner_join(photo_sets::table) .filter(products::id.eq(id)) .select(( products::id, products::name, products::description, products::quantity, products::cents, products::featured, photo_sets::id, photo_sets::original, photo_sets::fullsize, photo_sets::base, photo_sets::thumbnail, )); let product = query.first::(conn).map(|p| p.into()); match product { Ok(p) => Ok(Some(p)), Err(e) => { if e == Error::NotFound { Ok(None) } else { Err(e) } } } } fn find_next_product_id(conn: &DBConn) -> Result { use crate::schema::products::dsl::*; Ok(products.select(id).order(id.desc()).first::(conn)? + 1) } fn find_next_photo_set_id(conn: &DBConn) -> Result { use crate::schema::photo_sets::dsl::*; Ok(photo_sets.select(id).order(id.desc()).first::(conn)? + 1) }