diff --git a/resources/Orders/StripeCheckOutController.js b/resources/Orders/StripeCheckOutController.js index b92eb18..81f6417 100644 --- a/resources/Orders/StripeCheckOutController.js +++ b/resources/Orders/StripeCheckOutController.js @@ -11,7 +11,7 @@ import { shippingAddress } from "../ShippingAddresses/ShippingAddressModel.js"; import sendEmail from "../../Utils/sendEmail.js"; // const endpointSecret = STRIPE_SECRET_KEY; //generate unique order id -const generateUniqueOrderId = async () => { +export const generateUniqueOrderId = async () => { const currentYear = new Date().getFullYear(); // Find the latest order to get the last serial number const latestOrder = await Order.findOne({}, {}, { sort: { orderID: -1 } }); @@ -36,6 +36,7 @@ export const handlePayment = async (req, res) => { if (!email) return res.status(400).send({ message: "Please enter the email" }); const { address, cart, subtotal } = req.body; + if (cart.length < 1) return res.status(400).json({ message: "cart is empty!" }); switch (true) { @@ -48,7 +49,7 @@ export const handlePayment = async (req, res) => { } } let addss = await shippingAddress.findById(address); - console.log(addss?.postalCode); + let shipping = { first_Name: addss.first_Name, last_Name: addss.last_Name, @@ -102,12 +103,19 @@ export const handlePayment = async (req, res) => { // Add any other key-value pairs as needed }, - success_url: `${process.env.FRONTEND_URL}/cart`, - cancel_url: `${process.env.FRONTEND_URL}/error`, + shipping_address_collection: { + allowed_countries: ["IN"], + // Allow only India for INR transactions + }, + billing_address_collection: "required", + success_url: "http://localhost:5173/order-complete", // Provide your success URL here + cancel_url: "http://localhost:5173/cart", }); // res.json({ sessionId: session.id }); - res.status(200).send({ message: "order created", url: session.url }); + res + .status(200) + .send({ message: "order created", url: session.url, id: session.id }); } } catch (err) { console.log(err); diff --git a/resources/Orders/orderController.js b/resources/Orders/orderController.js index cf73972..77dd538 100644 --- a/resources/Orders/orderController.js +++ b/resources/Orders/orderController.js @@ -1,3 +1,4 @@ +import sendEmail from "../../Utils/sendEmail.js"; import { Order } from "./orderModel.js"; export const getAllOrder = async (req, res) => { @@ -44,7 +45,7 @@ export const getSingleOrder = async (req, res) => { const order = await Order.findById(req.params.id) .populate({ path: "user", - select: "name -_id", + select: "name email -_id", }) .populate({ path: "shippingInfo.addressId", @@ -67,13 +68,13 @@ export const getSingleOrder = async (req, res) => { //get self User Order export const getUserSelf = async (req, res) => { + if (!req?.user) return res.status(400).json({ message: "please login !" }); try { const order = await Order.find({ - user: req.user._id, + user: req.user?._id, payment_status: "success", - }) - .populate("shippingInfo.addressId") - .sort({ createdAt: -1 }); + }).sort({ createdAt: -1 }); + if (order) { return res.status(200).json({ success: true, @@ -117,6 +118,7 @@ export const deleteOneOrder = async (req, res) => { export const updateOrderStatusById = async (req, res) => { try { let body = { orderStatus: req.body.status }; + const currentDate = new Date(); body["status_timeline." + req.body.status] = currentDate; // if (req.body?.package_weight) body.package_weight = req.body.package_weight; @@ -151,6 +153,21 @@ export const updateOrderStatusById = async (req, res) => { body["courier_name"] = req.body.courierName; body["courier_tracking_id"] = req.body.TrackingID; await Order.findByIdAndUpdate(order._id, body); + await sendEmail({ + to: `${req.body.sendemail}`, // Change to your recipient + + from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender + + subject: `Your Order is On Its Way!`, + html: `

Welcome to Smellika - Let the Shopping Begin!

