ทะเบียนโมดูลระบบ (System Module)
ภาพรวม
system_module คือตาราง master ที่ระบุว่าระบบนี้ประกอบด้วยโมดูลอะไรบ้าง เช่น campaign,
rich-menu, form-builder, audiences เป็นต้น ทุกกลไกที่เกี่ยวกับสิทธิ์และการเปิด/ปิดฟีเจอร์
อ้างอิงกลับมาที่ตารางนี้ทั้งหมด
system_role_moduleอ้างmodule_idเพื่อระบุสิทธิ์ตาม roleorganization_moduleอ้างmodule_idเพื่อ override สิทธิ์รายองค์กรModuleGateใช้ค่าsystem_module.nameเป็นคีย์ตรวจว่าโมดูลนั้นเปิดใช้งานอยู่หรือไม่
เนื่องจากเป็นข้อมูลระดับแพลตฟอร์ม ทุก endpoint ของโมดูลนี้จึงบังคับ SuperAdminGuard
Business Flow
- platform operator (
roleId = 1) เข้าหน้าจัดการโมดูลใน cms-web GET /api/system-moduleแสดงรายการโมดูลทั้งหมด โดยกรอง soft delete ด้วยเงื่อนไขdeleted_date IS NULLอัตโนมัติGET /api/system-module/list-all-objectคืนข้อมูลรูปแบบ{id: name}ซึ่งโมดูล user เรียกฟังก์ชันFindAllObjectนี้โดยตรงเพื่อแปลงmodule_idเป็นชื่อโมดูลใน permission response- การเพิ่มโมดูลใหม่ทำผ่าน
POST /api/system-moduleโดยชื่อที่ตั้งต้องตรงกับค่าที่ใช้ในModuleGate(d, "ชื่อโมดูล")มิฉะนั้น gate จะหาไม่เจอ - การแก้ไขและลบทำผ่าน
PUT /api/system-module/:idและDELETE /api/system-module/:id(soft delete) - ผลของการเพิ่มหรือแก้ไขจะไปปรากฏใน dropdown ของหน้าตั้งค่าโมดูลรายองค์กร ที่ platform admin ใช้เปิด/ปิดโมดูลให้แต่ละองค์กร
หมายเหตุด้าน parity: entity SystemModule มี @DeleteDateColumn จริง ฝั่ง GORM จึงเติมเงื่อนไข
deleted_date IS NULL ให้อัตโนมัติผ่าน gorm.DeletedAt แต่ในกรณีของ update() และ softDelete()
ต้องใช้ Unscoped() เพราะ TypeORM ไม่ได้ใส่ filter ในสองกรณีนี้
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/systemmodule/ ประกอบด้วย controller.go, service.go และ dto.go
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/system-module | h.findAll | readAll system_module |
| GET | /api/system-module/list-all-object | h.findAllObject | readAll system_module |
| GET | /api/system-module/:id | h.findOne | read system_module |
| POST | /api/system-module | h.create | create system_module |
| PUT | /api/system-module/:id | h.update | update system_module |
| DELETE | /api/system-module/:id | h.delete | delete system_module |
ทุก route ใส่ auth.SuperAdmin() เป็น middleware โดย register บน authed.Group("/system-module")
ฟังก์ชันที่โมดูลอื่นเรียกใช้: systemmodule.Service.FindAllObject(ctx) ซึ่งคืน map จาก id ไปยัง name
จุดเชื่อมต่อกับ Service อื่น
- Permission —
auth.SuperAdmin()ทุก route โดยroleIdต้องเท่ากับ 1 มิฉะนั้นตอบกลับ 403 พร้อมข้อความForbidden resource - ตารางที่เกี่ยวข้อง —
system_moduleซึ่งถูกอ้างอิงจากsystem_role_moduleและorganization_module - ผู้บริโภคข้อมูล — การจัดการผู้ใช้งาน CMS (ผ่าน
FindPermissionByUserID), การตั้งค่าโมดูลรายองค์กร และModuleGateที่ใช้ค่าnameเป็นคีย์ - หมายเหตุ — policy metadata ของ menu-builder ก็ใช้
PolicyModuleSystemModuleด้วย ตามที่ระบบ TypeScript เดิมกำหนดไว้