summaryrefslogtreecommitdiff
path: root/dichroism/src/repo/product_repo.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dichroism/src/repo/product_repo.rs')
-rw-r--r--dichroism/src/repo/product_repo.rs60
1 files changed, 29 insertions, 31 deletions
diff --git a/dichroism/src/repo/product_repo.rs b/dichroism/src/repo/product_repo.rs
index d7dff65..487f96e 100644
--- a/dichroism/src/repo/product_repo.rs
+++ b/dichroism/src/repo/product_repo.rs
@@ -5,13 +5,15 @@ use diesel::{insert_into, prelude::*, result::Error, update};
pub fn store(conn: &DBConn, mut product: models::Product) -> Result<models::Product, Error> {
use crate::schema::products::dsl::*;
- if product.id.is_some() {
+ if let Some(product_id) = product.id {
// update
let form = ProductForm::from(product.clone());
- update(products).set(&form).execute(conn)?;
+ update(products.filter(id.eq(product_id)))
+ .set(&form)
+ .execute(conn)?;
} else {
// insert
- product.id = Some(find_next_id(conn)?);
+ product.id = Some(find_next_id(conn));
let form = ProductForm::from(product.clone());
insert_into(products).values(&form).execute(conn)?;
}
@@ -21,23 +23,20 @@ pub fn store(conn: &DBConn, mut product: models::Product) -> Result<models::Prod
pub fn find_all(conn: &DBConn) -> Result<Vec<models::Product>, Error> {
use crate::schema::*;
- let query = products::table
- .inner_join(photo_sets::table)
- .inner_join(categories::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,
- categories::path,
- ));
+ 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::<Product>(conn)?
.into_iter()
@@ -49,7 +48,6 @@ pub fn find(conn: &DBConn, dbid: i32) -> Result<Option<models::Product>, Error>
use crate::schema::*;
let query = products::table
.inner_join(photo_sets::table)
- .inner_join(categories::table)
.filter(products::id.eq(dbid))
.select((
products::id,
@@ -58,27 +56,27 @@ pub fn find(conn: &DBConn, dbid: i32) -> Result<Option<models::Product>, Error>
products::quantity,
products::cents,
products::featured,
+ products::category,
photo_sets::id,
photo_sets::original,
photo_sets::fullsize,
photo_sets::base,
photo_sets::thumbnail,
- categories::path,
));
let product = query.first::<Product>(conn).map(|p| p.into());
match product {
Ok(p) => Ok(Some(p)),
- Err(e) => {
- if e == Error::NotFound {
- Ok(None)
- } else {
- Err(e)
- }
- }
+ Err(Error::NotFound) => Ok(None),
+ Err(e) => Err(e),
}
}
-fn find_next_id(conn: &DBConn) -> Result<i32, Error> {
+fn find_next_id(conn: &DBConn) -> i32 {
use crate::schema::products::dsl::*;
- Ok(products.select(id).order(id.desc()).first::<i32>(conn)? + 1)
+ let last_id = products
+ .select(id)
+ .order(id.desc())
+ .first::<i32>(conn)
+ .unwrap_or(0);
+ last_id + 1
}