const express = require('express'); const router = express.Router(); const pool = require('../config/database'); // Middleware ตรวจสอบการ Login function isAuthenticated(req, res, next) { if (req.session && req.session.user) { return next(); // ถ้า Login แล้วให้ไปต่อ } else { res.redirect('/login'); // ถ้ายังไม่ได้ Login ให้ Redirect ไปที่หน้า Login } } router.use((req, res, next) => { console.log("🔹 Session ID:", req.session.id); console.log("🔹 Session Data:", req.session); next(); }); // แสดงประวัติออเดอร์ (เฉพาะผู้ที่ Login) router.get('/history', isAuthenticated, async (req, res) => { if (!req.session.id) { return res.status(400).json({ message: "Session ID not found. Please login again." }); } try { const [orders] = await pool.query( `SELECT orders.id, orders.total_amount, orders.status, orders.shipping_address, orders.created_at, GROUP_CONCAT( CONCAT(products.name, ' x ', order_items.quantity, ' (฿', order_items.price, ')') SEPARATOR ', ' ) as items_detail FROM orders JOIN order_items ON orders.id = order_items.order_id JOIN products ON order_items.product_id = products.id WHERE orders.session_id = ? GROUP BY orders.id ORDER BY orders.created_at DESC`, [req.session.id] ); res.render('order-history', { orders }); } catch (error) { console.error(error); res.status(500).send('Error fetching order history'); } }); // แสดงรายละเอียดออเดอร์ (เฉพาะผู้ที่ Login) router.get('/order-details/:orderId', isAuthenticated, async (req, res) => { try { if (!req.session.id) { return res.status(400).json({ message: "Session ID not found. Please login again." }); } const { orderId } = req.params; console.log(`🔹 Fetching order ID: ${orderId}, Session ID: ${req.session.id}`); // ดึงข้อมูลคำสั่งซื้อ const [orderResults] = await pool.query( `SELECT id, total_amount, status, shipping_address, created_at FROM orders WHERE id = ? AND session_id = ?`, [orderId, req.session.id] ); if (orderResults.length === 0) { console.log("Order not found or no permission."); return res.status(404).json({ message: "ไม่พบคำสั่งซื้อ หรือไม่มีสิทธิ์เข้าถึง" }); } // ดึงรายการสินค้าใน order_items const [orderItems] = await pool.query( `SELECT order_items.order_id, order_items.product_id, products.name, order_items.quantity, order_items.price FROM order_items JOIN products ON order_items.product_id = products.id WHERE order_items.order_id = ?`, [orderId] ); console.log("Order Items:", orderItems); res.json({ order: orderResults[0], items: orderItems }); } catch (error) { console.error("Error fetching order:", error); res.status(500).json({ message: "Something went wrong.", error: error.message }); } }); // อัปเดตที่อยู่จัดส่งของคำสั่งซื้อ router.put('/order-details/:orderId', isAuthenticated, async (req, res) => { try { console.log("Updating order..."); console.log("Session ID:", req.session.id); console.log("New Address:", req.body.shipping_address); const [orderResults] = await pool.query( `SELECT id, session_id FROM orders WHERE id = ?`, [req.params.orderId] ); if (orderResults.length === 0) { console.log("Order not found!"); return res.status(404).json({ message: "ไม่พบคำสั่งซื้อ" }); } console.log("Order Session ID:", orderResults[0].session_id); console.log("Request Session ID:", req.session.id); // ตรวจสอบว่าผู้ใช้มีสิทธิ์แก้ไขที่อยู่หรือไม่ if (orderResults[0].session_id !== req.session.id) { console.log("Session ID ไม่ตรงกัน!"); return res.status(403).json({ message: "ไม่มีสิทธิ์แก้ไขที่อยู่นี้" }); } // อัปเดตที่อยู่ const [result] = await pool.query( "UPDATE orders SET shipping_address = ? WHERE id = ? AND session_id = ?", [req.body.shipping_address, req.params.orderId, req.session.id] ); if (result.affectedRows === 0) { return res.status(404).json({ message: "ไม่สามารถอัปเดตที่อยู่ได้" }); } res.json({ message: "อัปเดตที่อยู่สำเร็จ!" }); } catch (error) { console.error("ERROR:", error); res.status(500).json({ message: "เกิดข้อผิดพลาด", error: error.message }); } }); // ป้องกันไม่ให้เข้า Checkout ถ้าไม่ได้ Login router.get('/checkout', isAuthenticated, async (req, res) => { try { const [cartItems] = await pool.query( `SELECT cart_items.*, products.name, products.price FROM cart_items JOIN products ON cart_items.product_id = products.id WHERE cart_items.session_id = ?`, [req.session.id] ); const total = cartItems.reduce((sum, item) => sum + (item.price * item.quantity), 0); // ต้องส่ง user ไปที่ checkout.ejs res.render('checkout', { user: req.session.user, cartItems, total }); } catch (error) { console.error(error); res.status(500).send('Error loading checkout'); } }); // บันทึกออเดอร์ router.post('/create', isAuthenticated, async (req, res) => { if (!req.session.id) { return res.status(400).json({ message: "Session ID not found. Please login again." }); } console.log("🔹 Creating order with Session ID:", req.session.id); const { address } = req.body; const conn = await pool.getConnection(); try { await conn.beginTransaction(); const [cartItems] = await conn.query( `SELECT cart_items.*, products.price FROM cart_items JOIN products ON cart_items.product_id = products.id WHERE cart_items.session_id = ?`, [req.session.id] ); if (cartItems.length === 0) { return res.status(400).send('Cart is empty'); } const total = cartItems.reduce((sum, item) => sum + (item.price * item.quantity), 0); if (!req.session.id) { return res.status(400).json({ message: "Session ID not found. Please login again." }); } const [order] = await conn.query( 'INSERT INTO orders (session_id, total_amount, status, shipping_address) VALUES (?, ?, ?, ?)', [req.session.id, total, 'pending', address] ); // ตรวจสอบว่า INSERT สำเร็จหรือไม่ if (!order.insertId) { throw new Error("Failed to create order."); } for (const item of cartItems) { await conn.query( 'INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?)', [order.insertId, item.product_id, item.quantity, item.price] ); await conn.query( 'UPDATE products SET stock = stock - ? WHERE id = ?', [item.quantity, item.product_id] ); } await conn.query('DELETE FROM cart_items WHERE session_id = ?', [req.session.id]); await conn.commit(); res.redirect('/order/confirmation'); } catch (error) { await conn.rollback(); console.error(error); res.status(500).send('Error creating order'); } finally { conn.release(); } }); router.get('/confirmation', (req, res) => { res.render('confirmation'); }); module.exports = router;