โควตาการใช้งานตามแพ็กเกจ (Plan Limits)
ภาพรวม
Plan Limits คือกลไกจำกัดปริมาณทรัพยากรที่แต่ละองค์กรสร้างได้ เช่น จำนวน audience,
workflow ที่ active พร้อมกัน, template, custom attribute รวมถึงสิทธิ์ในการใช้ auto-refresh
ค่าเริ่มต้นเป็นค่าระดับแพลตฟอร์ม แล้ว override รายองค์กรได้ผ่านคอลัมน์ organization.plan_limits
ซึ่งเป็น JSONB
โมดูลนี้ไม่มี route ของตัวเองเลย โดย RegisterRoutes เป็น no-op โดยเจตนา
สถานะของมันคือ provider-only ที่โมดูลอื่นเรียกใช้ตอนกำลังจะสร้างข้อมูลใหม่
เพื่อตรวจว่าเกินโควตาแล้วหรือยัง
Business Flow
- ผู้ใช้กดสร้าง audience, workflow หรือ template ใหม่
- service ของโมดูลนั้นเรียก
planlimitsเพื่อหา effective limits ขององค์กร- อ่านค่าจาก
organization.plan_limits(JSONB) หากมี key นั้นอยู่ก็ใช้ค่านั้น - หากไม่มี ให้ใช้ค่าจาก
DefaultPlanLimits maxChannelsเป็นกรณีพิเศษ โดยอ่านจากคอลัมน์ legacyorganization.max_channel(ชนิด varchar) เสมอ และไม่มีอยู่ในค่า constant default- ค่า
-1หมายถึงไม่จำกัด
- อ่านค่าจาก
- เทียบจำนวนที่มีอยู่จริง ซึ่ง count จากตารางของโมดูลนั้น กับค่า limit ที่ได้
- หากเกินโควตา ระบบตอบ error กลับไปให้ cms-web แสดงข้อความว่าถึงเพดานของแพ็กเกจแล้ว
- platform admin ปรับ limit ได้ผ่าน
PUT /api/org-module-setting/:orgId/limits
ค่าเริ่มต้นใน DefaultPlanLimits
| key | ค่าเริ่มต้น | ความหมาย |
|---|---|---|
maxSegments | 5 | จำนวน audience/segment สูงสุด |
maxActiveWorkflows | 3 | จำนวน workflow ที่ active พร้อมกันได้ |
maxTemplates | 20 | จำนวน template message |
maxAttributes | 30 | จำนวน custom attribute |
autoRefresh | false | อนุญาตให้ audience auto-refresh หรือไม่ |
maxChannels | อ่านจาก organization.max_channel | จำนวน LINE OA ที่สร้างได้ |
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/planlimits/ ประกอบด้วย service.go, constant.go และ controller.go
controller.go—RegisterRoutesเป็น no-op โดยเจตนา เพราะเป็น provider-only ซึ่งตรงกับระบบ NestJS เดิมที่ไม่มี controllerconstant.go— นิยามDefaultPlanLimitsservice.go—GetEffectiveLimitsและ helper สำหรับตรวจโควตาแยกตาม resource
โมดูลที่บริโภค planlimits ตามที่ระบุใน doc comment ของโค้ด ได้แก่ lineoa, audience,
audiencefilter, workflow, templatemessage, attributemaster และ orgmodulesetting
จุดเชื่อมต่อกับ Service อื่น
- Permission — ไม่มี route จึงไม่มี guard สิทธิ์ถูกบังคับที่โมดูลผู้เรียกแทน
- ตารางที่เกี่ยวข้อง —
organizationเฉพาะคอลัมน์plan_limits(JSONB) และmax_channel(varchar) - CLS — อ่านค่า
organizationIdเพื่อ scope ข้อมูล - ผู้ตั้งค่า — คอนโซลตั้งค่าโมดูลและโควตารายองค์กร
- ผู้บริโภค — การจัดการ audience, workflow, template message, attribute master และการจัดการ LINE OA