diff --git a/resources/Orders/RazerPayCheckoutController.js b/resources/Orders/RazerPayCheckoutController.js index c39b04f..fe4f436 100644 --- a/resources/Orders/RazerPayCheckoutController.js +++ b/resources/Orders/RazerPayCheckoutController.js @@ -56,15 +56,23 @@ export const checkout = async (req, res) => { const { address, cart, subtotal } = req.body; if (cart.length < 1) return res.status(400).json({ message: "cart is empty!" }); - switch (true) { - //validation - case !address: { - return res.status(404).json({ msg: "please provide shipping address" }); - } - case !subtotal: { - return res.status(404).json({ msg: "please provide product subtotal" }); - } - } + if (!address) + return res + .status(404) + .json({ message: "please select shipping address!" }); + if (!subtotal) + return res + .status(404) + .json({ message: "please provide product subtotal!" }); + // switch (true) { + // //validation + // case !address: { + // return res.status(404).json({ msg: "please select shipping address" }); + // } + // case !subtotal: { + // return res.status(404).json({ msg: "please provide product subtotal" }); + // } + // } let addss = await shippingAddress.findById(address); let shipping = { first_Name: addss.first_Name, @@ -77,12 +85,18 @@ export const checkout = async (req, res) => { country: addss.country, addressId: address, }; + // console.log("cart", cart[0]?.product?.gst); const orderItems = await cart.map((item) => ({ product: item.product._id, name: item.product.name, - price: item.product.total_amount, + price: item.product.price, + total_Amount: item.product.total_amount, + image: item.product.image, quantity: item.quantity, + gst_amount: item.product.gst_amount, + gst_rate: item.product.gst?.tax, + tax_Name: item.product.gst?.name, product_Subtotal: item.subtotal, })); @@ -130,7 +144,7 @@ export const paymentVerification = async (req, res) => { path: "user", select: "name email -_id", }); - console.log("findSameOrder", findSameOrder); + // console.log("findSameOrder", findSameOrder); if (findSameOrder) { (findSameOrder.razorpay_payment_id = razorpay_payment_id), // await Payment.create({ (findSameOrder.isPaid = true), @@ -143,7 +157,7 @@ export const paymentVerification = async (req, res) => { await findSameOrder.save(); } //send email to customer - + // console.log("findSameOrder", findSameOrder); await sendEmail({ to: `${findSameOrder?.user?.email}`, // Change to your recipient @@ -151,10 +165,84 @@ export const paymentVerification = async (req, res) => { subject: `Your Order #${findSameOrder?.orderID} Confirmation`, html: `

Welcome to Smellika - Let the Shopping Begin!

- Hi ${findSameOrder?.shippingInfo?.first_Name}, + Hi ${ + findSameOrder?.shippingInfo?.first_Name + }, -

Great news! Your order #${findSameOrder?.orderID} has been confirmed. Here are the details

-
+

Great news! Your order #${ + findSameOrder?.orderID + } has been confirmed. Here are the details

+

Shipping Address : ${ + findSameOrder?.shippingInfo?.first_Name + } ${findSameOrder?.shippingInfo?.last_Name} , ${ + findSameOrder?.shippingInfo?.street + } ${findSameOrder?.shippingInfo?.city} ${ + findSameOrder?.shippingInfo?.state + } ${findSameOrder?.shippingInfo?.country}, PIN-${ + findSameOrder?.shippingInfo?.postalCode + }, Phone Number: ${findSameOrder?.shippingInfo?.phone_Number}

+

Order Items :

+ + + + + + + + + + + + + + + + + + ${findSameOrder?.orderItems + ?.map( + (product, index) => ` + + + + + + + + + + + + + ` + ) + .join("")} + + + + + +
S No.Product NameImageQuantityPriceGST AmountSubTotal
${ + index + 1 + }${ + product.name + }${
+          product.name
+        }${ + product.quantity + }₹${ + product.price + }₹${ + product?.gst_amount + }₹${ + product.product_Subtotal + }
Total Amount :₹${ + findSameOrder?.total_amount + }
+ +
Best regards,
Team Smellika`, @@ -171,7 +259,7 @@ export const paymentVerification = async (req, res) => { // razorpay_signature, // }); - res.redirect(`http://localhost:5173/account`); + res.redirect(`https://smellika.com/shop`); // res.redirect( // `http://localhost:5173/cart/paymentsuccess?reference=${razorpay_payment_id}` // ); diff --git a/resources/Orders/orderController.js b/resources/Orders/orderController.js index 77dd538..8056833 100644 --- a/resources/Orders/orderController.js +++ b/resources/Orders/orderController.js @@ -36,7 +36,33 @@ export const getAllOrder = async (req, res) => { }); } }; - +export const getOrders = async (req, res) => { + try { + const order = await Order.find({ + payment_status: "success", + }) + .populate({ + path: "user", + select: "name -_id", + }) + .populate({ + path: "shippingInfo.addressId", + }) + .sort({ updatedAt: -1 }); + if (order) { + res.status(201).json({ + success: true, + order, + message: "All Order Fetched", + }); + } + } catch (error) { + res.status(500).json({ + success: false, + message: error.message ? error.message : "Something went Wrong", + }); + } +}; export const getSingleOrder = async (req, res) => { try { if (!req.params.id) @@ -89,6 +115,7 @@ export const getUserSelf = async (req, res) => { }); } }; + export const deleteOneOrder = async (req, res) => { try { if (!req?.user) return res.status(400).json({ message: "please login !" }); diff --git a/resources/Orders/orderModel.js b/resources/Orders/orderModel.js index 3268b67..c360aba 100644 --- a/resources/Orders/orderModel.js +++ b/resources/Orders/orderModel.js @@ -66,6 +66,10 @@ const orderSchema = new mongoose.Schema( type: Number, default: "", }, + total_Amount: { + type: Number, + default: "", + }, quantity: { type: Number, default: "", @@ -77,6 +81,18 @@ const orderSchema = new mongoose.Schema( type: Number, default: "", }, + gst_amount: { + type: Number, + default: "", + }, + gst_rate: { + type: Number, + default: "", + }, + tax_Name: { + type: String, + default: "", + }, product: { type: mongoose.Schema.ObjectId, ref: "Product", diff --git a/resources/Orders/orderRoute.js b/resources/Orders/orderRoute.js index 32cd99a..89721b8 100644 --- a/resources/Orders/orderRoute.js +++ b/resources/Orders/orderRoute.js @@ -2,6 +2,7 @@ import bodyParser from "body-parser"; import { deleteOneOrder, getAllOrder, + getOrders, getSingleOrder, getUserSelf, updateOrderStatusById, @@ -46,6 +47,9 @@ router.route("/user/self").get(isAuthenticatedUser, getUserSelf); router .route("/getAll/:status") .get(isAuthenticatedUser, authorizeRoles("admin"), getAllOrder); + router + .route("/getAll/") + .get(isAuthenticatedUser, authorizeRoles("admin"), getOrders); router.route("/getOne/:id").get(isAuthenticatedUser, getSingleOrder); router.route("/change/status/:id").patch(updateOrderStatusById); diff --git a/resources/user/userController.js b/resources/user/userController.js index 334b267..60161d4 100644 --- a/resources/user/userController.js +++ b/resources/user/userController.js @@ -6,6 +6,7 @@ import sendEmail from "../../Utils/sendEmail.js"; import crypto from "crypto"; import cloudinary from "cloudinary"; import password from "secure-random-password"; +import { Order } from "../Orders/orderModel.js"; // 1.Register a User export const registerUser = async (req, res) => { try { @@ -200,6 +201,24 @@ export const getUserDetails = catchAsyncErrors(async (req, res, next) => { user, }); }); +export const getAllUsers = catchAsyncErrors(async (req, res, next) => { + const users = await User.find().populate("orders"); // Assuming orders are stored in a separate collection and populated in the User model + + // Process user data to calculate last purchase date and order count + const usersWithInfo = users.map((user) => { + const lastPurchase = + user.orders.length > 0 + ? user.orders[user.orders.length - 1].createdAt + : null; + const orderCount = user.orders.length; + return { ...user.toJSON(), lastPurchase, orderCount }; + }); + + res.status(200).json({ + success: true, + users: usersWithInfo, + }); +}); // 7.Get single user (admin) export const getSingleUser = catchAsyncErrors(async (req, res, next) => { @@ -219,6 +238,29 @@ export const getSingleUser = catchAsyncErrors(async (req, res, next) => { user, }); }); +export const getUserOrderForAdmin = async (req, res) => { + const id = req.params.id; + // console.log(id); + try { + const order = await Order.find({ + user: id, + payment_status: "success", + }).sort({ createdAt: -1 }); + + if (order) { + return res.status(200).json({ + success: true, + order, + message: "self Order fetched", + }); + } + } catch (error) { + res.status(500).json({ + success: false, + message: error.message ? error.message : "Something went Wrong", + }); + } +}; // 8.update User password export const updatePassword = catchAsyncErrors(async (req, res, next) => { const user = await User.findById(req.user.id).select("+password"); @@ -284,7 +326,8 @@ export const updateProfile = catchAsyncErrors(async (req, res, next) => { // 9.Get all users(admin) export const getAllUser = catchAsyncErrors(async (req, res, next) => { - const users = await User.find(); //.select('-role'); + // Assuming your User model is imported as 'User' + const users = await User.find({ role: "user" }); res.status(200).json({ success: true, diff --git a/resources/user/userRoute.js b/resources/user/userRoute.js index 841ee68..78c4c2b 100644 --- a/resources/user/userRoute.js +++ b/resources/user/userRoute.js @@ -1,17 +1,18 @@ -import express from "express" +import express from "express"; import { - registerUser, - loginUser, - logout, - forgotPassword, - resetPassword, - getUserDetails, - updatePassword, - updateProfile, - getSingleUser, - getAllUser -} from "./userController.js" -import { isAuthenticatedUser, authorizeRoles } from "../../middlewares/auth.js" + registerUser, + loginUser, + logout, + forgotPassword, + resetPassword, + getUserDetails, + updatePassword, + updateProfile, + getSingleUser, + getAllUser, + getUserOrderForAdmin, +} from "./userController.js"; +import { isAuthenticatedUser, authorizeRoles } from "../../middlewares/auth.js"; const router = express.Router(); @@ -27,17 +28,18 @@ router.route("/user/logout").get(logout); router.route("/user/details").get(isAuthenticatedUser, getUserDetails); router - .route("/admin/users") - .get(isAuthenticatedUser, authorizeRoles("admin"), getAllUser); + .route("/admin/users") + .get(isAuthenticatedUser, authorizeRoles("admin"), getAllUser); router - .route("/admin/user/:id") - .get(isAuthenticatedUser, authorizeRoles("admin"), getSingleUser); - + .route("/admin/users/orders/:id") + .get(isAuthenticatedUser, authorizeRoles("admin"), getUserOrderForAdmin); +router + .route("/admin/user/:id") + .get(isAuthenticatedUser, authorizeRoles("admin"), getSingleUser); router.route("/user/password/update").put(isAuthenticatedUser, updatePassword); router.route("/user/update/profile").put(isAuthenticatedUser, updateProfile); - -export default router; \ No newline at end of file +export default router;