From dcc96d0b349583e5d6a0f25ae1f7a3ffa3769788 Mon Sep 17 00:00:00 2001 From: "Adam T. Carpenter" Date: Mon, 2 Nov 2020 20:36:18 -0500 Subject: swapped json payload url encoded images for multipart form data --- dichroism/src/repo/product_repo.rs | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 dichroism/src/repo/product_repo.rs (limited to 'dichroism/src/repo/product_repo.rs') diff --git a/dichroism/src/repo/product_repo.rs b/dichroism/src/repo/product_repo.rs new file mode 100644 index 0000000..7b3aaac --- /dev/null +++ b/dichroism/src/repo/product_repo.rs @@ -0,0 +1,78 @@ +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 product.id.is_some() { + // update + let form = ProductForm::from(product.clone()); + update(products).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, + 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, + 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_id(conn: &DBConn) -> Result { + use crate::schema::products::dsl::*; + Ok(products.select(id).order(id.desc()).first::(conn)? + 1) +} -- cgit v1.2.3