From 969ccb688cf85871e1a4552c400159c516ada46b Mon Sep 17 00:00:00 2001 From: 65160270 <65160270@go.buu.ac.th> Date: Wed, 26 Mar 2025 07:42:38 +0000 Subject: [PATCH] Edit server.js --- server.js | 143 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 59 deletions(-) diff --git a/server.js b/server.js index bc89235..4c2dc8d 100644 --- a/server.js +++ b/server.js @@ -2,41 +2,53 @@ const express = require("express"); const path = require("path"); const session = require("express-session"); const bcrypt = require("bcrypt"); +const multer = require("multer"); // ใช้สำหรับอัปโหลดไฟล์ const pool = require("./config/database"); require("dotenv").config(); const app = express(); -const MySQLStore = require('express-mysql-session')(session); -const sessionStore = new MySQLStore({ - clearExpired: true, - checkExpirationInterval: 900000, - expiration: 86400000 -}, pool); +// ตั้งค่า Multer สำหรับอัปโหลดไฟล์ +const upload = multer({ dest: "public/uploads/" }); + +// ตั้งค่า MySQL Session Store +const MySQLStore = require("express-mysql-session")(session); +const sessionStore = new MySQLStore( + { + clearExpired: true, + checkExpirationInterval: 900000, + expiration: 86400000, + }, + pool +); const isLoggedIn = (req, res, next) => { if (req.session.user) { next(); } else { - res.redirect('/login'); + res.redirect("/login"); } }; -app.use(session({ - secret: process.env.SESSION_SECRET || "mysecret", - resave: false, - saveUninitialized: false, - store: sessionStore, - cookie: { - maxAge: 24 * 60 * 60 * 1000, - secure: false, - httpOnly: true, - }, -})); +// ตั้งค่า Session Middleware +app.use( + session({ + secret: process.env.SESSION_SECRET || "mysecret", + resave: false, + saveUninitialized: false, + store: sessionStore, + cookie: { + maxAge: 24 * 60 * 60 * 1000, + secure: false, + httpOnly: true, + }, + }) +); app.use(express.static(path.join(__dirname, "public"))); app.use(express.json()); app.use(express.urlencoded({ extended: true })); + app.use((req, res, next) => { console.log("🔹 Session Data:", req.session); next(); @@ -49,33 +61,24 @@ const orderRoutes = require("./shop-routes/order"); const cartRoutes = require("./shop-routes/cart"); const indexRoutes = require("./shop-routes/index"); -app.use((req, res, next) => { - res.locals.session = req.session; - next(); -}); - app.use("/", indexRoutes); app.use("/cart", cartRoutes); app.use("/order", orderRoutes); -app.get('/order/checkout', isLoggedIn, (req, res) => { - res.render('checkout'); +// Checkout (ต้องล็อกอิน) +app.get("/order/checkout", isLoggedIn, (req, res) => { + res.render("checkout"); }); +//อัปเดตตะกร้าสินค้า app.post("/cart/update", async (req, res) => { try { const { cartItemId, quantity } = req.body; - if (quantity < 1) { return res.status(400).json({ message: "Quantity must be at least 1" }); } - // อัปเดตจำนวนสินค้าในฐานข้อมูล - await pool.execute( - "UPDATE cart SET quantity = ? WHERE id = ?", - [quantity, cartItemId] - ); - + await pool.execute("UPDATE cart SET quantity = ? WHERE id = ?", [quantity, cartItemId]); res.json({ success: true, message: "Cart updated" }); } catch (error) { console.error("Update error:", error); @@ -83,8 +86,9 @@ app.post("/cart/update", async (req, res) => { } }); -app.get('/register', (req, res) => { - res.render('register'); +// Register +app.get("/register", (req, res) => { + res.render("register"); }); app.post("/register", async (req, res) => { @@ -93,14 +97,14 @@ app.post("/register", async (req, res) => { if (!email || !password || !name) { return res.status(400).json({ message: "All fields are required." }); } - + const hashedPassword = await bcrypt.hash(password, 10); const [existingUser] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]); - + if (existingUser.length > 0) { return res.status(400).json({ message: "Email is already registered." }); } - + await pool.execute("INSERT INTO users (email, password, name) VALUES (?, ?, ?)", [email, hashedPassword, name]); res.status(201).json({ success: true, message: "Registration successful." }); } catch (error) { @@ -108,8 +112,9 @@ app.post("/register", async (req, res) => { } }); -app.get('/login', (req, res) => { - res.render('login'); +// 🔹 Login +app.get("/login", (req, res) => { + res.render("login"); }); app.post("/login", async (req, res) => { @@ -118,12 +123,12 @@ app.post("/login", async (req, res) => { if (!email || !password) { return res.status(400).json({ message: "All fields are required." }); } - + const [users] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]); if (users.length === 0) { return res.status(400).json({ message: "Invalid email or password." }); } - + const user = users[0]; const passwordMatch = await bcrypt.compare(password, user.password); if (!passwordMatch) { @@ -133,13 +138,13 @@ app.post("/login", async (req, res) => { req.session.user = { id: user.id, email: user.email }; console.log("User logged in:", req.session); - return res.redirect('/order/checkout'); + return res.redirect("/order/checkout"); } catch (error) { res.status(500).json({ message: "Login failed." }); } }); -// Logout Routes +// Logout app.get("/logout", (req, res) => { if (!req.session) { return res.redirect("/login"); @@ -148,26 +153,13 @@ app.get("/logout", (req, res) => { if (err) { return res.status(500).json({ message: "Logout failed." }); } - res.clearCookie('connect.sid'); + res.clearCookie("connect.sid"); console.log("User logged out."); res.redirect("/login"); }); }); -app.post("/logout", (req, res) => { - if (!req.session) { - return res.status(400).json({ message: "No active session." }); - } - req.session.destroy(err => { - if (err) { - return res.status(500).json({ message: "Logout failed." }); - } - res.clearCookie('connect.sid'); - console.log("User logged out (POST)"); - res.status(200).json({ message: "Logged out successfully" }); - }); -}); - +// Search Products app.get("/search", async (req, res) => { const searchQuery = req.query.query; try { @@ -181,9 +173,42 @@ app.get("/search", async (req, res) => { } }); +// API: เพิ่มสินค้า +app.post("/api/products", upload.single("image"), async (req, res) => { + try { + const { name, description, price, stock } = req.body; + if (!name || !description || !price || !stock) { + return res.status(400).json({ message: "All fields are required." }); + } + + const imageUrl = req.file ? `/uploads/${req.file.filename}` : null; + await pool.execute("INSERT INTO products (name, description, price, stock, image) VALUES (?, ?, ?, ?, ?)", + [name, description, price, stock, imageUrl] + ); + + res.status(201).json({ success: true, message: "Product added successfully." }); + } catch (error) { + console.error("Error adding product:", error); + res.status(500).json({ message: "Failed to add product." }); + } +}); + +// API: ดึงรายการสินค้า +app.get("/api/products", async (req, res) => { + try { + const [products] = await pool.execute("SELECT * FROM products"); + res.json(products); + } catch (error) { + console.error("Error fetching products:", error); + res.status(500).json({ message: "Failed to fetch products." }); + } +}); + +// Middleware สำหรับจัดการข้อผิดพลาด app.use((err, req, res, next) => { res.status(500).json({ message: "Something went wrong." }); }); +// Start Server const PORT = process.env.PORT || 3000; -app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); \ No newline at end of file +app.listen(PORT, () => console.log(` Server running on port ${PORT}`)); \ No newline at end of file -- GitLab