ตั้งค่าโมดูลและโควตารายองค์กร (Platform Admin)
ภาพรวม
โมดูลนี้คือคอนโซลของ platform admin (onemoby) สำหรับกำกับดูแลลูกค้าแต่ละองค์กร มีหน้าที่ 2 เรื่องหลัก
- เปิด/ปิดโมดูล ให้แต่ละองค์กร โดยเขียนลงตาราง
organization_moduleซึ่งเป็นการ override สิทธิ์ baseline ที่มาจาก role - ตั้งโควตา (plan limits) ให้แต่ละองค์กร โดยเขียนลงคอลัมน์
organization.plan_limitsซึ่งเป็น JSONB
ผลของการปิดโมดูลไม่ได้เป็นเพียงการซ่อนเมนูใน cms-web เท่านั้น เพราะ ModuleGate ฝั่ง server
จะตอบกลับ 403 เมื่อมีการเรียก API ของโมดูลนั้นโดยตรงด้วย ทำให้การกำกับดูแลมีผลบังคับจริง
ทุก endpoint ในโมดูลนี้บังคับ SuperAdminGuard
Business Flow
GET /api/org-module-setting/organizationsแสดงรายชื่อองค์กรทั้งหมดให้ platform admin เลือกGET /api/org-module-setting/:orgIdดูว่าองค์กรนี้เปิดโมดูลใดอยู่บ้าง โดย service รวมข้อมูล 2 ชั้นเข้าด้วยกัน คือ baseline จากsystem_role_moduleและ override จากorganization_modulePUT /api/org-module-setting/:orgIdรับ payload{moduleIds, reset?}- ส่ง
moduleIdsเป็นรายการโมดูลที่ต้องการเปิด ระบบจะเขียนทับorganization_module - ส่ง
reset: trueเพื่อลบ override ทั้งหมดและกลับไปใช้ baseline ตาม role
- ส่ง
- หลังจากนั้นคำขอทั้งหมดของผู้ใช้ประเภท
customerในองค์กรนั้นจะถูกกรองใหม่GET /api/user/:id/permissionคืนค่า override แทน baseline ทำให้เมนูใน cms-web เปลี่ยนตามModuleGateบน route ของโมดูลที่ถูกปิดจะตอบ 403 พร้อมสถานะModuleDisabled
GET /api/org-module-setting/:orgId/limitsและPUT /api/org-module-setting/:orgId/limitsใช้อ่านและตั้งค่าโควตา ค่าที่ไม่ได้ระบุจะ fallback ไปที่DefaultPlanLimits- หากส่ง
:orgIdที่ไม่มีอยู่จริง ระบบจะตอบกลับ error organization not found
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/orgmodulesetting/ ประกอบด้วย controller.go, service.go และ js.go
| Method | Route | Handler |
|---|---|---|
| GET | /api/org-module-setting/organizations | listOrganizations |
| GET | /api/org-module-setting/:orgId | getOrgModules |
| PUT | /api/org-module-setting/:orgId | setOrgModules |
| GET | /api/org-module-setting/:orgId/limits | getOrgLimits |
| PUT | /api/org-module-setting/:orgId/limits | setOrgLimits |
ทั้งหมด register บน group authed.Group("/org-module-setting", auth.SuperAdmin())
ฟังก์ชัน service ที่สำคัญ
ListOrganizations,GetOrgModules,SetOrgModules,GetOrgLimits,SetOrgLimitsIsModuleEnabledForOrg(ctx, orgID, moduleName)ที่service.go:291เป็น resolver กลาง ที่ทั้งmodulegate.ModuleGateและuser.FindPermissionByUserIDเรียกใช้ร่วมกัน จึงรับประกันได้ว่าเมนูที่แสดงกับสิทธิ์ที่ API บังคับจะตรงกันเสมอ
จุดเชื่อมต่อกับ Service อื่น
- Permission —
auth.SuperAdmin()(roleId == 1) ทุก route - ตารางที่เกี่ยวข้อง —
organization,organization_module,system_module,system_role_module - Cross-module — ใช้
planlimits.Serviceสำหรับคำนวณ effective limits - ผู้บริโภค resolver นี้ — กลไก permission และ module gate รวมถึงการจัดการผู้ใช้งาน CMS
- เอกสารออกแบบต้นทาง —
docs/superpowers/specs/2026-07-26-platform-admin-design.md