diff --git a/controllers/cartController.js b/controllers/cartController.js new file mode 100644 index 0000000000000000000000000000000000000000..44af215b3c21fef1aded17768a9c39949cbdecb4 --- /dev/null +++ b/controllers/cartController.js @@ -0,0 +1,94 @@ +const pool = require('../db'); + +exports.addToCart = (req, res) => { + const { product_id, price } = req.body; + const quantity = parseInt(req.body.quantity) || 1; + + if (!req.session.cart) { + req.session.cart = []; + } + + const existingProduct = req.session.cart.find(item => item.product_id === product_id); + if (existingProduct) { + existingProduct.quantity += quantity; + } else { + req.session.cart.push({ product_id, quantity, price }); + } + + res.redirect('/cart'); +}; + +exports.viewCart = async (req, res) => { + const cart = req.session.cart || []; + + if (cart.length === 0) { + return res.render('cart', { cart: [], products: [] }); + } + + const productIds = cart.map(item => item.product_id); + try { + const [products] = await pool.query('SELECT * FROM products WHERE product_id IN (?)', [productIds]); + + // ผูกข้อมูลสินค้าเข้ากับตะกร้า + const cartWithDetails = cart.map(item => { + const product = products.find(p => p.product_id == item.product_id); + + // ตรวจสอบว่าเจอสินค้าไหม + if (product) { + return { ...item, product_name: product.product_name, image: product.image }; + } else { + // ถ้าไม่พบสินค้า, คืนค่าด้วยค่า default หรือข้อความ + return { ...item, product_name: 'ไม่พบสินค้า', image: 'default_image.jpg' }; + } + }); + + res.render('cart', { cart: cartWithDetails }); + } catch (err) { + res.status(500).send('เกิดข้อผิดพลาดในการโหลดตะกร้าสินค้า: ' + err.message); + } +}; + + +exports.removeFromCart = (req, res) => { + const product_id = req.params.id; + req.session.cart = req.session.cart.filter(item => item.product_id !== product_id); + res.redirect('/cart'); +}; + +exports.checkout = async (req, res) => { + if (!req.session.userIdEmail) { + return res.status(401).send('กรุณาเข้าสู่ระบบก่อนทำการสั่งซื้อ'); + } + + const cart = req.session.cart || []; + if (cart.length === 0) { + return res.redirect('/cart'); + } + + try { + const totalAmount = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); + const userEmail = req.session.userIdEmail; + + // ดึง user_id จาก email + const [user] = await pool.query('SELECT id FROM users WHERE email = ?', [userEmail]); + if (user.length === 0) { + return res.status(404).send('ไม่พบผู้ใช้งาน'); + } + const userId = user[0].id; + + // สร้างคำสั่งซื้อใน Orders + const [orderResult] = await pool.query('INSERT INTO orders (user_id, total_amount) VALUES (?, ?)', [userId, totalAmount]); + const orderId = orderResult.insertId; + + // เพิ่มรายการสินค้าลงใน Order_Items + const orderItems = cart.map(item => [orderId, item.product_id, item.quantity, item.price]); + await pool.query('INSERT INTO order_items (order_id, book_id, quantity, price) VALUES ?', [orderItems]); + + // ล้างตะกร้าหลังจาก Checkout สำเร็จ + req.session.cart = []; + + res.redirect('/orderConfirmation'); + } catch (err) { + res.status(500).send('เกิดข้อผิดพลาดในการสั่งซื้อ: ' + err.message); + } +}; \ No newline at end of file diff --git a/controllers/indexController.js b/controllers/indexController.js index ac3a6a044286c9202ce03e568a653ddf62706aae..932af7d1986a687d306782f9f20f835d1756d2b2 100644 --- a/controllers/indexController.js +++ b/controllers/indexController.js @@ -1,4 +1,30 @@ +const pool = require('../db'); -module.exports = (req, res) => { - res.render('index', { message: req.flash('message') }); -} \ No newline at end of file +exports.getProducts = async (req, res) => { + try { + const [rows] = await pool.query('SELECT * FROM products'); + res.render('index', { products: rows }); + } catch (err) { + res.status(500).send('Database error: ' + err.message); + } + }; + + exports.getProductDetail = async (req, res) => { + const productId = req.params.id; + try { + const [rows] = await pool.query(` + SELECT p.*, u.email AS owner + FROM products p + LEFT JOIN users u ON p.owner = u.email + WHERE p.product_id = ?`, [productId]); + + if (rows.length === 0) { + return res.status(404).send('ไม่พบสินค้านี้'); + } + + res.render('product', { product: rows[0], currentUserEmail: req.session.userIdEmail || '' }); + } catch (err) { + res.status(500).send('Database error: ' + err.message); + } + }; + \ No newline at end of file diff --git a/controllers/productController.js b/controllers/productController.js index 72b44363e5ca00b0793952c92b002bbf60c43b42..b003fdbc846c9448f777658b01a30376f89902c4 100644 --- a/controllers/productController.js +++ b/controllers/productController.js @@ -1,15 +1,12 @@ const pool = require('../db'); exports.showAddProductForm = (req, res) => { - if (!req.session.userIdEmail) { - return res.redirect('/login'); - } res.render('addProduct'); }; exports.createProduct = async (req, res) => { const { product_name, price, image, description } = req.body; - const owner = req.session.userIdEmail; + const owner = req.session.userIdEmail; // เราต้องเก็บ email ตอน login ด้วยนะครับ try { const sql = 'INSERT INTO products (product_name, price, image, description, owner) VALUES (?, ?, ?, ?, ?)'; await pool.query(sql, [product_name, price, image, description, owner]); @@ -17,13 +14,11 @@ exports.createProduct = async (req, res) => { } catch (err) { res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มสินค้า: ' + err.message); } -}; + }; + exports.showUpdateProductForm = async (req, res) => { const productId = req.params.id; - if (!req.session.userIdEmail) { - return res.redirect('/login'); - } try { const [rows] = await pool.query('SELECT * FROM products WHERE product_id = ?', [productId]); if (rows.length === 0) { @@ -35,7 +30,7 @@ exports.showUpdateProductForm = async (req, res) => { } }; -exports.updateProduct = async (req, res) => { + exports.updateProduct = async (req, res) => { const productId = req.params.id; const { product_name, price, image, description } = req.body; const currentUserEmail = req.session.userIdEmail; @@ -59,10 +54,11 @@ exports.updateProduct = async (req, res) => { } }; -exports.deleteProduct = async (req, res) => { + exports.deleteProduct = async (req, res) => { const productId = req.params.id; const currentUserEmail = req.session.userIdEmail; try { + // ตรวจสอบว่าผู้ใช้นี้เป็นเจ้าของหรือไม่ const [rows] = await pool.query('SELECT * FROM products WHERE product_id = ?', [productId]); if (rows.length === 0) { return res.status(404).send('ไม่พบสินค้านี้'); @@ -71,21 +67,22 @@ exports.deleteProduct = async (req, res) => { if (product.owner !== currentUserEmail) { return res.status(403).send('คุณไม่มีสิทธิ์ลบสินค้านี้'); } - + + // ลบสินค้าได้ await pool.query('DELETE FROM products WHERE product_id = ?', [productId]); res.redirect('/'); } catch (err) { - res.status(500).send('เกิดข้อผิดพลาดในการลบสินค้า: ' + err.message); + res.status(500).send('Database error: ' + err.message); } -}; + }; -exports.searchProducts = async (req, res) => { - const searchQuery = req.query.q; + exports.searchProducts = async (req, res) => { + const searchQuery = req.query.q; // รับค่าค้นหาจาก query parameter try { const sql = 'SELECT * FROM products WHERE product_name LIKE ?'; - const [rows] = await pool.query(sql, [`%${searchQuery}%`]); + const [rows] = await pool.query(sql, [`%${searchQuery}%`]); // ค้นหาชื่อสินค้าที่คล้ายกัน - res.render('searchResults', { products: rows, searchQuery }); + res.render('searchResults', { products: rows, searchQuery }); // ส่งผลลัพธ์ไปยังหน้า searchResults.ejs } catch (err) { res.status(500).send('เกิดข้อผิดพลาดในการค้นหา: ' + err.message); } @@ -93,28 +90,31 @@ exports.searchProducts = async (req, res) => { exports.orderHistory = async (req, res) => { if (!req.session.userIdEmail) { - return res.redirect('/login'); + return res.status(401).send('กรุณาเข้าสู่ระบบเพื่อดูประวัติการสั่งซื้อ'); } try { const userEmail = req.session.userIdEmail; + // ดึง user_id จาก email const [user] = await pool.query('SELECT id FROM users WHERE email = ?', [userEmail]); if (user.length === 0) { return res.status(404).send('ไม่พบผู้ใช้งาน'); } const userId = user[0].id; + // ดึงคำสั่งซื้อทั้งหมดของผู้ใช้ const [orders] = await pool.query( 'SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC', [userId] ); + // ดึงรายการสินค้าสำหรับแต่ละคำสั่งซื้อ for (let order of orders) { const [items] = await pool.query( `SELECT oi.*, p.product_name, p.image FROM order_items oi - JOIN products p ON oi.product_id = p.product_id + JOIN products p ON oi.book_id = p.product_id WHERE oi.order_id = ?`, [order.order_id] ); @@ -126,3 +126,6 @@ exports.orderHistory = async (req, res) => { res.status(500).send('เกิดข้อผิดพลาดในการดึงประวัติการสั่งซื้อ: ' + err.message); } }; + + + \ No newline at end of file