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,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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment