use super::entities::*; use super::DBConn; use crate::models; use diesel::{insert_into, prelude::*, result::Error, update}; pub fn store(conn: &DBConn, mut product: models::Product) -> Result { use crate::schema::products::dsl::*; if let Some(product_id) = product.id { // update let form = ProductForm::from(product.clone()); update(products.filter(id.eq(product_id))) .set(&form) .execute(conn)?; } else { // insert product.id = Some(find_next_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, products::category, 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, dbid: i32) -> Result, Error> { use crate::schema::*; let query = products::table .inner_join(photo_sets::table) .filter(products::id.eq(dbid)) .select(( products::id, products::name, products::description, products::quantity, products::cents, products::featured, products::category, 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(Error::NotFound) => Ok(None), Err(e) => Err(e), } } fn find_next_id(conn: &DBConn) -> i32 { use crate::schema::products::dsl::*; let last_id = products .select(id) .order(id.desc()) .first::(conn) .unwrap_or(0); last_id + 1 }