const express = require("express"); const mysql = require("mysql"); const bcrypt = require("bcryptjs"); const session = require("express-session"); const bodyParser = require("body-parser"); const path = require("path"); const { render } = require("ejs"); const createError = require("http-errors"); const cookieParser = require("cookie-parser"); const logger = require("morgan"); const flash = require("express-flash"); const connection = require("./lib/db"); const indexRouter = require("./routes/index"); const usersRouter = require("./routes/users"); const tasksRouter = require("./routes/tasks"); // const loginRouter = require("./routes/login"); require('dotenv').config() const app = express(); // MySQL Connection const db = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "work_collections", }); db.connect((err) => { if (err) throw err; console.log("MySQL Connected..."); }); //Setup middleware app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, "public"))); app.use( session({ cookie: { maxAge: 60000 }, // store: new session.MemoryStore(), saveUninitialized: true, //บันทึก session แม้ยังไม่มีข้อมู resave: false, secret: "secret", }) ); app.use(flash()); // กำหนดให้ express สามารถเข้าถึงไฟล์ static (เช่น รูปภาพ, CSS, JS) app.use(express.static(path.join(__dirname, "public"))); app.use("/", indexRouter); app.use("/users", usersRouter); app.use("/tasks", tasksRouter); //Set EJS as Template engine app.set("view engine", "ejs"); app.set("views", path.join(__dirname, "views")); // Middleware to check if the user is logged in function isAuthenticated(req, res, next) { if (req.session.user) { //มีการ login เข้ามา return next(); //เรียกใช้ฟังก์ชั่น next } else { res.redirect("/login"); //ถ้าไม่ได้ล็อคอิน จะไปที่หน้า login } } function ifLoggedIn(req, res, next) { if (req.session.user) { return res.redirect("/home"); } next(); } // ฟังก์ชันแปลง Position เป็น Department function getDepartment(position) { const departmentMap = { education: "กลุ่มงานสนับสนุนการพัฒนาศักยภาพนิสิตเพื่อการแข่งขันได้", manage: "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ", analysis: "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ", research: "กลุ่มงานสนับสนุนการบริหารงานและการบริการวิชาการมุ่งสู่ความเป็นเลิศ", computer: "กลุ่มงานสนับสนุนการบริหารระบบโครงสร้างพื้นฐาน", accountant: "กลุ่มงานสนับสนุนการบริหารสินทรัพย์เน้นหลักประสิทธิผลและความคุ้มค่า", supply: "กลุ่มงานสนับสนุนการบริหารสินทรัพย์เน้นหลักประสิทธิผลและความคุ้มค่า", technician: "กลุ่มงานสนับสนุนการบริหารระบบโครงสร้างพื้นฐาน", }; return departmentMap[position] || "ไม่ระบุหน่วยงาน"; } //Routes app.get("/", (req, res) => { res.render("index", { user: req.session.user }); }); app.get("/login", ifLoggedIn, (req, res) => { res.render("login"); }); app.get("/logout", (req, res) => { req.session.destroy(); res.redirect("/home"); }); //GET Route app.get("/register", ifLoggedIn, (req, res) => { res.render("register"); }); app.get("/home", isAuthenticated, (req, res) => { console.log(req.session.user); res.render("home", { user: req.session.user }); }); //POST Route app.post("/register", (req, res) => { const { name, username, email, password, position } = req.body; const checkEmailQuery = "SELECT * FROM users WHERE email = ?"; db.query(checkEmailQuery, [email], (err, result) => { if (err) throw err; if (result.length > 0) { return res.render("register", { error_msg: "มี Email นี้ในระบบแล้ว โปรดใช้ Email อื่น", }); } const hashedPassword = bcrypt.hashSync(password, 10); const insertUserQuery = "INSERT INTO users (name, username, email, password, position) VALUES(?, ?, ?, ?, ?)"; db.query( insertUserQuery, [name, username, email, hashedPassword, position], (err, result) => { if (err) throw err; // เพิ่มข้อมูลลงในตาราง employee const userId = result.insertId; // ID ของ user ที่พึ่งสมัคร const department = getDepartment(position); // แปลงตำแหน่งเป็น department const insertEmployeeQuery = "INSERT INTO employee (user_id, full_name, department) VALUES (?, ?, ?)"; db.query(insertEmployeeQuery, [userId, name, department], (err) => { if (err) throw err; res.render("register", { success_msg: "ลงทะเบียนสำเร็จ!" }); }); } ); }); }); app.post("/login", (req, res) => { const { user_input, password } = req.body; const bcrypt = require('bcrypt'); const plainPassword = ''; // รหัสผ่านที่ผู้ใช้ป้อน const saltRounds = 10; // จำนวน salt rounds (ระบุความยาก) bcrypt.hash(plainPassword, saltRounds, function(err, hash) { if(err) throw err; // บันทึก hash ลงในฐานข้อมูลแทนที่ hashed_password }); const sql = "SELECT * FROM users WHERE username = ? OR email = ?"; db.query(sql, [user_input, user_input], (err, result) => { if (err) throw err; if (result.length > 0) { const user = result[0]; if (bcrypt.compareSync(password, user.password)) { req.session.user = user; // เก็บข้อมูลผู้ใช้ใน session res.redirect("/home"); } else { res.render("login", { error_msg: "Incorrect password!" }); } } else { res.render("login", { error_msg: "User not found!" }); } }); }); app.listen(3000, () => { console.log("Server running on port 3000"); });