From 00c71f6baff136a88805ca2e3f9ef72453ac9f35 Mon Sep 17 00:00:00 2001
From: "Adam T. Carpenter" <atc@53hor.net>
Date: Fri, 23 Oct 2020 08:10:13 -0400
Subject: moved entities under repo; photos now hold onto just the filename

---
 dichroism/src/repo/entities/mod.rs | 36 ++++++++++++++++++++++++++++++++++++
 dichroism/src/repo/mod.rs          | 28 ++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 dichroism/src/repo/entities/mod.rs
 create mode 100644 dichroism/src/repo/mod.rs

(limited to 'dichroism/src/repo')

diff --git a/dichroism/src/repo/entities/mod.rs b/dichroism/src/repo/entities/mod.rs
new file mode 100644
index 0000000..2cff899
--- /dev/null
+++ b/dichroism/src/repo/entities/mod.rs
@@ -0,0 +1,36 @@
+use crate::models;
+use crate::schema::products;
+
+#[derive(Debug, Clone, Identifiable, Queryable, Serialize)]
+pub struct Product {
+    pub id: i32,
+    pub name: String,
+    pub description: String,
+    pub quantity: i32,
+    pub cents: i32,
+    pub featured: i32,
+    pub original: String,
+    pub fullsize: String,
+    pub base: String,
+    pub thumbnail: String,
+}
+
+impl Into<models::Product> for Product {
+    fn into(self) -> models::Product {
+        models::Product {
+            id: self.id as u32,
+            name: self.name,
+            description: self.description,
+            quantity: self.quantity as u32,
+            cents: self.cents as u32,
+            featured: self.featured != 0, // TODO: is this safe?
+            category: String::new(),      // TODO: real category
+            photo_set: models::PhotoSet::from_photos(
+                models::Photo::from_filename(self.original),
+                models::Photo::from_filename(self.fullsize),
+                models::Photo::from_filename(self.base),
+                models::Photo::from_filename(self.thumbnail),
+            ),
+        }
+    }
+}
diff --git a/dichroism/src/repo/mod.rs b/dichroism/src/repo/mod.rs
new file mode 100644
index 0000000..0df8aad
--- /dev/null
+++ b/dichroism/src/repo/mod.rs
@@ -0,0 +1,28 @@
+use crate::models;
+use crate::schema::*;
+use diesel::prelude::*;
+use diesel::result::Error;
+
+mod entities;
+
+type DBConn = SqliteConnection;
+
+pub fn read_products(conn: &DBConn) -> Result<Vec<models::Product>, Error> {
+    let query = products::table.inner_join(photo_sets::table).select((
+        products::id,
+        products::name,
+        products::description,
+        products::quantity,
+        products::cents,
+        products::featured,
+        photo_sets::original,
+        photo_sets::fullsize,
+        photo_sets::base,
+        photo_sets::thumbnail,
+    ));
+    Ok(query
+        .load::<entities::Product>(conn)?
+        .into_iter()
+        .map(|p| p.into())
+        .collect::<Vec<models::Product>>())
+}
-- 
cgit v1.2.3