Files
2026-03-10 03:45:00 +09:00

155 lines
3.5 KiB
JavaScript

const asyncErrorHandler = require('../middlewares/helpers/asyncErrorHandler');
const Order = require('../models/orderModel');
const Product = require('../models/productModel');
const ErrorHandler = require('../utils/errorHandler');
const sendEmail = require('../utils/sendEmail');
// Create New Order
exports.newOrder = asyncErrorHandler(async (req, res, next) => {
const {
shippingInfo,
orderItems,
paymentInfo,
totalPrice,
} = req.body;
const orderExist = await Order.findOne({ paymentInfo });
if (orderExist) {
return next(new ErrorHandler("Order Already Placed", 400));
}
const order = await Order.create({
shippingInfo,
orderItems,
paymentInfo,
totalPrice,
paidAt: Date.now(),
user: req.user._id,
});
await sendEmail({
email: req.user.email,
templateId: process.env.SENDGRID_ORDER_TEMPLATEID,
data: {
name: req.user.name,
shippingInfo,
orderItems,
totalPrice,
oid: order._id,
}
});
res.status(201).json({
success: true,
order,
});
});
// Get Single Order Details
exports.getSingleOrderDetails = asyncErrorHandler(async (req, res, next) => {
const order = await Order.findById(req.params.id).populate("user", "name email");
if (!order) {
return next(new ErrorHandler("Order Not Found", 404));
}
res.status(200).json({
success: true,
order,
});
});
// Get Logged In User Orders
exports.myOrders = asyncErrorHandler(async (req, res, next) => {
const orders = await Order.find({ user: req.user._id });
if (!orders) {
return next(new ErrorHandler("Order Not Found", 404));
}
res.status(200).json({
success: true,
orders,
});
});
// Get All Orders ---ADMIN
exports.getAllOrders = asyncErrorHandler(async (req, res, next) => {
const orders = await Order.find();
if (!orders) {
return next(new ErrorHandler("Order Not Found", 404));
}
let totalAmount = 0;
orders.forEach((order) => {
totalAmount += order.totalPrice;
});
res.status(200).json({
success: true,
orders,
totalAmount,
});
});
// Update Order Status ---ADMIN
exports.updateOrder = asyncErrorHandler(async (req, res, next) => {
const order = await Order.findById(req.params.id);
if (!order) {
return next(new ErrorHandler("Order Not Found", 404));
}
if (order.orderStatus === "Delivered") {
return next(new ErrorHandler("Already Delivered", 400));
}
if (req.body.status === "Shipped") {
order.shippedAt = Date.now();
order.orderItems.forEach(async (i) => {
await updateStock(i.product, i.quantity)
});
}
order.orderStatus = req.body.status;
if (req.body.status === "Delivered") {
order.deliveredAt = Date.now();
}
await order.save({ validateBeforeSave: false });
res.status(200).json({
success: true
});
});
async function updateStock(id, quantity) {
const product = await Product.findById(id);
product.stock -= quantity;
await product.save({ validateBeforeSave: false });
}
// Delete Order ---ADMIN
exports.deleteOrder = asyncErrorHandler(async (req, res, next) => {
const order = await Order.findById(req.params.id);
if (!order) {
return next(new ErrorHandler("Order Not Found", 404));
}
await order.remove();
res.status(200).json({
success: true,
});
});