require('dotenv').config(); // โหลดค่าตัวแปรจากไฟล์ .env const express = require('express'); const mysql = require('mysql2/promise'); const bcrypt = require('bcryptjs'); const session = require('express-session'); const cookieParser = require('cookie-parser'); const app = express(); // ต้องมีการสร้าง express app // Middleware สำหรับ parse cookie และ JSON app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cookieParser()); // Session configuration app.use(session({ secret: process.env.DB_SESSION || 'melon', resave: false, saveUninitialized: true, cookie: { secure: process.env.NODE_ENV === 'production', // secure เมื่อเป็น production mode httpOnly: true, // ป้องกันการเข้าถึงผ่าน JavaScript maxAge: 1000 * 60 * 60 * 24 // อายุของ session (1 วัน) } })); // Database configuration const pool = mysql.createPool({ host: process.env.DB_HOST || "10.104.20.74", port: process.env.DB_PORT || "3306", user: process.env.DB_USER || "root", password: process.env.DB_PASSWORD || "TNSypb73606", database: process.env.DB_NAME || "project", waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); // ทดสอบการเชื่อมต่อกับฐานข้อมูล pool.getConnection() .then(connection => { console.log('✅ Database connected successfully!'); connection.release(); }) .catch(err => { console.error('❌ Database connection failed:', err); process.exit(1); // หยุดโปรแกรมหากเชื่อมต่อไม่สำเร็จ }); // ตัวอย่าง route ทดสอบ app.get('/', (req, res) => { if (req.session.user) { res.sendFile(path.join(__dirname, 'public', 'index.html')); } else { res.redirect('/login'); } }); const path = require('path'); app.get('/login', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'login.html')); }); app.post('/register', async (req, res) => { const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ error: 'All fields are required' }); } try { // ตรวจสอบว่า email มีอยู่แล้วหรือไม่ const [existingUser] = await pool.query( 'SELECT * FROM users WHERE email = ?', [email] ); if (existingUser.length > 0) { return res.status(400).json({ error: 'Email already exists' }); } // เข้ารหัสรหัสผ่านด้วย bcryptjs const hashedPassword = await bcrypt.hash(password, 10); // เพิ่มข้อมูลลงฐานข้อมูล (ใช้แค่ email และ password) await pool.query( 'INSERT INTO users (email, password) VALUES (?, ?)', [email, hashedPassword] ); res.status(201).json({ message: 'User registered successfully' }); } catch (error) { console.error('❌ Registration failed:', error); res.status(500).json({ error: 'Registration failed' }); } }); app.post('/login', async (req, res) => { const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ error: 'All fields are required' }); } try { // ค้นหาผู้ใช้จาก email const [user] = await pool.query( 'SELECT * FROM users WHERE email = ?', [email] ); if (user.length === 0) { return res.status(404).json({ error: 'User not found' }); } // ตรวจสอบรหัสผ่าน const isMatch = await bcrypt.compare(password, user[0].password); if (!isMatch) { return res.status(401).json({ error: 'Invalid password' }); } // สร้าง session ให้กับผู้ใช้ req.session.user = { id: user[0].user_id, email: user[0].email }; res.status(200).json({ message: 'Login successful', user: req.session.user }); } catch (error) { console.error('❌ Login failed:', error); res.status(500).json({ error: 'Login failed' }); } }); app.post('/logout', (req, res) => { req.session.destroy(err => { if (err) { console.error('❌ Logout failed:', err); return res.status(500).json({ error: 'Logout failed' }); } res.clearCookie('connect.sid'); res.status(200).json({ message: 'Logout successful' }); }); }); const isAuthenticated = (req, res, next) => { if (req.session.user) { next(); } else { res.status(401).json({ error: 'Unauthorized' }); } }; app.get('/dashboard', isAuthenticated, (req, res) => { res.status(200).json({ message: `Welcome ${req.session.user.username}` }); }); // Start the server const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`🚀 Server started on port ${port}`); });