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