1+ import { catchAsyncError } from '../../utils/catch_async_error.js' ;
2+ import { AppError } from '../../utils/app_error.js' ;
3+ import { cartModel } from '../../models/cart_model.js' ;
4+ import { productModel } from '../../models/product_model.js' ;
5+ import { orderModel } from '../../models/order_model.js' ;
6+ import { userModel } from '../../models/user_model.js' ;
7+ import Stripe from "stripe" ;
8+
9+
10+ // TODO: NEED TO ADD STRIPE KEYS
11+ const stripe = new Stripe (
12+ ""
13+ ) ;
14+
15+ const createCashOrder = catchAsyncError ( async ( req , res , next ) => {
16+ let cart = await cartModel . findById ( req . params . id ) ;
17+
18+ let totalOrderPrice = cart . totalPriceAfterDiscount
19+ ? cart . totalPriceAfterDiscount
20+ : cart . totalPrice ;
21+
22+ console . log ( cart . cartItem ) ;
23+ const order = new orderModel ( {
24+ userId : req . user . _id ,
25+ cartItem : cart . cartItem ,
26+ totalOrderPrice,
27+ shippingAddress : req . body . shippingAddress ,
28+ } ) ;
29+
30+ await order . save ( ) ;
31+
32+ if ( order ) {
33+ let options = cart . cartItem . map ( ( item ) => ( {
34+ updateOne : {
35+ filter : { _id : item . productId } ,
36+ update : { $inc : { quantity : - item . quantity , sold : item . quantity } } ,
37+ } ,
38+ } ) ) ;
39+
40+ await productModel . bulkWrite ( options ) ;
41+
42+ await cartModel . findByIdAndDelete ( req . params . id ) ;
43+
44+ return res . status ( 201 ) . json ( { message : "success" , order } ) ;
45+ } else {
46+ next ( new AppError ( "Error in cart ID" , 404 ) ) ;
47+ }
48+ } ) ;
49+
50+ const getSpecificOrder = catchAsyncError ( async ( req , res , next ) => {
51+ console . log ( req . user . _id ) ;
52+
53+ let order = await orderModel
54+ . findOne ( { userId : req . user . _id } )
55+ . populate ( "cartItems.productId" ) ;
56+
57+ res . status ( 200 ) . json ( { message : "success" , order } ) ;
58+ } ) ;
59+
60+ const getAllOrders = catchAsyncError ( async ( req , res , next ) => {
61+ let orders = await orderModel . findOne ( { } ) . populate ( "cartItems.productId" ) ;
62+
63+ res . status ( 200 ) . json ( { message : "success" , orders } ) ;
64+ } ) ;
65+
66+ const createCheckOutSession = catchAsyncError ( async ( req , res , next ) => {
67+ let cart = await cartModel . findById ( req . params . id ) ;
68+ if ( ! cart ) return next ( new AppError ( "Cart was not found" , 404 ) )
69+
70+ console . log ( cart ) ;
71+
72+ let totalOrderPrice = cart . totalPriceAfterDiscount
73+ ? cart . totalPriceAfterDiscount
74+ : cart . totalPrice ;
75+
76+ let sessions = await stripe . checkout . sessions . create ( {
77+ line_items : [
78+ {
79+ price_data : {
80+ currency : "egp" ,
81+ unit_amount : totalOrderPrice * 100 ,
82+ product_data : {
83+ name : req . user . name ,
84+ } ,
85+ } ,
86+ quantity : 1 ,
87+ } ,
88+ ] ,
89+ mode : "payment" ,
90+ success_url : "" ,
91+ cancel_url : "" ,
92+ customer_email : req . user . email ,
93+ client_reference_id : req . params . id ,
94+ metadata : req . body . shippingAddress ,
95+ } ) ;
96+
97+ res . json ( { message : "success" , sessions } ) ;
98+ } ) ;
99+
100+ const createOnlineOrder = catchAsyncError ( async ( request , response ) => {
101+ const sig = request . headers [ "stripe-signature" ] . toString ( ) ;
102+
103+ let event ;
104+
105+ try {
106+ event = stripe . webhooks . constructEvent (
107+ request . body ,
108+ sig ,
109+ "whsec_fcatGuOKvXYUQoz5NWSwH9vaqdWXIWsI"
110+ ) ;
111+ } catch ( err ) {
112+ return response . status ( 400 ) . send ( `Webhook Error: ${ err . message } ` ) ;
113+ }
114+
115+ if ( event . type == "checkout.session.completed" ) {
116+ card ( event . data . object , response )
117+
118+
119+ } else {
120+ console . log ( `Unhandled event type ${ event . type } ` ) ;
121+ }
122+ } ) ;
123+
124+
125+
126+ async function card ( e , res ) {
127+ let cart = await cartModel . findById ( e . client_reference_id ) ;
128+
129+ if ( ! cart ) return next ( new AppError ( "Cart was not found" , 404 ) )
130+
131+ let user = await userModel . findOne ( { email : e . customer_email } )
132+ const order = new orderModel ( {
133+ userId : user . _id ,
134+ cartItem : cart . cartItem ,
135+ totalOrderPrice : e . amount_total / 100 ,
136+ shippingAddress : e . metadata . shippingAddress ,
137+ paymentMethod : "card" ,
138+ isPaid : true ,
139+ paidAt : Date . now ( )
140+ } ) ;
141+
142+ await order . save ( ) ;
143+
144+ if ( order ) {
145+ let options = cart . cartItem . map ( ( item ) => ( {
146+ updateOne : {
147+ filter : { _id : item . productId } ,
148+ update : { $inc : { quantity : - item . quantity , sold : item . quantity } } ,
149+ } ,
150+ } ) ) ;
151+
152+ await productModel . bulkWrite ( options ) ;
153+
154+ await cartModel . findOneAndDelete ( { userId : user . _id } ) ;
155+
156+ return res . status ( 201 ) . json ( { message : "success" , order } ) ;
157+ } else {
158+ next ( new AppError ( "Error in cart ID" , 404 ) ) ;
159+ }
160+ }
161+
162+ export {
163+ createCashOrder ,
164+ getSpecificOrder ,
165+ getAllOrders ,
166+ createCheckOutSession ,
167+ createOnlineOrder ,
168+ } ;
0 commit comments