Skip to main content

ทะเบียนโมดูลระบบ (System Module)

ภาพรวม

system_module คือตาราง master ที่ระบุว่าระบบนี้ประกอบด้วยโมดูลอะไรบ้าง เช่น campaign, rich-menu, form-builder, audiences เป็นต้น ทุกกลไกที่เกี่ยวกับสิทธิ์และการเปิด/ปิดฟีเจอร์ อ้างอิงกลับมาที่ตารางนี้ทั้งหมด

  • system_role_module อ้าง module_id เพื่อระบุสิทธิ์ตาม role
  • organization_module อ้าง module_id เพื่อ override สิทธิ์รายองค์กร
  • ModuleGate ใช้ค่า system_module.name เป็นคีย์ตรวจว่าโมดูลนั้นเปิดใช้งานอยู่หรือไม่

เนื่องจากเป็นข้อมูลระดับแพลตฟอร์ม ทุก endpoint ของโมดูลนี้จึงบังคับ SuperAdminGuard

Business Flow

  1. platform operator (roleId = 1) เข้าหน้าจัดการโมดูลใน cms-web
  2. GET /api/system-module แสดงรายการโมดูลทั้งหมด โดยกรอง soft delete ด้วยเงื่อนไข deleted_date IS NULL อัตโนมัติ
  3. GET /api/system-module/list-all-object คืนข้อมูลรูปแบบ {id: name} ซึ่งโมดูล user เรียกฟังก์ชัน FindAllObject นี้โดยตรงเพื่อแปลง module_id เป็นชื่อโมดูลใน permission response
  4. การเพิ่มโมดูลใหม่ทำผ่าน POST /api/system-module โดยชื่อที่ตั้งต้องตรงกับค่าที่ใช้ใน ModuleGate(d, "ชื่อโมดูล") มิฉะนั้น gate จะหาไม่เจอ
  5. การแก้ไขและลบทำผ่าน PUT /api/system-module/:id และ DELETE /api/system-module/:id (soft delete)
  6. ผลของการเพิ่มหรือแก้ไขจะไปปรากฏใน 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

MethodRouteHandlerPolicy (metadata)
GET/api/system-moduleh.findAllreadAll system_module
GET/api/system-module/list-all-objecth.findAllObjectreadAll system_module
GET/api/system-module/:idh.findOneread system_module
POST/api/system-moduleh.createcreate system_module
PUT/api/system-module/:idh.updateupdate system_module
DELETE/api/system-module/:idh.deletedelete system_module

ทุก route ใส่ auth.SuperAdmin() เป็น middleware โดย register บน authed.Group("/system-module")

ฟังก์ชันที่โมดูลอื่นเรียกใช้: systemmodule.Service.FindAllObject(ctx) ซึ่งคืน map จาก id ไปยัง name

จุดเชื่อมต่อกับ Service อื่น

  • Permissionauth.SuperAdmin() ทุก route โดย roleId ต้องเท่ากับ 1 มิฉะนั้นตอบกลับ 403 พร้อมข้อความ Forbidden resource
  • ตารางที่เกี่ยวข้องsystem_module ซึ่งถูกอ้างอิงจาก system_role_module และ organization_module
  • ผู้บริโภคข้อมูล — การจัดการผู้ใช้งาน CMS (ผ่าน FindPermissionByUserID), การตั้งค่าโมดูลรายองค์กร และ ModuleGate ที่ใช้ค่า name เป็นคีย์
  • หมายเหตุ — policy metadata ของ menu-builder ก็ใช้ PolicyModuleSystemModule ด้วย ตามที่ระบบ TypeScript เดิมกำหนดไว้