From 8014def1a8da3397d78d1162f9e1b8c3f22d0322 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 26 Dec 2020 10:51:46 +0530 Subject: add transactions and quantities - backend exposes endpoints to perform transactions - frontend introduces a new page to "checkout" cart --- backend/src/handlers/transaction.rs | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 backend/src/handlers/transaction.rs (limited to 'backend/src/handlers/transaction.rs') diff --git a/backend/src/handlers/transaction.rs b/backend/src/handlers/transaction.rs new file mode 100644 index 0000000..1e87312 --- /dev/null +++ b/backend/src/handlers/transaction.rs @@ -0,0 +1,74 @@ +use crate::models::{AddTransaction, CartItem, Customer, Product, Transaction}; +use crate::schema::cart_items::dsl::*; +use crate::schema::customer::dsl::*; +use crate::schema::product::dsl as prod; +use crate::schema::transaction::dsl::*; +use crate::TPool; + +use actix_identity::Identity; +use actix_web::{web, HttpResponse, Responder}; +use diesel::prelude::*; +use log::{error, info}; + +pub async fn checkout_cart( + pool: web::Data, + pmt_kind: String, + cookie: Identity, +) -> impl Responder { + let conn = pool.get().unwrap(); + info!("Checkout cart for user: {:?}", cookie.identity()); + 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 user_cart_items = cart_items + .filter(cart_id.eq(selected_user.id)) + .load::(&conn) + .expect("Couldn't connect to DB"); + let cart_total = user_cart_items.into_iter().fold(0., |acc, item| { + let item_price = prod::product + .filter(prod::id.eq(item.product_id)) + .limit(1) + .first::(&conn) + .unwrap() + .price; + acc + item.quantity.unwrap_or(1) as f32 * item_price + }); + let transaction_entry = AddTransaction { + customer_id: Some(selected_user.id), + amount: cart_total, + payment_type: pmt_kind, + }; + diesel::insert_into(transaction) + .values(transaction_entry) + .execute(&conn) + .expect("Coundn't connect to DB"); + return HttpResponse::Ok().body("Transaction performed successfully"); + } else { + return HttpResponse::Unauthorized().body("Login first"); + } +} + +pub async fn list_transactions( + pool: web::Data, + cookie: Identity, +) -> impl Responder { + 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 user_transactions = transaction + .filter(customer_id.eq(selected_user.id)) + .load::(&conn) + .expect("Couldn't connect to DB"); + return HttpResponse::Ok().json(&user_transactions); + } else { + return HttpResponse::Unauthorized() + .body("Need to be logged in to add to cart!"); + } +} -- cgit v1.2.3