backend: Mod
This commit is contained in:
		
							
								
								
									
										150
									
								
								backend/src/db/sequelize.js
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										150
									
								
								backend/src/db/sequelize.js
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -5,11 +5,7 @@ | ||||
| import { Sequelize } from "sequelize"; | ||||
| import { config } from "../config.js"; | ||||
|  | ||||
| export const sequelize = new Sequelize( | ||||
|   config.DB.NAME, | ||||
|   config.DB.USER, | ||||
|   config.DB.PASS, | ||||
|   { | ||||
| export const sequelize = new Sequelize(config.DB.NAME, config.DB.USER, config.DB.PASS, { | ||||
|     host: config.DB.HOST, | ||||
|     port: config.DB.PORT, | ||||
|     dialect: "mariadb", | ||||
| @@ -17,79 +13,91 @@ export const sequelize = new Sequelize( | ||||
|     dialectOptions: { timezone: "Z" }, | ||||
|     define: { freezeTableName: true, underscored: false, timestamps: false }, | ||||
|     pool: { max: 10, min: 0, idle: 10000 }, | ||||
|   } | ||||
| ); | ||||
| }); | ||||
|  | ||||
| // --- 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; // <-- เพิ่มเข้ามา | ||||
| 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. โหลดโมเดลทั้งหมดแบบ 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); // <-- เพิ่มเข้ามา | ||||
|     // --- 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 ทั้งหมด --- | ||||
|   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); // <-- เพิ่มเข้ามา | ||||
|     // --- 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) ทั้งหมด --- | ||||
|   if (User && Role && Permission && UserRole && RolePermission) { | ||||
|     // ความสัมพันธ์ระดับระบบ (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", | ||||
|     }); | ||||
|     Permission.belongsToMany(Role, { | ||||
|       through: RolePermission, | ||||
|       foreignKey: "permission_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" }); | ||||
|   } | ||||
|     // --- 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * ฟังก์ชันสำหรับทดสอบการเชื่อมต่อ Sequelize | ||||
|  */ | ||||
| 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); | ||||
|   } | ||||
| } | ||||
|     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); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user