Skip to content

Commit 2d3d82c

Browse files
committed
components: order[controller + routes]
1 parent faac0c2 commit 2d3d82c

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

components/order/order_controller.js

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
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+
};

components/order/order_routes.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import express from "express";
2+
import { allowedTo, protectedRoutes } from '../auth/auth_controller';
3+
import * as order from '../order/order_controller';
4+
5+
const orderRouter = express.Router();
6+
7+
orderRouter.route("/:id").post(protectedRoutes, allowedTo("user"), order.createCashOrder)
8+
9+
orderRouter.route("/").get(protectedRoutes, allowedTo("user"), order.getSpecificOrder)
10+
11+
orderRouter.post('/checkOut/:id', protectedRoutes, allowedTo("user"), order.createCheckOutSession)
12+
13+
orderRouter.get('/all', order.getAllOrders)
14+
15+
export default orderRouter;

0 commit comments

Comments
 (0)