From d2a7a3e478abd94744cdfbd6dc37cffd6242c603 Mon Sep 17 00:00:00 2001 From: admin Date: Sat, 4 Oct 2025 17:26:36 +0700 Subject: [PATCH] feat(dashboard): backend Sequelize.js --- backend/src/db/sequelize copy.js | 71 ++++++++++++++++++++++++++++++++ backend/src/db/sequelize.js | 56 ++++++++++++++++++------- 2 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 backend/src/db/sequelize copy.js diff --git a/backend/src/db/sequelize copy.js b/backend/src/db/sequelize copy.js new file mode 100644 index 00000000..39e16066 --- /dev/null +++ b/backend/src/db/sequelize copy.js @@ -0,0 +1,71 @@ +// FILE: backend/src/db/sequelize.js +// “lazy-load” ตาม env ปลอดภัยกว่า และยังคง dbReady() ให้เรียกทดสอบได้ +// ใช้ได้เมื่อจำเป็น (เช่น งาน admin tool เฉพาะกิจ) +// ตั้ง ENABLE_SEQUELIZE=1 เพื่อเปิดใช้ Model loader; ไม่งั้นจะเป็นโหมดเบา ๆ +import { Sequelize } from "sequelize"; +import { config } from "../config.js"; + +export const sequelize = new Sequelize( + config.DB.NAME, + config.DB.USER, + config.DB.PASS, + { + host: config.DB.HOST, + port: config.DB.PORT, + dialect: "mariadb", + logging: false, + dialectOptions: { timezone: "Z" }, + define: { freezeTableName: true, underscored: false, timestamps: false }, + pool: { max: 10, min: 0, idle: 10000 }, + } +); + +export let User = null; +export let Role = null; +export let Permission = null; +export let UserRole = null; +export let RolePermission = null; + +if (process.env.ENABLE_SEQUELIZE === "1") { + // โหลดโมเดลแบบ on-demand เพื่อลดความเสี่ยง runtime หากไฟล์โมเดลไม่มี + const mdlUser = await import("./models/User.js").catch(() => null); + const mdlRole = await import("./models/Role.js").catch(() => null); + const mdlPerm = await import("./models/Permission.js").catch(() => null); + const mdlUR = await import("./models/UserRole.js").catch(() => null); + const mdlRP = await import("./models/RolePermission.js").catch(() => null); + + if (mdlUser?.default) User = mdlUser.default(sequelize); + if (mdlRole?.default) Role = mdlRole.default(sequelize); + if (mdlPerm?.default) Permission = mdlPerm.default(sequelize); + if (mdlUR?.default) UserRole = mdlUR.default(sequelize); + if (mdlRP?.default) RolePermission = mdlRP.default(sequelize); + + if (User && Role && Permission && UserRole && RolePermission) { + User.belongsToMany(Role, { + through: UserRole, + foreignKey: "user_id", + otherKey: "role_id", + }); + Role.belongsToMany(User, { + through: UserRole, + foreignKey: "role_id", + otherKey: "user_id", + }); + + Role.belongsToMany(Permission, { + through: RolePermission, + foreignKey: "role_id", + otherKey: "permission_id", + }); + Permission.belongsToMany(Role, { + through: RolePermission, + foreignKey: "permission_id", + otherKey: "role_id", + }); + } +} + +export async function dbReady() { + // โหมดเบา ๆ: แค่ทดสอบเชื่อมต่อ + await sequelize.authenticate(); +} diff --git a/backend/src/db/sequelize.js b/backend/src/db/sequelize.js index 39e16066..7de0ba86 100644 --- a/backend/src/db/sequelize.js +++ b/backend/src/db/sequelize.js @@ -20,52 +20,76 @@ export const sequelize = new Sequelize( } ); +// --- 1. ประกาศตัวแปรสำหรับ Export Model ทั้งหมด --- export let User = null; export let Role = null; export let Permission = null; export let UserRole = null; export let RolePermission = null; +export let Project = null; // <-- เพิ่มเข้ามา +export let UserProjectRole = null; // <-- เพิ่มเข้ามา if (process.env.ENABLE_SEQUELIZE === "1") { - // โหลดโมเดลแบบ on-demand เพื่อลดความเสี่ยง runtime หากไฟล์โมเดลไม่มี + // --- 2. โหลดโมเดลทั้งหมดแบบ on-demand --- const mdlUser = await import("./models/User.js").catch(() => null); const mdlRole = await import("./models/Role.js").catch(() => null); const mdlPerm = await import("./models/Permission.js").catch(() => null); const mdlUR = await import("./models/UserRole.js").catch(() => null); const mdlRP = await import("./models/RolePermission.js").catch(() => null); + const mdlProj = await import("./models/Project.js").catch(() => null); // <-- เพิ่มเข้ามา + const mdlUPR = await import("./models/UserProjectRole.js").catch(() => null); // <-- เพิ่มเข้ามา + // --- 3. Initialize Model ทั้งหมด --- if (mdlUser?.default) User = mdlUser.default(sequelize); if (mdlRole?.default) Role = mdlRole.default(sequelize); if (mdlPerm?.default) Permission = mdlPerm.default(sequelize); if (mdlUR?.default) UserRole = mdlUR.default(sequelize); if (mdlRP?.default) RolePermission = mdlRP.default(sequelize); + if (mdlProj?.default) Project = mdlProj.default(sequelize); // <-- เพิ่มเข้ามา + if (mdlUPR?.default) UserProjectRole = mdlUPR.default(sequelize); // <-- เพิ่มเข้ามา + // --- 4. สร้างความสัมพันธ์ (Associations) ทั้งหมด --- if (User && Role && Permission && UserRole && RolePermission) { - User.belongsToMany(Role, { - through: UserRole, - foreignKey: "user_id", - otherKey: "role_id", - }); - Role.belongsToMany(User, { - through: UserRole, - foreignKey: "role_id", - otherKey: "user_id", - }); - + // ความสัมพันธ์ระดับระบบ (System-level) + User.belongsToMany(Role, { through: UserRole, foreignKey: "user_id" }); + Role.belongsToMany(User, { through: UserRole, foreignKey: "role_id" }); Role.belongsToMany(Permission, { through: RolePermission, foreignKey: "role_id", - otherKey: "permission_id", }); Permission.belongsToMany(Role, { through: RolePermission, foreignKey: "permission_id", - otherKey: "role_id", }); } + + // ความสัมพันธ์ระดับโปรเจกต์ (Project-level) - ส่วนที่เพิ่มเข้ามา + if (User && Project && Role && UserProjectRole) { + // ทำให้ UserProjectRole เป็นตัวกลางเชื่อม 3 ตาราง + UserProjectRole.belongsTo(User, { foreignKey: "user_id" }); + UserProjectRole.belongsTo(Project, { foreignKey: "project_id" }); + UserProjectRole.belongsTo(Role, { foreignKey: "role_id" }); + + // ทำให้สามารถ include ข้อมูลที่เกี่ยวข้องได้ง่ายขึ้น + User.hasMany(UserProjectRole, { foreignKey: "user_id" }); + Project.hasMany(UserProjectRole, { foreignKey: "project_id" }); + Role.hasMany(UserProjectRole, { foreignKey: "role_id" }); + } } +/** + * ฟังก์ชันสำหรับทดสอบการเชื่อมต่อ Sequelize + */ export async function dbReady() { - // โหมดเบา ๆ: แค่ทดสอบเชื่อมต่อ - await sequelize.authenticate(); + if (process.env.ENABLE_SEQUELIZE !== "1") { + console.log("Sequelize is disabled."); + return Promise.resolve(); + } + try { + await sequelize.authenticate(); + console.log("Sequelize connection has been established successfully."); + } catch (error) { + console.error("Unable to connect to the database via Sequelize:", error); + return Promise.reject(error); + } }