// 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 }, }); // --- 1. ประกาศตัวแปรสำหรับ Export Model ทั้งหมด --- export let User, Role, Permission, Organization, Project, UserRole, RolePermission, UserProjectRole, Correspondence, CorrespondenceVersion, Document, CorrDocumentMap, Drawing, DrawingRevision, FileObject, RFA, RFARevision, RfaDrawingMap, Transmittal, TransmittalItem, Volume, ContractDwg, SubCategory; if (process.env.ENABLE_SEQUELIZE === "1") { // --- 2. สร้าง Object ของ Models ทั้งหมดที่จะโหลด --- const modelsToLoad = { User: await import("./models/User.js").catch(() => null), Role: await import("./models/Role.js").catch(() => null), Permission: await import("./models/Permission.js").catch(() => null), Organization: await import("./models/Organization.js").catch(() => null), Project: await import("./models/Project.js").catch(() => null), UserRole: await import("./models/UserRole.js").catch(() => null), RolePermission: await import("./models/RolePermission.js").catch(() => null), UserProjectRole: await import("./models/UserProjectRole.js").catch(() => null), Correspondence: await import("./models/Correspondence.js").catch(() => null), CorrespondenceVersion: await import("./models/CorrespondenceVersion.js").catch(() => null), Document: await import("./models/Document.js").catch(() => null), CorrDocumentMap: await import("./models/CorrDocumentMap.js").catch(() => null), Drawing: await import("./models/Drawing.js").catch(() => null), DrawingRevision: await import("./models/DrawingRevision.js").catch(() => null), FileObject: await import("./models/FileObject.js").catch(() => null), RFA: await import("./models/RFA.js").catch(() => null), RFARevision: await import("./models/RFARevision.js").catch(() => null), RfaDrawingMap: await import("./models/RfaDrawingMap.js").catch(() => null), Transmittal: await import("./models/Transmittal.js").catch(() => null), TransmittalItem: await import("./models/TransmittalItem.js").catch(() => null), Volume: await import("./models/Volume.js").catch(() => null), ContractDwg: await import("./models/ContractDwg.js").catch(() => null), SubCategory: await import("./models/SubCategory.js").catch(() => null), }; // --- 3. Initialize Model ทั้งหมด --- User = modelsToLoad.User?.default ? modelsToLoad.User.default(sequelize) : null; Role = modelsToLoad.Role?.default ? modelsToLoad.Role.default(sequelize) : null; Permission = modelsToLoad.Permission?.default ? modelsToLoad.Permission.default(sequelize) : null; Organization = modelsToLoad.Organization?.default ? modelsToLoad.Organization.default(sequelize) : null; Project = modelsToLoad.Project?.default ? modelsToLoad.Project.default(sequelize) : null; UserRole = modelsToLoad.UserRole?.default ? modelsToLoad.UserRole.default(sequelize) : null; RolePermission = modelsToLoad.RolePermission?.default ? modelsToLoad.RolePermission.default(sequelize) : null; UserProjectRole = modelsToLoad.UserProjectRole?.default ? modelsToLoad.UserProjectRole.default(sequelize) : null; Correspondence = modelsToLoad.Correspondence?.default ? modelsToLoad.Correspondence.default(sequelize) : null; CorrespondenceVersion = modelsToLoad.CorrespondenceVersion?.default ? modelsToLoad.CorrespondenceVersion.default(sequelize) : null; Document = modelsToLoad.Document?.default ? modelsToLoad.Document.default(sequelize) : null; CorrDocumentMap = modelsToLoad.CorrDocumentMap?.default ? modelsToLoad.CorrDocumentMap.default(sequelize) : null; Drawing = modelsToLoad.Drawing?.default ? modelsToLoad.Drawing.default(sequelize) : null; DrawingRevision = modelsToLoad.DrawingRevision?.default ? modelsToLoad.DrawingRevision.default(sequelize) : null; FileObject = modelsToLoad.FileObject?.default ? modelsToLoad.FileObject.default(sequelize) : null; RFA = modelsToLoad.RFA?.default ? modelsToLoad.RFA.default(sequelize) : null; RFARevision = modelsToLoad.RFARevision?.default ? modelsToLoad.RFARevision.default(sequelize) : null; RfaDrawingMap = modelsToLoad.RfaDrawingMap?.default ? modelsToLoad.RfaDrawingMap.default(sequelize) : null; Transmittal = modelsToLoad.Transmittal?.default ? modelsToLoad.Transmittal.default(sequelize) : null; TransmittalItem = modelsToLoad.TransmittalItem?.default ? modelsToLoad.TransmittalItem.default(sequelize) : null; Volume = modelsToLoad.Volume?.default ? modelsToLoad.Volume.default(sequelize) : null; ContractDwg = modelsToLoad.ContractDwg?.default ? modelsToLoad.ContractDwg.default(sequelize) : null; SubCategory = modelsToLoad.SubCategory?.default ? modelsToLoad.SubCategory.default(sequelize) : null; // --- 4. สร้างความสัมพันธ์ (Associations) --- const loadedModels = { User, Role, Permission, Organization, Project, UserRole, RolePermission, UserProjectRole, Correspondence, CorrespondenceVersion, Document, CorrDocumentMap, Drawing, DrawingRevision, FileObject, RFA, RFARevision, RfaDrawingMap, Transmittal, TransmittalItem, Volume, ContractDwg, SubCategory }; for (const modelName in loadedModels) { if (loadedModels[modelName] && loadedModels[modelName].associate) { loadedModels[modelName].associate(loadedModels); } } } export async function dbReady() { 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); } }