Gitlab@Informatics

Skip to content
Snippets Groups Projects
Commit 969ccb68 authored by 65160270's avatar 65160270
Browse files

Edit server.js

parent a69a1bbf
No related branches found
No related tags found
No related merge requests found
...@@ -2,27 +2,37 @@ const express = require("express"); ...@@ -2,27 +2,37 @@ const express = require("express");
const path = require("path"); const path = require("path");
const session = require("express-session"); const session = require("express-session");
const bcrypt = require("bcrypt"); const bcrypt = require("bcrypt");
const multer = require("multer"); // ใช้สำหรับอัปโหลดไฟล์
const pool = require("./config/database"); const pool = require("./config/database");
require("dotenv").config(); require("dotenv").config();
const app = express(); const app = express();
const MySQLStore = require('express-mysql-session')(session); // ตั้งค่า Multer สำหรับอัปโหลดไฟล์
const sessionStore = new MySQLStore({ const upload = multer({ dest: "public/uploads/" });
// ตั้งค่า MySQL Session Store
const MySQLStore = require("express-mysql-session")(session);
const sessionStore = new MySQLStore(
{
clearExpired: true, clearExpired: true,
checkExpirationInterval: 900000, checkExpirationInterval: 900000,
expiration: 86400000 expiration: 86400000,
}, pool); },
pool
);
const isLoggedIn = (req, res, next) => { const isLoggedIn = (req, res, next) => {
if (req.session.user) { if (req.session.user) {
next(); next();
} else { } else {
res.redirect('/login'); res.redirect("/login");
} }
}; };
app.use(session({ // ตั้งค่า Session Middleware
app.use(
session({
secret: process.env.SESSION_SECRET || "mysecret", secret: process.env.SESSION_SECRET || "mysecret",
resave: false, resave: false,
saveUninitialized: false, saveUninitialized: false,
...@@ -32,11 +42,13 @@ app.use(session({ ...@@ -32,11 +42,13 @@ app.use(session({
secure: false, secure: false,
httpOnly: true, httpOnly: true,
}, },
})); })
);
app.use(express.static(path.join(__dirname, "public"))); app.use(express.static(path.join(__dirname, "public")));
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ extended: true })); app.use(express.urlencoded({ extended: true }));
app.use((req, res, next) => { app.use((req, res, next) => {
console.log("🔹 Session Data:", req.session); console.log("🔹 Session Data:", req.session);
next(); next();
...@@ -49,33 +61,24 @@ const orderRoutes = require("./shop-routes/order"); ...@@ -49,33 +61,24 @@ const orderRoutes = require("./shop-routes/order");
const cartRoutes = require("./shop-routes/cart"); const cartRoutes = require("./shop-routes/cart");
const indexRoutes = require("./shop-routes/index"); const indexRoutes = require("./shop-routes/index");
app.use((req, res, next) => {
res.locals.session = req.session;
next();
});
app.use("/", indexRoutes); app.use("/", indexRoutes);
app.use("/cart", cartRoutes); app.use("/cart", cartRoutes);
app.use("/order", orderRoutes); app.use("/order", orderRoutes);
app.get('/order/checkout', isLoggedIn, (req, res) => { // Checkout (ต้องล็อกอิน)
res.render('checkout'); app.get("/order/checkout", isLoggedIn, (req, res) => {
res.render("checkout");
}); });
//อัปเดตตะกร้าสินค้า
app.post("/cart/update", async (req, res) => { app.post("/cart/update", async (req, res) => {
try { try {
const { cartItemId, quantity } = req.body; const { cartItemId, quantity } = req.body;
if (quantity < 1) { if (quantity < 1) {
return res.status(400).json({ message: "Quantity must be at least 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" }); res.json({ success: true, message: "Cart updated" });
} catch (error) { } catch (error) {
console.error("Update error:", error); console.error("Update error:", error);
...@@ -83,8 +86,9 @@ app.post("/cart/update", async (req, res) => { ...@@ -83,8 +86,9 @@ app.post("/cart/update", async (req, res) => {
} }
}); });
app.get('/register', (req, res) => { // Register
res.render('register'); app.get("/register", (req, res) => {
res.render("register");
}); });
app.post("/register", async (req, res) => { app.post("/register", async (req, res) => {
...@@ -108,8 +112,9 @@ app.post("/register", async (req, res) => { ...@@ -108,8 +112,9 @@ app.post("/register", async (req, res) => {
} }
}); });
app.get('/login', (req, res) => { // 🔹 Login
res.render('login'); app.get("/login", (req, res) => {
res.render("login");
}); });
app.post("/login", async (req, res) => { app.post("/login", async (req, res) => {
...@@ -133,13 +138,13 @@ app.post("/login", async (req, res) => { ...@@ -133,13 +138,13 @@ app.post("/login", async (req, res) => {
req.session.user = { id: user.id, email: user.email }; req.session.user = { id: user.id, email: user.email };
console.log("User logged in:", req.session); console.log("User logged in:", req.session);
return res.redirect('/order/checkout'); return res.redirect("/order/checkout");
} catch (error) { } catch (error) {
res.status(500).json({ message: "Login failed." }); res.status(500).json({ message: "Login failed." });
} }
}); });
// Logout Routes // Logout
app.get("/logout", (req, res) => { app.get("/logout", (req, res) => {
if (!req.session) { if (!req.session) {
return res.redirect("/login"); return res.redirect("/login");
...@@ -148,26 +153,13 @@ app.get("/logout", (req, res) => { ...@@ -148,26 +153,13 @@ app.get("/logout", (req, res) => {
if (err) { if (err) {
return res.status(500).json({ message: "Logout failed." }); return res.status(500).json({ message: "Logout failed." });
} }
res.clearCookie('connect.sid'); res.clearCookie("connect.sid");
console.log("User logged out."); console.log("User logged out.");
res.redirect("/login"); res.redirect("/login");
}); });
}); });
app.post("/logout", (req, res) => { // Search Products
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" });
});
});
app.get("/search", async (req, res) => { app.get("/search", async (req, res) => {
const searchQuery = req.query.query; const searchQuery = req.query.query;
try { try {
...@@ -181,9 +173,42 @@ app.get("/search", async (req, res) => { ...@@ -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) => { app.use((err, req, res, next) => {
res.status(500).json({ message: "Something went wrong." }); res.status(500).json({ message: "Something went wrong." });
}); });
// Start Server
const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(` Server running on port ${PORT}`)); app.listen(PORT, () => console.log(` Server running on port ${PORT}`));
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment