summaryrefslogtreecommitdiff
path: root/dichroism/src
diff options
context:
space:
mode:
Diffstat (limited to 'dichroism/src')
-rw-r--r--dichroism/src/config.rs32
-rw-r--r--dichroism/src/constants.rs4
-rw-r--r--dichroism/src/dtos/mod.rs9
-rw-r--r--dichroism/src/dtos/photo_set_get.rs20
-rw-r--r--dichroism/src/dtos/product_get.rs32
-rw-r--r--dichroism/src/dtos/product_patch.rs31
-rw-r--r--dichroism/src/dtos/product_post.rs11
-rw-r--r--dichroism/src/error.rs25
-rw-r--r--dichroism/src/handlers.rs131
-rw-r--r--dichroism/src/image_service.rs76
-rw-r--r--dichroism/src/main.rs66
-rw-r--r--dichroism/src/models/dbid.rs4
-rw-r--r--dichroism/src/models/mod.rs7
-rw-r--r--dichroism/src/models/photo.rs10
-rw-r--r--dichroism/src/models/photo_set.rs10
-rw-r--r--dichroism/src/models/product.rs13
-rw-r--r--dichroism/src/repo/entities/mod.rs9
-rw-r--r--dichroism/src/repo/entities/photo_set.rs22
-rw-r--r--dichroism/src/repo/entities/photo_set_form.rs24
-rw-r--r--dichroism/src/repo/entities/product.rs39
-rw-r--r--dichroism/src/repo/entities/product_form.rs30
-rw-r--r--dichroism/src/repo/mod.rs7
-rw-r--r--dichroism/src/repo/photo_set_repo.rs44
-rw-r--r--dichroism/src/repo/product_repo.rs82
-rw-r--r--dichroism/src/result.rs1
-rw-r--r--dichroism/src/schema.rs29
-rw-r--r--dichroism/src/types.rs5
27 files changed, 0 insertions, 773 deletions
diff --git a/dichroism/src/config.rs b/dichroism/src/config.rs
deleted file mode 100644
index 2031ecc..0000000
--- a/dichroism/src/config.rs
+++ /dev/null
@@ -1,32 +0,0 @@
-use crate::constants::DEFAULT_CONFIG;
-use crate::result::Result;
-use once_cell::sync::Lazy;
-use serde::Deserialize;
-use std::env::var;
-use std::fs::File;
-use std::io::prelude::*;
-use std::net::SocketAddr;
-use toml::from_str;
-
-pub static CONFIG_INSTANCE: Lazy<Config> = Lazy::new(|| {
- Config::from_toml().unwrap_or_else(|e| {
- eprintln!("Error parsing config: {}", e.to_string());
- std::process::exit(1);
- })
-});
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Config {
- pub db_url: String,
- pub img_root: String,
- pub bind_addr: SocketAddr,
-}
-
-impl Config {
- pub fn from_toml() -> Result<Self> {
- let path = var("DICHROISM_CONFIG").unwrap_or_else(|_| String::from(DEFAULT_CONFIG));
- let mut config = String::new();
- File::open(path)?.read_to_string(&mut config)?;
- Ok(from_str(&config)?)
- }
-}
diff --git a/dichroism/src/constants.rs b/dichroism/src/constants.rs
deleted file mode 100644
index 72a8de9..0000000
--- a/dichroism/src/constants.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub const DEFAULT_CONFIG: &str = "./Dichroism.toml";
-pub const PHOTO_FULLSIZE_XY: u32 = 1000;
-pub const PHOTO_BASE_XY: u32 = 640;
-pub const PHOTO_THUMBNAIL_XY: u32 = 300;
diff --git a/dichroism/src/dtos/mod.rs b/dichroism/src/dtos/mod.rs
deleted file mode 100644
index a3e27e5..0000000
--- a/dichroism/src/dtos/mod.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-mod photo_set_get;
-mod product_get;
-mod product_patch;
-mod product_post;
-
-pub use photo_set_get::*;
-pub use product_get::*;
-pub use product_patch::*;
-pub use product_post::*;
diff --git a/dichroism/src/dtos/photo_set_get.rs b/dichroism/src/dtos/photo_set_get.rs
deleted file mode 100644
index b2e8d7b..0000000
--- a/dichroism/src/dtos/photo_set_get.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-use crate::models::PhotoSet;
-
-#[derive(Debug, Serialize)]
-pub struct PhotoSetGet {
- pub id: i32,
- pub fullsize: String,
- pub base: String,
- pub thumbnail: String,
-}
-
-impl From<PhotoSet> for PhotoSetGet {
- fn from(p: PhotoSet) -> Self {
- Self {
- id: p.id.unwrap_or(-1),
- fullsize: p.fullsize.id,
- base: p.base.id,
- thumbnail: p.thumbnail.id,
- }
- }
-}
diff --git a/dichroism/src/dtos/product_get.rs b/dichroism/src/dtos/product_get.rs
deleted file mode 100644
index aa52f19..0000000
--- a/dichroism/src/dtos/product_get.rs
+++ /dev/null
@@ -1,32 +0,0 @@
-use crate::models::Product;
-
-#[derive(Debug, Serialize)]
-pub struct ProductGet {
- pub id: i32,
- pub name: String,
- pub description: String,
- pub cents: i32,
- pub quantity: i32,
- pub featured: bool,
- pub photo_base: String,
- pub photo_fullsize: String,
- pub photo_thumbnail: String,
- pub category: String,
-}
-
-impl From<Product> for ProductGet {
- fn from(p: Product) -> Self {
- Self {
- id: p.id.unwrap_or(-1),
- name: p.name,
- description: p.description,
- cents: p.cents,
- quantity: p.quantity,
- featured: p.featured,
- category: p.category,
- photo_fullsize: p.photo_set.fullsize.id,
- photo_base: p.photo_set.base.id,
- photo_thumbnail: p.photo_set.thumbnail.id,
- }
- }
-}
diff --git a/dichroism/src/dtos/product_patch.rs b/dichroism/src/dtos/product_patch.rs
deleted file mode 100644
index f231469..0000000
--- a/dichroism/src/dtos/product_patch.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use crate::models::Product;
-
-#[derive(Debug, Deserialize)]
-pub struct ProductPatch {
- pub id: i32,
- pub name: Option<String>,
- pub quantity: Option<i32>,
- pub cents: Option<i32>,
- pub description: Option<String>,
- pub featured: Option<bool>,
- pub category_path: Option<String>,
- pub photo_set: Option<i32>,
-}
-
-impl ProductPatch {
- pub fn patch(self, product: &mut Product) {
- if let Some(name) = self.name {
- product.name = name;
- }
- if let Some(category) = self.category_path {
- product.category = category;
- }
- if let Some(description) = self.description {
- product.description = description;
- }
-
- product.quantity = self.quantity.unwrap_or(product.quantity);
- product.cents = self.cents.unwrap_or(product.cents);
- product.featured = self.featured.unwrap_or(product.featured);
- }
-}
diff --git a/dichroism/src/dtos/product_post.rs b/dichroism/src/dtos/product_post.rs
deleted file mode 100644
index c04b211..0000000
--- a/dichroism/src/dtos/product_post.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#[derive(Debug, Deserialize)]
-pub struct ProductPost {
- pub id: Option<i32>,
- pub name: String,
- pub quantity: i32,
- pub cents: i32,
- pub description: String,
- pub featured: bool,
- pub category_path: String,
- pub photo_set: i32,
-}
diff --git a/dichroism/src/error.rs b/dichroism/src/error.rs
deleted file mode 100644
index 0cdd269..0000000
--- a/dichroism/src/error.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-#[derive(Debug)]
-pub enum DichroismError {
- UriDataExtract(String),
- ImageWrite(String),
-}
-
-impl std::error::Error for DichroismError {}
-
-impl std::fmt::Display for DichroismError {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "{}", self)
- }
-}
-
-impl From<image::ImageError> for DichroismError {
- fn from(e: image::ImageError) -> Self {
- Self::ImageWrite(e.to_string())
- }
-}
-
-impl From<base64::DecodeError> for DichroismError {
- fn from(e: base64::DecodeError) -> Self {
- Self::UriDataExtract(e.to_string())
- }
-}
diff --git a/dichroism/src/handlers.rs b/dichroism/src/handlers.rs
deleted file mode 100644
index b9420af..0000000
--- a/dichroism/src/handlers.rs
+++ /dev/null
@@ -1,131 +0,0 @@
-use crate::dtos::*;
-use crate::image_service;
-use crate::models::Product;
-use crate::repo::{photo_set_repo, product_repo};
-use crate::types::DbPool;
-use actix_multipart::Multipart;
-use actix_web::{get, patch, post, web, Error, HttpResponse, Responder};
-use futures::{StreamExt, TryStreamExt};
-
-fn to_internal_error(e: impl std::error::Error) -> HttpResponse {
- HttpResponse::InternalServerError().body(e.to_string())
-}
-
-#[get("/")]
-async fn hello() -> impl Responder {
- HttpResponse::Ok().body("Hey, this is an API!")
-}
-
-#[get("/products")]
-async fn get_products(pool: web::Data<DbPool>) -> Result<HttpResponse, Error> {
- let conn = pool.get().map_err(to_internal_error)?;
- let products: Vec<ProductGet> = web::block(move || product_repo::find_all(&conn))
- .await
- .map_err(to_internal_error)?
- .into_iter()
- .map(|p| p.into())
- .collect();
- Ok(HttpResponse::Ok().json(products))
-}
-
-#[patch("/products")]
-async fn patch_product(
- pool: web::Data<DbPool>,
- web::Json(patch): web::Json<ProductPatch>,
-) -> Result<HttpResponse, Error> {
- let id = patch.id;
-
- // get product referenced by patch
- let conn = pool.get().map_err(to_internal_error)?;
- let mut product = web::block(move || product_repo::find(&conn, id))
- .await
- .map_err(to_internal_error)?
- .ok_or_else(|| HttpResponse::NotFound().finish())?;
-
- // get photo set referenced by patch
- if let Some(id) = patch.photo_set {
- let conn = pool.get().map_err(to_internal_error)?;
- let photo_set = web::block(move || photo_set_repo::find(&conn, id))
- .await
- .map_err(to_internal_error)?
- .ok_or_else(|| HttpResponse::NotFound().body("Photo set not found"))?;
- product.photo_set = photo_set;
- }
-
- // update product fields
- patch.patch(&mut product);
-
- // store the updated product
- let conn = pool.get().map_err(to_internal_error)?;
- let product = web::block(move || product_repo::store(&conn, product))
- .await
- .map_err(to_internal_error)?;
-
- Ok(HttpResponse::Ok().json(ProductGet::from(product)))
-}
-
-#[post("/products")]
-async fn post_product(
- pool: web::Data<DbPool>,
- web::Json(post): web::Json<ProductPost>,
-) -> Result<HttpResponse, Error> {
- // find associated photo set
- let photo_set = post.photo_set;
- let conn = pool.get().map_err(to_internal_error)?;
- let photo_set = web::block(move || photo_set_repo::find(&conn, photo_set))
- .await
- .map_err(to_internal_error)?
- .ok_or_else(|| HttpResponse::NotFound().body("Photo set not found."))?;
-
- // create new product
- let product = Product {
- id: None,
- name: post.name,
- quantity: post.quantity,
- cents: post.cents,
- description: post.description,
- featured: post.featured,
- category: post.category_path,
- photo_set,
- };
-
- // store product
- let conn = pool.get().map_err(to_internal_error)?;
- let product = web::block(move || product_repo::store(&conn, product))
- .await
- .map_err(to_internal_error)?;
-
- Ok(HttpResponse::Ok().json::<ProductGet>(product.into()))
-}
-
-#[post("/photos")]
-async fn post_photo(
- pool: web::Data<DbPool>,
- mut payload: Multipart,
-) -> Result<HttpResponse, Error> {
- let mut responses: Vec<PhotoSetGet> = Vec::new();
-
- while let Some(mut field) = payload
- .try_next()
- .await
- .map_err(|e| HttpResponse::BadRequest().body(e.to_string()))?
- {
- // grab all bytes
- let mut data: Vec<u8> = Vec::new();
- while let Some(chunk) = field.next().await {
- data.extend(chunk?);
- }
-
- // create new photo_set
- let photo_set = web::block(move || image_service::generate_photo_set(data))
- .await
- .map_err(to_internal_error)?;
- let conn = pool.get().map_err(to_internal_error)?;
- let photo_set = web::block(move || photo_set_repo::store(&conn, photo_set))
- .await
- .map_err(to_internal_error)?;
- responses.push(photo_set.into());
- }
-
- Ok(HttpResponse::Ok().json(responses))
-}
diff --git a/dichroism/src/image_service.rs b/dichroism/src/image_service.rs
deleted file mode 100644
index 0d2ed14..0000000
--- a/dichroism/src/image_service.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::config::CONFIG_INSTANCE;
-use crate::constants::{PHOTO_BASE_XY, PHOTO_FULLSIZE_XY, PHOTO_THUMBNAIL_XY};
-use crate::error::DichroismError;
-use crate::models::{Photo, PhotoSet};
-use exif::Reader;
-use image::imageops::FilterType;
-use image::DynamicImage;
-use image::GenericImageView;
-use std::io::{BufReader, Cursor};
-use std::path::PathBuf;
-use uuid::Uuid;
-
-pub fn generate_photo_set(data: Vec<u8>) -> Result<PhotoSet, DichroismError> {
- // load image data from bytes
- let mut original = image::load_from_memory(&data)?;
-
- // read EXIF tags to check for required rotation
- let exifreader = Reader::new();
- let mut reader = BufReader::new(Cursor::new(data));
- let exif = exifreader.read_from_container(&mut reader).unwrap();
- if let Some(orient) = exif
- .get_field(exif::Tag::Orientation, exif::In::PRIMARY)
- .map(|o| o.value.get_uint(0))
- .flatten()
- {
- // if a tag was present, rotate original image data as necessary
- match orient {
- 8 => original = original.rotate270(),
- 3 => original = original.rotate180(),
- 6 => original = original.rotate90(),
- _ => {}
- }
- }
-
- let fullsize = original.resize(PHOTO_FULLSIZE_XY, PHOTO_FULLSIZE_XY, FilterType::Lanczos3);
- let base = original.resize(PHOTO_BASE_XY, PHOTO_BASE_XY, FilterType::Lanczos3);
-
- let (width, height) = original.dimensions();
- let thumbnail = if width > height {
- let offset = (width - height) / 2;
- original.crop_imm(offset, 0, width - offset * 2, height)
- } else {
- let offset = (height - width) / 2;
- original.crop_imm(0, offset, width, height - offset * 2)
- }
- .resize(PHOTO_THUMBNAIL_XY, PHOTO_THUMBNAIL_XY, FilterType::Lanczos3);
-
- Ok(PhotoSet {
- id: None,
- original: generate_photo(&original)?,
- fullsize: generate_photo(&fullsize)?,
- base: generate_photo(&base)?,
- thumbnail: generate_photo(&thumbnail)?,
- })
-}
-
-fn generate_photo(image: &DynamicImage) -> Result<Photo, DichroismError> {
- let base_name = Uuid::new_v3(&Uuid::NAMESPACE_OID, &image.to_bytes())
- .to_hyphenated()
- .to_string();
- let mut path = PathBuf::from(&CONFIG_INSTANCE.img_root);
- path.push(base_name);
- path.set_extension("jpg");
- image.save(&path)?;
-
- let id = path
- .file_name()
- .ok_or_else(|| {
- DichroismError::ImageWrite("Error extracting filename from path".to_string())
- })?
- .to_str()
- .ok_or_else(|| {
- DichroismError::ImageWrite("Error converting filename to slice".to_string())
- })?;
- Ok(Photo::new(String::from(id)))
-}
diff --git a/dichroism/src/main.rs b/dichroism/src/main.rs
deleted file mode 100644
index 6c76f0a..0000000
--- a/dichroism/src/main.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-#[macro_use]
-extern crate serde;
-#[macro_use]
-extern crate diesel;
-
-use actix_cors::Cors;
-use actix_web::{middleware::Logger, App, HttpServer};
-use config::CONFIG_INSTANCE as CONFIG;
-use diesel::prelude::SqliteConnection;
-use diesel::r2d2::ConnectionManager;
-use diesel::r2d2::Pool;
-use listenfd::ListenFd;
-use result::Result;
-
-mod config;
-mod constants;
-mod dtos;
-mod error;
-mod handlers;
-mod image_service;
-mod models;
-mod repo;
-mod result;
-mod schema;
-mod types;
-
-#[actix_web::main]
-async fn main() -> Result<()> {
- // Init logging
- std::env::set_var("RUST_LOG", "actix_web=info");
- env_logger::init();
-
- // Init DB connection pool
- let manager = ConnectionManager::<SqliteConnection>::new(&CONFIG.db_url);
- let pool = Pool::builder().build(manager)?;
-
- // Init application server
- let mut server = HttpServer::new(move || {
- // Init CORS policy
- let cors = Cors::permissive();
-
- App::new()
- .data(pool.clone())
- .wrap(cors)
- .wrap(Logger::default())
- .service(handlers::hello)
- .service(handlers::get_products)
- .service(handlers::patch_product)
- .service(handlers::post_product)
- .service(handlers::post_photo)
- });
-
- // If using listenfd, bind to it instead of the configured address to allow for cargo watch
- // auto-reloading
- let mut listenfd = ListenFd::from_env();
- server = if let Some(l) = listenfd
- .take_tcp_listener(0)
- .expect("Unable to grab TCP listener!")
- {
- server.listen(l)?
- } else {
- server.bind(CONFIG.bind_addr)?
- };
-
- Ok(server.run().await?)
-}
diff --git a/dichroism/src/models/dbid.rs b/dichroism/src/models/dbid.rs
deleted file mode 100644
index 80eee58..0000000
--- a/dichroism/src/models/dbid.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub enum Dbid {
- Stored(i32),
- NotStored,
-}
diff --git a/dichroism/src/models/mod.rs b/dichroism/src/models/mod.rs
deleted file mode 100644
index 529a9bc..0000000
--- a/dichroism/src/models/mod.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-mod photo;
-mod photo_set;
-mod product;
-
-pub use photo::*;
-pub use photo_set::*;
-pub use product::*;
diff --git a/dichroism/src/models/photo.rs b/dichroism/src/models/photo.rs
deleted file mode 100644
index 086d387..0000000
--- a/dichroism/src/models/photo.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-#[derive(Debug, Clone)]
-pub struct Photo {
- pub id: String,
-}
-
-impl Photo {
- pub fn new(id: String) -> Self {
- Self { id }
- }
-}
diff --git a/dichroism/src/models/photo_set.rs b/dichroism/src/models/photo_set.rs
deleted file mode 100644
index f2c7677..0000000
--- a/dichroism/src/models/photo_set.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use super::Photo;
-
-#[derive(Debug, Clone)]
-pub struct PhotoSet {
- pub id: Option<i32>,
- pub original: Photo, // original, just for safe-keeping
- pub fullsize: Photo, // full-size, "zoomed" view
- pub base: Photo, // basic viewing
- pub thumbnail: Photo, // tiny, square thumbnail
-}
diff --git a/dichroism/src/models/product.rs b/dichroism/src/models/product.rs
deleted file mode 100644
index 4a3d782..0000000
--- a/dichroism/src/models/product.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use super::PhotoSet;
-
-#[derive(Debug, Clone)]
-pub struct Product {
- pub id: Option<i32>,
- pub name: String,
- pub description: String,
- pub cents: i32,
- pub quantity: i32,
- pub featured: bool,
- pub photo_set: PhotoSet,
- pub category: String,
-}
diff --git a/dichroism/src/repo/entities/mod.rs b/dichroism/src/repo/entities/mod.rs
deleted file mode 100644
index 288f1e3..0000000
--- a/dichroism/src/repo/entities/mod.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-mod photo_set;
-mod photo_set_form;
-mod product;
-mod product_form;
-
-pub use photo_set::*;
-pub use photo_set_form::*;
-pub use product::*;
-pub use product_form::*;
diff --git a/dichroism/src/repo/entities/photo_set.rs b/dichroism/src/repo/entities/photo_set.rs
deleted file mode 100644
index 6e48e12..0000000
--- a/dichroism/src/repo/entities/photo_set.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-use crate::models;
-
-#[derive(Debug, Clone, Queryable)]
-pub struct PhotoSet {
- pub id: i32,
- pub original: String,
- pub fullsize: String,
- pub base: String,
- pub thumbnail: String,
-}
-
-impl Into<models::PhotoSet> for PhotoSet {
- fn into(self) -> models::PhotoSet {
- models::PhotoSet {
- id: Some(self.id),
- original: models::Photo::new(self.original),
- fullsize: models::Photo::new(self.fullsize),
- base: models::Photo::new(self.base),
- thumbnail: models::Photo::new(self.thumbnail),
- }
- }
-}
diff --git a/dichroism/src/repo/entities/photo_set_form.rs b/dichroism/src/repo/entities/photo_set_form.rs
deleted file mode 100644
index 611c8f0..0000000
--- a/dichroism/src/repo/entities/photo_set_form.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-use crate::models::PhotoSet;
-use crate::schema::photo_sets;
-
-#[derive(Insertable, AsChangeset)]
-#[table_name = "photo_sets"]
-pub struct PhotoSetForm {
- pub id: i32,
- pub original: String,
- pub fullsize: String,
- pub base: String,
- pub thumbnail: String,
-}
-
-impl From<PhotoSet> for PhotoSetForm {
- fn from(p: PhotoSet) -> Self {
- Self {
- id: p.id.unwrap_or(-1),
- original: p.original.id,
- fullsize: p.fullsize.id,
- base: p.base.id,
- thumbnail: p.thumbnail.id,
- }
- }
-}
diff --git a/dichroism/src/repo/entities/product.rs b/dichroism/src/repo/entities/product.rs
deleted file mode 100644
index c89495a..0000000
--- a/dichroism/src/repo/entities/product.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-use crate::models;
-use crate::schema::products;
-
-#[derive(Debug, Clone, Identifiable, Queryable)]
-pub struct Product {
- pub id: i32,
- pub name: String,
- pub description: String,
- pub quantity: i32,
- pub cents: i32,
- pub featured: i32,
- pub category: String,
- pub photo_set_id: 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: Some(self.id),
- name: self.name,
- description: self.description,
- quantity: self.quantity,
- cents: self.cents,
- featured: self.featured != 0,
- category: self.category,
- photo_set: models::PhotoSet {
- id: Some(self.photo_set_id),
- original: models::Photo::new(self.original),
- fullsize: models::Photo::new(self.fullsize),
- base: models::Photo::new(self.base),
- thumbnail: models::Photo::new(self.thumbnail),
- },
- }
- }
-}
diff --git a/dichroism/src/repo/entities/product_form.rs b/dichroism/src/repo/entities/product_form.rs
deleted file mode 100644
index b3447eb..0000000
--- a/dichroism/src/repo/entities/product_form.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-use crate::models::*;
-use crate::schema::products;
-
-#[derive(Debug, Insertable, AsChangeset)]
-#[table_name = "products"]
-pub struct ProductForm {
- pub id: i32,
- pub name: String,
- pub description: String,
- pub quantity: i32,
- pub cents: i32,
- pub featured: i32,
- pub photo_set: i32,
- pub category: String,
-}
-
-impl From<Product> for ProductForm {
- fn from(p: Product) -> Self {
- Self {
- id: p.id.unwrap_or(-1),
- name: p.name,
- description: p.description,
- quantity: p.quantity,
- cents: p.cents,
- featured: p.featured as i32,
- photo_set: p.photo_set.id.unwrap_or(-1),
- category: p.category,
- }
- }
-}
diff --git a/dichroism/src/repo/mod.rs b/dichroism/src/repo/mod.rs
deleted file mode 100644
index 75a063c..0000000
--- a/dichroism/src/repo/mod.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use diesel::SqliteConnection;
-
-pub mod entities;
-pub mod photo_set_repo;
-pub mod product_repo;
-
-type DBConn = SqliteConnection;
diff --git a/dichroism/src/repo/photo_set_repo.rs b/dichroism/src/repo/photo_set_repo.rs
deleted file mode 100644
index 56ca962..0000000
--- a/dichroism/src/repo/photo_set_repo.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-use super::entities::*;
-use super::DBConn;
-use crate::models;
-use diesel::{insert_into, prelude::*, result::Error, update};
-
-pub fn store(conn: &DBConn, mut photo_set: models::PhotoSet) -> Result<models::PhotoSet, Error> {
- use crate::schema::photo_sets::dsl::*;
- if let Some(photo_set_id) = photo_set.id {
- // update
- let form = PhotoSetForm::from(photo_set.clone());
- update(photo_sets.filter(id.eq(photo_set_id)))
- .set(&form)
- .execute(conn)?;
- } else {
- // insert
- photo_set.id = Some(find_next_id(conn));
- let form = PhotoSetForm::from(photo_set.clone());
- insert_into(photo_sets).values(&form).execute(conn)?;
- }
- Ok(photo_set)
-}
-
-pub fn find(conn: &DBConn, dbid: i32) -> Result<Option<models::PhotoSet>, Error> {
- use crate::schema::photo_sets::dsl::*;
- let query = photo_sets
- .filter(id.eq(dbid))
- .select((id, original, fullsize, base, thumbnail));
- let photo_set = query.first::<PhotoSet>(conn).map(|p| p.into());
- match photo_set {
- Ok(p) => Ok(Some(p)),
- Err(Error::NotFound) => Ok(None),
- Err(e) => Err(e),
- }
-}
-
-fn find_next_id(conn: &DBConn) -> i32 {
- use crate::schema::photo_sets::dsl::*;
- let last_id = photo_sets
- .select(id)
- .order(id.desc())
- .first::<i32>(conn)
- .unwrap_or(0);
- last_id + 1
-}
diff --git a/dichroism/src/repo/product_repo.rs b/dichroism/src/repo/product_repo.rs
deleted file mode 100644
index 487f96e..0000000
--- a/dichroism/src/repo/product_repo.rs
+++ /dev/null
@@ -1,82 +0,0 @@
-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<models::Product, Error> {
- 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<Vec<models::Product>, 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::<Product>(conn)?
- .into_iter()
- .map(|p| p.into())
- .collect::<Vec<models::Product>>())
-}
-
-pub fn find(conn: &DBConn, dbid: i32) -> Result<Option<models::Product>, 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::<Product>(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::<i32>(conn)
- .unwrap_or(0);
- last_id + 1
-}
diff --git a/dichroism/src/result.rs b/dichroism/src/result.rs
deleted file mode 100644
index 708451d..0000000
--- a/dichroism/src/result.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
diff --git a/dichroism/src/schema.rs b/dichroism/src/schema.rs
deleted file mode 100644
index 2d9e14a..0000000
--- a/dichroism/src/schema.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-table! {
- photo_sets (id) {
- id -> Integer,
- base -> Text,
- fullsize -> Text,
- thumbnail -> Text,
- original -> Text,
- }
-}
-
-table! {
- products (id) {
- id -> Integer,
- photo_set -> Integer,
- cents -> Integer,
- quantity -> Integer,
- name -> Text,
- description -> Text,
- featured -> Integer,
- category -> Text,
- }
-}
-
-joinable!(products -> photo_sets (photo_set));
-
-allow_tables_to_appear_in_same_query!(
- photo_sets,
- products,
-);
diff --git a/dichroism/src/types.rs b/dichroism/src/types.rs
deleted file mode 100644
index 91aef95..0000000
--- a/dichroism/src/types.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use diesel::r2d2::ConnectionManager;
-use diesel::r2d2::Pool;
-use diesel::SqliteConnection;
-
-pub type DbPool = Pool<ConnectionManager<SqliteConnection>>;