+ Hi ${req.body?.customerName}, + +

Great news! Your order has been confirmed. Here are the details

+
+ Best regards,
+ + Team Smellika`, + }); return res .status(200) .json({ status: "ok", message: "Order status updated successfully!" }); diff --git a/resources/Orders/orderModel.js b/resources/Orders/orderModel.js index 470a46b..d24ce3a 100644 --- a/resources/Orders/orderModel.js +++ b/resources/Orders/orderModel.js @@ -117,7 +117,7 @@ const orderSchema = new mongoose.Schema( "cancelled", "returned", ], - // default: "new", + default: "new", }, // paypal_payer_id: { type: String }, diff --git a/resources/Orders/orderRoute.js b/resources/Orders/orderRoute.js index b4ced7a..d6a9780 100644 --- a/resources/Orders/orderRoute.js +++ b/resources/Orders/orderRoute.js @@ -28,9 +28,7 @@ router.route("/:orderID/capture/payment").post(captureOrderPayment); // ----------------------stripe checkOut-----------------// // app.post("/webhook", express.raw({ type: "application/json" }), webhook); -router - .route("/stripe-checkout-session") - .post(isAuthenticatedUser, handlePayment); +router.route("/stripe-checkout").post(isAuthenticatedUser, handlePayment); router .route("/webhook") .post(express.raw({ type: "application/json" }), webhook); diff --git a/resources/StripePayment/stripeController.js b/resources/StripePayment/stripeController.js index 21d3346..eba43e0 100644 --- a/resources/StripePayment/stripeController.js +++ b/resources/StripePayment/stripeController.js @@ -1,12 +1,11 @@ -import { createCheckoutSession } from './stripeModel.js'; +import { createCheckoutSession } from "./stripeModel.js"; export async function createCheckoutSessionController(req, res) { - try { - const body = req.body; - const sessionId = await createCheckoutSession(body); - res.json({ id: sessionId }); - } catch (error) { - console.error("Error creating checkout session:", error); - res.status(500).json({ error: "Failed to create checkout session" }); - } + try { + const sessionId = await createCheckoutSession(req.body); + res.json({ id: sessionId }); + } catch (error) { + console.error("Error creating checkout session:", error); + res.status(500).json({ error: "Failed to create checkout session" }); + } } diff --git a/resources/StripePayment/stripeModel.js b/resources/StripePayment/stripeModel.js index bd514d0..47bfc59 100644 --- a/resources/StripePayment/stripeModel.js +++ b/resources/StripePayment/stripeModel.js @@ -1,29 +1,27 @@ -import Stripe from 'stripe'; +import Stripe from "stripe"; const stripe = new Stripe(process.env.STRIPE_SECRET); export async function createCheckoutSession(body) { - const lineItems = body.products.map(({ product, quantity }) => ({ - price_data: { - currency: "usd", - product_data: { - name: product.name, - images: [product.image[0].url] // assuming you want to use the first image URL - }, - unit_amount: Math.round(product.price * 100), // Ensure proper conversion to cents - }, - quantity: quantity - })); - - + const lineItems = body.products.map(({ product, quantity }) => ({ + price_data: { + currency: "usd", + product_data: { + name: product.name, + images: [product.image[0].url], // assuming you want to use the first image URL + }, + unit_amount: Math.round(product.price * 100), // Ensure proper conversion to cents + }, + quantity: quantity, + })); - const session = await stripe.checkout.sessions.create({ - payment_method_types: ["card"], - line_items: lineItems, - mode: "payment", - success_url: "http://localhost:5173/order-complete", // Provide your success URL here - cancel_url: "http://localhost:5173/cart" // Provide your cancel URL here - }); + const session = await stripe.checkout.sessions.create({ + payment_method_types: ["card"], + line_items: lineItems, + mode: "payment", + success_url: "http://localhost:5173/order-complete", // Provide your success URL here + cancel_url: "http://localhost:5173/cart", // Provide your cancel URL here + }); - return session.id; + return session.id; }