From 2a112855e54ea3a365fa032e8726196a7eec9a06 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 16 Dec 2020 22:12:50 +0530 Subject: begin working on rating endpoints --- src/handlers/product.rs | 23 +++++++++---- src/handlers/rating.rs | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 src/handlers/rating.rs (limited to 'src/handlers') diff --git a/src/handlers/product.rs b/src/handlers/product.rs index 788efb3..21bdbc9 100644 --- a/src/handlers/product.rs +++ b/src/handlers/product.rs @@ -1,11 +1,11 @@ -use crate::models::{NewProduct, Product, UpdateProduct}; +use crate::models::{NewProduct, Product, Rating, UpdateProduct}; use crate::schema::product::dsl::*; +use crate::schema::rating::dsl as rating; use crate::TPool; use actix_web::{web, HttpResponse, Responder}; use diesel::prelude::*; use log::{error, info}; -use serde::Deserialize; pub async fn new_product( pool: web::Data, @@ -75,13 +75,24 @@ pub async fn get_all_products(pool: web::Data) -> impl Responder { let conn = pool.get().unwrap(); info!("Generating and returning catalog ..."); match product.load::(&conn) { - Ok(products) => { - return HttpResponse::Ok() - .body(serde_json::to_string(&products).unwrap()) - } + Ok(products) => return HttpResponse::Ok().json(&products), Err(_) => { return HttpResponse::InternalServerError() .body("Unable to fetch product catalog") } } } + +pub async fn get_product_reviews( + pool: web::Data, + product_id: web::Path, +) -> impl Responder { + let conn = pool.get().unwrap(); + info!("Fetching product reviews for {}", product_id); + let pid = product_id.into_inner(); + let rating_entries = rating::rating + .filter(rating::product_id.eq(pid)) + .load::(&conn) + .expect("Couldn't connect to DB"); + return HttpResponse::Ok().json(&rating_entries); +} diff --git a/src/handlers/rating.rs b/src/handlers/rating.rs new file mode 100644 index 0000000..309c2c6 --- /dev/null +++ b/src/handlers/rating.rs @@ -0,0 +1,90 @@ +use crate::models::{AddRating, Customer, Rating}; +use crate::schema::rating::dsl as rating; +use crate::schema::{customer::dsl::*, product::dsl::*}; +use crate::TPool; + +use actix_identity::Identity; +use actix_web::{web, HttpResponse, Responder}; +use diesel::prelude::*; +use log::{error, info}; +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub struct AddRatingJson { + pub comment_text: Option, + pub stars: Option, + pub product_id: i32, +} + +pub async fn add_rating( + cookie: Identity, + rating_details: web::Json, + pool: web::Data, +) -> impl Responder { + info!("Add rating hit: {:?}", rating_details.product_id); + let conn = pool.get().unwrap(); + if let Some(uname) = cookie.identity() { + let selected_user = customer + .filter(username.eq(&uname)) + .limit(1) + .first::(&conn) + .expect("Couldn't connect to DB"); + let rating_details = rating_details.into_inner(); + let new_rating = AddRating { + comment_text: rating_details.comment_text, + stars: rating_details.stars, + product_id: rating_details.product_id, + customer_id: selected_user.id, + }; + diesel::insert_into(rating::rating) + .values(new_rating) + .execute(&conn) + .expect("Coundn't connect to DB"); + HttpResponse::Ok().body("Inserted rating successfully!") + } else { + error!("Unauthorized add rating action!"); + return HttpResponse::Unauthorized() + .body("Need to be logged in to add rating!"); + } +} + +#[derive(Deserialize, Debug)] +pub struct RemoveRating { + rating_id: i32, +} + +pub async fn remove_rating( + cookie: Identity, + rating_details: web::Json, + pool: web::Data, +) -> impl Responder { + info!("Remove rating hit: {:?}", rating_details.rating_id); + let conn = pool.get().unwrap(); + if let Some(uname) = cookie.identity() { + let selected_user = customer + .filter(username.eq(&uname)) + .limit(1) + .first::(&conn) + .expect("Couldn't connect to DB"); + + diesel::delete( + rating::rating + .filter(rating::customer_id.eq(selected_user.id)) + .filter(rating::id.eq(rating_details.rating_id)), + ) + .execute(&conn) + .expect("Coundn't connect to DB"); + HttpResponse::Ok().body("Removed successfully!") + } else { + error!("Unauthorized add to cart action!"); + return HttpResponse::Unauthorized() + .body("Need to be logged in to add to cart!"); + } +} + +// pub async fn get_product_reviews( +// product: web::Json, +// pool: web::Data, +// ) -> impl Responder { +// unimplemented!() +// } -- cgit v1.2.3