Skip to main content

ตั้งค่าโมดูลและโควตารายองค์กร (Platform Admin)

ภาพรวม

โมดูลนี้คือคอนโซลของ platform admin (onemoby) สำหรับกำกับดูแลลูกค้าแต่ละองค์กร มีหน้าที่ 2 เรื่องหลัก

  1. เปิด/ปิดโมดูล ให้แต่ละองค์กร โดยเขียนลงตาราง organization_module ซึ่งเป็นการ override สิทธิ์ baseline ที่มาจาก role
  2. ตั้งโควตา (plan limits) ให้แต่ละองค์กร โดยเขียนลงคอลัมน์ organization.plan_limits ซึ่งเป็น JSONB

ผลของการปิดโมดูลไม่ได้เป็นเพียงการซ่อนเมนูใน cms-web เท่านั้น เพราะ ModuleGate ฝั่ง server จะตอบกลับ 403 เมื่อมีการเรียก API ของโมดูลนั้นโดยตรงด้วย ทำให้การกำกับดูแลมีผลบังคับจริง ทุก endpoint ในโมดูลนี้บังคับ SuperAdminGuard

Business Flow

  1. GET /api/org-module-setting/organizations แสดงรายชื่อองค์กรทั้งหมดให้ platform admin เลือก
  2. GET /api/org-module-setting/:orgId ดูว่าองค์กรนี้เปิดโมดูลใดอยู่บ้าง โดย service รวมข้อมูล 2 ชั้นเข้าด้วยกัน คือ baseline จาก system_role_module และ override จาก organization_module
  3. PUT /api/org-module-setting/:orgId รับ payload {moduleIds, reset?}
    • ส่ง moduleIds เป็นรายการโมดูลที่ต้องการเปิด ระบบจะเขียนทับ organization_module
    • ส่ง reset: true เพื่อลบ override ทั้งหมดและกลับไปใช้ baseline ตาม role
  4. หลังจากนั้นคำขอทั้งหมดของผู้ใช้ประเภท customer ในองค์กรนั้นจะถูกกรองใหม่
    • GET /api/user/:id/permission คืนค่า override แทน baseline ทำให้เมนูใน cms-web เปลี่ยนตาม
    • ModuleGate บน route ของโมดูลที่ถูกปิดจะตอบ 403 พร้อมสถานะ ModuleDisabled
  5. GET /api/org-module-setting/:orgId/limits และ PUT /api/org-module-setting/:orgId/limits ใช้อ่านและตั้งค่าโควตา ค่าที่ไม่ได้ระบุจะ fallback ไปที่ DefaultPlanLimits
  6. หากส่ง :orgId ที่ไม่มีอยู่จริง ระบบจะตอบกลับ error organization not found

ไฟล์และฟังก์ชันหลัก

โค้ดอยู่ที่ internal/modules/orgmodulesetting/ ประกอบด้วย controller.go, service.go และ js.go

MethodRouteHandler
GET/api/org-module-setting/organizationslistOrganizations
GET/api/org-module-setting/:orgIdgetOrgModules
PUT/api/org-module-setting/:orgIdsetOrgModules
GET/api/org-module-setting/:orgId/limitsgetOrgLimits
PUT/api/org-module-setting/:orgId/limitssetOrgLimits

ทั้งหมด register บน group authed.Group("/org-module-setting", auth.SuperAdmin())

ฟังก์ชัน service ที่สำคัญ

  • ListOrganizations, GetOrgModules, SetOrgModules, GetOrgLimits, SetOrgLimits
  • IsModuleEnabledForOrg(ctx, orgID, moduleName) ที่ service.go:291 เป็น resolver กลาง ที่ทั้ง modulegate.ModuleGate และ user.FindPermissionByUserID เรียกใช้ร่วมกัน จึงรับประกันได้ว่าเมนูที่แสดงกับสิทธิ์ที่ API บังคับจะตรงกันเสมอ

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

  • Permissionauth.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