aboutsummaryrefslogtreecommitdiff
path: root/backend/src/handlers/transaction.rs
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-12-26 05:21:46 +0000
committerAkshay <[email protected]>2020-12-26 05:21:46 +0000
commit8014def1a8da3397d78d1162f9e1b8c3f22d0322 (patch)
tree346e1de0ac6aa4ca973c1b3e5897c2c44948e5a8 /backend/src/handlers/transaction.rs
parent7c6006e1abc6094b5922ab69ccfa5449b8dbbc99 (diff)
add transactions and quantities
- backend exposes endpoints to perform transactions - frontend introduces a new page to "checkout" cart
Diffstat (limited to 'backend/src/handlers/transaction.rs')
-rw-r--r--backend/src/handlers/transaction.rs74
1 files changed, 74 insertions, 0 deletions
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 @@
1use crate::models::{AddTransaction, CartItem, Customer, Product, Transaction};
2use crate::schema::cart_items::dsl::*;
3use crate::schema::customer::dsl::*;
4use crate::schema::product::dsl as prod;
5use crate::schema::transaction::dsl::*;
6use crate::TPool;
7
8use actix_identity::Identity;
9use actix_web::{web, HttpResponse, Responder};
10use diesel::prelude::*;
11use log::{error, info};
12
13pub async fn checkout_cart(
14 pool: web::Data<TPool>,
15 pmt_kind: String,
16 cookie: Identity,
17) -> impl Responder {
18 let conn = pool.get().unwrap();
19 info!("Checkout cart for user: {:?}", cookie.identity());
20 if let Some(uname) = cookie.identity() {
21 let selected_user = customer
22 .filter(username.eq(&uname))
23 .limit(1)
24 .first::<Customer>(&conn)
25 .expect("Couldn't connect to DB");
26 let user_cart_items = cart_items
27 .filter(cart_id.eq(selected_user.id))
28 .load::<CartItem>(&conn)
29 .expect("Couldn't connect to DB");
30 let cart_total = user_cart_items.into_iter().fold(0., |acc, item| {
31 let item_price = prod::product
32 .filter(prod::id.eq(item.product_id))
33 .limit(1)
34 .first::<Product>(&conn)
35 .unwrap()
36 .price;
37 acc + item.quantity.unwrap_or(1) as f32 * item_price
38 });
39 let transaction_entry = AddTransaction {
40 customer_id: Some(selected_user.id),
41 amount: cart_total,
42 payment_type: pmt_kind,
43 };
44 diesel::insert_into(transaction)
45 .values(transaction_entry)
46 .execute(&conn)
47 .expect("Coundn't connect to DB");
48 return HttpResponse::Ok().body("Transaction performed successfully");
49 } else {
50 return HttpResponse::Unauthorized().body("Login first");
51 }
52}
53
54pub async fn list_transactions(
55 pool: web::Data<TPool>,
56 cookie: Identity,
57) -> impl Responder {
58 let conn = pool.get().unwrap();
59 if let Some(uname) = cookie.identity() {
60 let selected_user = customer
61 .filter(username.eq(&uname))
62 .limit(1)
63 .first::<Customer>(&conn)
64 .expect("Couldn't connect to DB");
65 let user_transactions = transaction
66 .filter(customer_id.eq(selected_user.id))
67 .load::<Transaction>(&conn)
68 .expect("Couldn't connect to DB");
69 return HttpResponse::Ok().json(&user_transactions);
70 } else {
71 return HttpResponse::Unauthorized()
72 .body("Need to be logged in to add to cart!");
73 }
74}