summaryrefslogtreecommitdiff
path: root/dichroism/src/handlers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dichroism/src/handlers.rs')
-rw-r--r--dichroism/src/handlers.rs131
1 files changed, 0 insertions, 131 deletions
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))
-}