diff --git a/controllers/maisondetreats/cakeOrder.controller.js b/controllers/maisondetreats/cakeOrder.controller.js index 0a4cd3d..2da2f47 100644 --- a/controllers/maisondetreats/cakeOrder.controller.js +++ b/controllers/maisondetreats/cakeOrder.controller.js @@ -1,39 +1,44 @@ import { CakeOrder } from "../../models/maisondetreats/cakeOrder.model.js"; import { sendCakeOrderMail } from "../../utils/mailer.js"; +// POST → Create new cake order export const createCakeOrder = async (req, res) => { - try { - const { order, email } = req.body; + try { + const { order, email, totalPieces, totalPrice } = req.body; - if (!order || typeof order !== "object") { - return res.status(400).json({ message: "Order data is required" }); - } - - const newOrder = await CakeOrder.create({ order, email }); - - // ✅ send confirmation email (non-blocking) - if (email) { - sendCakeOrderMail(email, order) - .then(() => console.log("Cake order email sent to", email)) - .catch((err) => console.error("Email send failed:", err)); - } - - res.status(201).json({ - message: "Cake order created successfully", - data: newOrder, - }); - } catch (err) { - console.error("Error creating cake order:", err); - res.status(500).json({ message: "Server error", error: err.message }); + if (!order || typeof order !== "object") { + return res.status(400).json({ message: "Order data is required" }); } + + if (!totalPieces || !totalPrice) { + return res.status(400).json({ message: "Total pieces and price are required" }); + } + + const newOrder = await CakeOrder.create({ order, email, totalPieces, totalPrice }); + + if (email) { + sendCakeOrderMail(email, order, totalPieces, totalPrice) + .then(() => console.log("Cake order email sent to", email)) + .catch((err) => console.error("Email send failed:", err)); + } + + res.status(201).json({ + message: "Cake order created successfully", + data: newOrder, + }); + } catch (err) { + console.error("Error creating cake order:", err); + res.status(500).json({ message: "Server error", error: err.message }); + } }; -// GET /api/cake-orders → List all orders + +// GET → Fetch all cake orders export const getAllCakeOrders = async (_req, res) => { - try { - const orders = await CakeOrder.find().sort({ createdAt: -1 }); - res.json({ data: orders }); - } catch (err) { - console.error("Error fetching cake orders:", err); - res.status(500).json({ message: "Server error", error: err.message }); - } + try { + const orders = await CakeOrder.find().sort({ createdAt: -1 }); + res.json({ data: orders }); + } catch (err) { + console.error("Error fetching cake orders:", err); + res.status(500).json({ message: "Server error", error: err.message }); + } }; diff --git a/models/maisondetreats/cakeOrder.model.js b/models/maisondetreats/cakeOrder.model.js index f7569c2..236e7d4 100644 --- a/models/maisondetreats/cakeOrder.model.js +++ b/models/maisondetreats/cakeOrder.model.js @@ -1,16 +1,24 @@ import mongoose from "mongoose"; +// Each flavour item schema +const FlavourSchema = new mongoose.Schema({ + flavour: { type: String, required: true }, + pieces: { type: Number, required: true }, + unitPrice: { type: Number, required: true }, + totalPrice: { type: Number, required: true }, +}); + +// Main Cake Order schema const CakeOrderSchema = new mongoose.Schema( { + email: { type: String, required: true }, order: { - type: Object, + type: Map, + of: [FlavourSchema], // Each category has an array of flavour objects required: true, - // Example format: - // { - // "Mini Cakes": { "Thandai Cake": 1, "Mango Cardamom": 1 }, - // "Mithai-Inspired Macarons": { "Mango macarons (pack of 6)": 1, "Pista (pack of 6)": 10 } - // } }, + totalPieces: { type: Number, required: true }, + totalPrice: { type: Number, required: true }, }, { timestamps: true } ); diff --git a/utils/mailer.js b/utils/mailer.js index 3cef212..fdcc9d4 100644 --- a/utils/mailer.js +++ b/utils/mailer.js @@ -62,8 +62,9 @@ export async function sendResetPasswordMail(email, token) { } } -// Send cake order email -export const sendCakeOrderMail = async (toEmail, orderData) => { + + +export const sendCakeOrderMail = async (email, order, totalPieces, totalPrice) => { try { const transporter = nodemailer.createTransport({ host: "mail.metatron-admin-backend.metatronhost.com", @@ -78,35 +79,37 @@ export const sendCakeOrderMail = async (toEmail, orderData) => { // Build table rows let orderRows = ""; - Object.entries(orderData).forEach(([category, flavours]) => { - Object.entries(flavours).forEach(([flavour, qty]) => { + Object.entries(order).forEach(([category, items]) => { + items.forEach(({ flavour, pieces, unitPrice, totalPrice: lineTotal }) => { orderRows += ` ${category} ${flavour} - ${qty} + ${pieces} + $${unitPrice.toFixed(2)} + $${lineTotal.toFixed(2)} `; }); }); - // HTML content with local images via cid const htmlContent = `
- - - - - -
- - - Order Date: ${new Date().toLocaleString()} -
+ + + + + +
+ + + Order Date: ${new Date().toLocaleString()} +
+ +
-

Order Details

@@ -114,14 +117,24 @@ export const sendCakeOrderMail = async (toEmail, orderData) => { + + ${orderRows} + + + + + +
Treats Flavour QuantityUnit PriceTotal Price
Total Pieces${totalPieces}Total Price ($)$${totalPrice.toFixed(2)}
+ Visit Our Website
+
@@ -130,30 +143,18 @@ export const sendCakeOrderMail = async (toEmail, orderData) => { const mailOptions = { from: '"Maison de Treats" ', - to: toEmail, + to: email, subject: "🎉 New Cake Order from Website Form", html: htmlContent, attachments: [ - { - filename: "logo-2.webp", - path: "./public/maisondetreats/img/logo-2.webp", - cid: "logo", - }, - { - filename: "thank-you.png", - path: "./public/maisondetreats/img/thank-you.png", - cid: "banner", - }, - { - filename: "bottom.png", - path: "./public/maisondetreats/img/bottom.png", - cid: "footer", - }, + { filename: "logo-2.webp", path: "./public/maisondetreats/img/logo-2.webp", cid: "logo" }, + { filename: "thank-you.png", path: "./public/maisondetreats/img/thank-you.png", cid: "banner" }, + { filename: "bottom.png", path: "./public/maisondetreats/img/bottom.png", cid: "footer" }, ], }; await transporter.sendMail(mailOptions); - console.log("✅ Cake order email sent to", toEmail); + console.log("✅ Cake order email sent to", email); } catch (err) { console.error("❌ Failed to send cake order email:", err); }