feat(dashboard): backend Sequelize.js
This commit is contained in:
71
backend/src/db/sequelize copy.js
Normal file
71
backend/src/db/sequelize copy.js
Normal file
@@ -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();
|
||||||
|
}
|
||||||
@@ -20,52 +20,76 @@ export const sequelize = new Sequelize(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// --- 1. ประกาศตัวแปรสำหรับ Export Model ทั้งหมด ---
|
||||||
export let User = null;
|
export let User = null;
|
||||||
export let Role = null;
|
export let Role = null;
|
||||||
export let Permission = null;
|
export let Permission = null;
|
||||||
export let UserRole = null;
|
export let UserRole = null;
|
||||||
export let RolePermission = null;
|
export let RolePermission = null;
|
||||||
|
export let Project = null; // <-- เพิ่มเข้ามา
|
||||||
|
export let UserProjectRole = null; // <-- เพิ่มเข้ามา
|
||||||
|
|
||||||
if (process.env.ENABLE_SEQUELIZE === "1") {
|
if (process.env.ENABLE_SEQUELIZE === "1") {
|
||||||
// โหลดโมเดลแบบ on-demand เพื่อลดความเสี่ยง runtime หากไฟล์โมเดลไม่มี
|
// --- 2. โหลดโมเดลทั้งหมดแบบ on-demand ---
|
||||||
const mdlUser = await import("./models/User.js").catch(() => null);
|
const mdlUser = await import("./models/User.js").catch(() => null);
|
||||||
const mdlRole = await import("./models/Role.js").catch(() => null);
|
const mdlRole = await import("./models/Role.js").catch(() => null);
|
||||||
const mdlPerm = await import("./models/Permission.js").catch(() => null);
|
const mdlPerm = await import("./models/Permission.js").catch(() => null);
|
||||||
const mdlUR = await import("./models/UserRole.js").catch(() => null);
|
const mdlUR = await import("./models/UserRole.js").catch(() => null);
|
||||||
const mdlRP = await import("./models/RolePermission.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 (mdlUser?.default) User = mdlUser.default(sequelize);
|
||||||
if (mdlRole?.default) Role = mdlRole.default(sequelize);
|
if (mdlRole?.default) Role = mdlRole.default(sequelize);
|
||||||
if (mdlPerm?.default) Permission = mdlPerm.default(sequelize);
|
if (mdlPerm?.default) Permission = mdlPerm.default(sequelize);
|
||||||
if (mdlUR?.default) UserRole = mdlUR.default(sequelize);
|
if (mdlUR?.default) UserRole = mdlUR.default(sequelize);
|
||||||
if (mdlRP?.default) RolePermission = mdlRP.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) {
|
if (User && Role && Permission && UserRole && RolePermission) {
|
||||||
User.belongsToMany(Role, {
|
// ความสัมพันธ์ระดับระบบ (System-level)
|
||||||
through: UserRole,
|
User.belongsToMany(Role, { through: UserRole, foreignKey: "user_id" });
|
||||||
foreignKey: "user_id",
|
Role.belongsToMany(User, { through: UserRole, foreignKey: "role_id" });
|
||||||
otherKey: "role_id",
|
|
||||||
});
|
|
||||||
Role.belongsToMany(User, {
|
|
||||||
through: UserRole,
|
|
||||||
foreignKey: "role_id",
|
|
||||||
otherKey: "user_id",
|
|
||||||
});
|
|
||||||
|
|
||||||
Role.belongsToMany(Permission, {
|
Role.belongsToMany(Permission, {
|
||||||
through: RolePermission,
|
through: RolePermission,
|
||||||
foreignKey: "role_id",
|
foreignKey: "role_id",
|
||||||
otherKey: "permission_id",
|
|
||||||
});
|
});
|
||||||
Permission.belongsToMany(Role, {
|
Permission.belongsToMany(Role, {
|
||||||
through: RolePermission,
|
through: RolePermission,
|
||||||
foreignKey: "permission_id",
|
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() {
|
export async function dbReady() {
|
||||||
// โหมดเบา ๆ: แค่ทดสอบเชื่อมต่อ
|
if (process.env.ENABLE_SEQUELIZE !== "1") {
|
||||||
await sequelize.authenticate();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user