ตั้งค่าโมดูลของ Organization (Super Admin)
ภาพรวม
หน้านี้เป็นเครื่องมือภายในของทีมงานระดับ super admin สำหรับสองเรื่อง
- เปิดหรือปิดโมดูลของ CMS แยกตามองค์กร — กำหนดว่าองค์กรใดใช้ฟีเจอร์ใดได้บ้าง ผลลัพธ์คือเมนูที่ผู้ใช้ปลายทางเห็นในเมนูด้านข้าง
- กำหนดขีดจำกัดของแพ็กเกจ (plan limits) — จำนวน channel, กลุ่มเป้าหมาย, เวิร์กโฟลว์, เทมเพลต และแอตทริบิวต์สูงสุดที่องค์กรนั้นสร้างได้ พร้อมแสดงปริมาณที่ใช้ไปแล้ว
หน้านี้อยู่ที่ /xsd2safsadf/module-setting ซึ่งใช้ชื่อ path ระดับแรกเป็นสตริงสุ่มโดยเจตนา ไม่มีลิงก์เข้าจากที่ใดในระบบ ต้องพิมพ์ URL ตรงเท่านั้น
ข้อควรทราบเรื่องความปลอดภัย — การซ่อน URL เป็นเพียงชั้นเสริมเท่านั้น ไม่ใช่กลไกป้องกันจริง การควบคุมสิทธิ์ที่แท้จริงอยู่ที่ฝั่งเซิร์ฟเวอร์ซึ่งคุ้มครองปลายทางทั้งหมดด้วย guard ระดับ super admin ผู้ที่ไม่มีสิทธิ์แม้จะเปิดหน้านี้ได้ก็จะเห็นเพียงข้อความแจ้งว่าไม่ได้รับอนุญาต เพราะทุกคำขอถูกปฏิเสธด้วยสถานะ 403
หน้านี้ไม่มีการตรวจสิทธิ์ระดับ route ฝั่งหน้าเว็บ และเขียนด้วยรูปแบบที่ต่างจากหน้าอื่นในระบบ คือไม่ได้ใช้ตัวจัดการคำขอกลางและไม่ได้ตั้งค่า breadcrumb หรือเมนูที่กำลังใช้งาน
Business Flow
1. เปิดหน้าและโหลดรายการองค์กร
- เมื่อเปิดหน้า ระบบตรวจสอบ token และโหลดสิทธิ์ตามปกติ จากนั้นดึงรายการองค์กรจาก
GET /org-module-setting/organizations - หากเซิร์ฟเวอร์ตอบสถานะ 403 หน้าจะแสดงเพียงกล่องแจ้งเตือนว่าต้องใช้บัญชี super admin แล้วหยุดการทำงานทั้งหมด
- หากเกิดข้อผิดพลาดอื่น เช่น เซิร์ฟเวอร์ขัดข้องหรือเครือข่ายล้มเหลว ระบบจะไม่แจ้งอะไรเลย ผู้ใช้จะเห็นเพียงรายการเลือกองค์กรที่ว่างเปล่า
- เมื่อสำเร็จ รายการเลือกจะแสดงองค์กรทั้งหมดพร้อมรหัสและชื่อ องค์กรที่มีการกำหนดโมดูลเองจะมีคำว่า custom ต่อท้าย และรายการนี้ค้นหาได้
2. เลือกองค์กร
- เมื่อเลือกองค์กร ระบบดึงข้อมูลสองชุดพร้อมกัน คือรายการโมดูลจาก
GET /org-module-setting/{orgId}และขีดจำกัดแพ็กเกจจากGET /org-module-setting/{orgId}/limits - โมดูลที่เปิดใช้งานอยู่จะถูกติ๊กไว้เป็นค่าตั้งต้นในตาราง
- ข้าง ๆ รายการเลือกจะมีป้ายบอกสถานะการตั้งค่า เป็นสีฟ้าเมื่อองค์กรนี้มีการกำหนดเอง และสีเทาเมื่อใช้ค่าเริ่มต้น
- หากดึงขีดจำกัดแพ็กเกจไม่สำเร็จ เช่นในกรณีที่ยังไม่เคยกำหนดค่าให้องค์กรนี้ แผงขีดจำกัดจะไม่ปรากฏโดยไม่มีข้อความอธิบาย
3. เปิดปิดโมดูลและบันทึก
- ตารางโมดูลมีสามคอลัมน์ คือ ช่องติ๊กเปิดใช้งาน ชื่อโมดูล และรายการการกระทำที่โมดูลนั้นรองรับ
- การติ๊กหรือเอาติ๊กออกเป็นการเปลี่ยนสถานะฝั่งหน้าเว็บเท่านั้น ยังไม่ส่งไปยังเซิร์ฟเวอร์
- ปุ่ม Save as override บันทึกชุดโมดูลที่ติ๊กไว้เป็นการตั้งค่าเฉพาะขององค์กรนั้น ผ่าน
PUT /org-module-setting/{orgId} - ปุ่ม Reset to default ลบการตั้งค่าเฉพาะทิ้ง ทำให้องค์กรกลับไปใช้ชุดโมดูลมาตรฐาน
- เซิร์ฟเวอร์ตอบกลับว่าผลลัพธ์เป็นโหมดมาตรฐานหรือโหมดกำหนดเอง พร้อมจำนวนโมดูลที่เปิดใช้งาน ระบบจะแสดงข้อความยืนยันให้เหมาะกับแต่ละกรณี
- หลังบันทึกสำเร็จ ระบบโหลดข้อมูลโมดูลและขีดจำกัดใหม่ พร้อมโหลดรายการองค์กรอีกครั้งเพื่ออัปเดตป้าย custom ในรายการเลือก
- หากบันทึกล้มเหลว ระบบแสดงข้อความผิดพลาดมาตรฐานโดยไม่ได้อ่านรายละเอียดจากเซิร์ฟเวอร์
4. ขีดจำกัดแพ็กเกจและปริมาณการใช้งาน
แผงขีดจำกัดจะแสดงเมื่อเลือกองค์กรแล้วและดึงข้อมูลได้สำเร็จ ประกอบด้วยห้ารายการ
| รายการ | สิ่งที่ควบคุม |
|---|---|
| ช่องทาง LINE OA | จำนวน channel สูงสุดที่องค์กรสร้างได้ |
| กลุ่มเป้าหมาย | จำนวนกลุ่มเป้าหมายสูงสุด |
| เวิร์กโฟลว์ที่ใช้งานอยู่ | จำนวนเวิร์กโฟลว์ที่เปิดใช้งานพร้อมกันได้ |
| เทมเพลต | จำนวนเทมเพลตข้อความสูงสุด |
| คุณสมบัติที่กำหนดเอง | จำนวนแอตทริบิวต์ที่กำหนดเองสูงสุด |
แต่ละรายการแสดงชื่อ ตัวเลขที่ใช้ไปเทียบกับขีดจำกัด แถบความคืบหน้า ช่องกรอกตัวเลข และตัวเลือก "ไม่จำกัด"
กติกาการแสดงผลที่ควรทราบ
- รายการที่ตั้งเป็นไม่จำกัดจะแสดงแถบสีเทาเต็มความยาว และช่องกรอกตัวเลขจะถูกปิดการใช้งาน
- รายการที่ใช้งานถึงหรือเกินขีดจำกัดแล้วจะถูกเน้นเป็นสีแดงทั้งแถว เพื่อให้เห็นได้ทันที
- เมื่อเอาติ๊ก "ไม่จำกัด" ออก ระบบจะตั้งค่าขีดจำกัดเป็นจำนวนที่ใช้ไปแล้วในปัจจุบัน ไม่ใช่ศูนย์ เพื่อไม่ให้ขีดจำกัดต่ำกว่าข้อมูลที่มีอยู่จริง
แถวสุดท้ายเป็นสวิตช์เปิดปิดการรีเฟรชกลุ่มเป้าหมายอัตโนมัติ ซึ่งมีป้าย Premium กำกับไว้ แต่ป้ายนี้เป็นเพียงข้อความอธิบาย ไม่ได้บังคับตามแพ็กเกจแต่อย่างใด
เมื่อกดบันทึกขีดจำกัด ระบบส่งค่าทั้งชุดไปยัง PUT /org-module-setting/{orgId}/limits แล้วโหลดข้อมูลใหม่
5. ความแตกต่างระหว่างค่ามาตรฐานกับการกำหนดเอง
โมเดลสิทธิ์ของโมดูลมีสองระดับ
| ระดับ | ความหมาย | สัญญาณบนหน้าจอ |
|---|---|---|
| ค่ามาตรฐาน (baseline) | ชุดโมดูลเริ่มต้นที่ทุกองค์กรได้รับเหมือนกัน | ป้ายสีเทา และรายการเลือกไม่มีคำต่อท้าย |
| กำหนดเอง (override) | องค์กรนี้มีชุดโมดูลเฉพาะที่ super admin กำหนดไว้ | ป้ายสีฟ้า และรายการเลือกมีคำว่า custom ต่อท้าย |
การกดบันทึกแบบกำหนดเองจะสร้างหรืออัปเดตชุดเฉพาะให้ตรงกับที่ติ๊กไว้ ส่วนการรีเซ็ตจะลบชุดเฉพาะทิ้งเพื่อกลับไปใช้ค่ามาตรฐาน
6. ผลลัพธ์ที่ส่งต่อไปถึงผู้ใช้ปลายทาง
- Super admin ปรับโมดูลที่หน้านี้
- ผู้ใช้ในองค์กรนั้นเข้าสู่ระบบ ระบบเรียกสิทธิ์ของผู้ใช้ ซึ่งเซิร์ฟเวอร์จะตอบเฉพาะโมดูลที่องค์กรเปิดไว้และบทบาทของผู้ใช้มีสิทธิ์
- หน้าเว็บแปลงข้อมูลนี้เป็นชุดกฎการเข้าถึง
- เมนูด้านข้าง เมนูลัด และการตรวจสิทธิ์ระดับหน้า จะตัดสินใจจากชุดกฎนั้นว่าผู้ใช้เห็นและเข้าถึงอะไรได้บ้าง
ข้อจำกัดที่ควรระวังในการใช้งาน
- ระบบไม่ติดตามการเปลี่ยนแปลงที่ยังไม่ได้บันทึก หากติ๊กโมดูลหรือแก้ตัวเลขแล้วเปลี่ยนองค์กรหรือปิดแท็บ ค่าที่แก้ไว้จะหายไปโดยไม่มีคำเตือน
- ปุ่มบันทึกไม่ถูกปิดเมื่อไม่มีการเปลี่ยนแปลง จึงกดซ้ำได้เรื่อย ๆ
- ข้อผิดพลาดที่ไม่ใช่ 403 ตอนโหลดรายการองค์กรถูกกลืนทั้งหมด ไม่มีข้อความและไม่มีการลองใหม่
- แผงขีดจำกัดหายไปเงียบ ๆ เมื่อดึงข้อมูลไม่สำเร็จ ทำให้แยกไม่ออกระหว่างกรณียังไม่เคยกำหนดค่ากับกรณีเกิดปัญหาอื่น
- ตัวเลขขีดจำกัดและปริมาณการใช้งานเป็นภาพนิ่ง ณ เวลาที่โหลด ไม่มีการรีเฟรชอัตโนมัติ
- ไม่มีกล่องยืนยันก่อนปิดโมดูล ทั้งที่การปิดโมดูลทำให้เมนูของผู้ใช้ทั้งองค์กรหายไปทันทีเมื่อโหลดหน้าใหม่
หน้าจอและองค์ประกอบหลัก
โครงสร้างหน้า
ทั้งหน้าเขียนรวมอยู่ในไฟล์เดียว (src/app/xsd2safsadf/module-setting/page.tsx) โดยไม่ได้แยกเป็นตัวควบคุมกับส่วนแสดงผลเหมือนหน้าอื่น ประกอบด้วยรายการเลือกองค์กร ป้ายสถานะการตั้งค่า ตารางโมดูล ปุ่มบันทึกสองแบบ และแผงขีดจำกัดแพ็กเกจ
ชั้นบริการ
บริการที่หน้านี้ใช้ (src/services/org-module-setting.service.ts) รวมห้าฟังก์ชัน คือ ดึงรายการองค์กร ดึงโมดูลขององค์กร บันทึกโมดูล ดึงขีดจำกัด และบันทึกขีดจำกัด
ปลายทาง API
| การทำงาน | ปลายทาง |
|---|---|
| รายการองค์กร | GET /org-module-setting/organizations |
| โมดูลขององค์กร | GET /org-module-setting/{orgId} |
| บันทึกโมดูล | PUT /org-module-setting/{orgId} |
| ขีดจำกัดและปริมาณการใช้งาน | GET /org-module-setting/{orgId}/limits |
| บันทึกขีดจำกัด | PUT /org-module-setting/{orgId}/limits |
เรื่องที่ควบคุมจากที่อื่น
การเปิดปิด mini-app ในกลุ่ม Apps ไม่ได้ถูกควบคุมจากหน้านี้ แต่ถูกกำหนดจากคอนโซลของผู้ดูแลแพลตฟอร์มโดยตรง ฝั่ง CMS อ่านค่ามาแสดงเท่านั้น เพื่อไม่ให้องค์กรเปิดแอปที่ผู้ดูแลแพลตฟอร์มปิดไว้กลับมาได้
จุดเชื่อมต่อกับฟีเจอร์อื่น
- สิทธิ์ที่ฝั่งเซิร์ฟเวอร์ — guard ระดับ super admin ที่คุ้มครองปลายทางทั้งหมดคือจุดควบคุมสิทธิ์ที่แท้จริง หน้าเว็บเพียงจับสถานะ 403 มาแสดงเป็นข้อความ
- ระบบสิทธิ์และเมนู — โมดูลที่เปิดที่นี่กำหนดว่าผู้ใช้ในองค์กรจะได้รับสิทธิ์อะไรบ้าง ซึ่งส่งผลต่อเมนูด้านข้าง เมนูลัด และการเข้าถึงหน้าทั้งหมด
- การบังคับใช้ขีดจำกัด — ขีดจำกัดถูกบังคับใช้ที่ฝั่งเซิร์ฟเวอร์ การสร้างข้อมูลเกินโควตาจะถูกปฏิเสธจากที่นั่น หน้านี้เพียงแก้ตัวเลขและแทบไม่มีการตรวจสอบฝั่งหน้าเว็บ
- สมัครใช้งาน — องค์กรที่สมัครเข้ามาใหม่ต้องถูกเปิดโมดูลและกำหนดโควตาที่หน้านี้ก่อนจึงจะใช้งานได้เต็มรูปแบบ
รายละเอียดฝั่ง Backend (CMS API)
หน้านี้คือคอนโซลของผู้ดูแลระดับแพลตฟอร์ม สิ่งที่ตั้งค่าจากที่นี่เป็นค่าที่มีผลบังคับจริงถึงระดับ API ไม่ใช่แค่ระดับการแสดงผล
สิทธิ์ที่บังคับจริง
ทุก endpoint ในโมดูลนี้ถูกครอบด้วย guard ระดับ super admin ซึ่งตรวจว่ารหัสบทบาทของผู้เรียกเท่ากับ 1 ถ้าไม่ใช่จะได้ 403 ทันที นี่คือกลไกที่ทำให้การซ่อน URL แบบสุ่มบนหน้าเว็บเป็นเพียงชั้นเสริม ไม่ใช่การป้องกันหลัก และเป็นที่มาของกล่องแจ้งเตือน "ต้องใช้บัญชี super admin" ที่หน้าเว็บแสดงเมื่อจับสถานะ 403 ได้
การเปิดปิดโมดูลมีผล 2 ทาง
เมื่อบันทึกชุดโมดูลผ่าน PUT /api/org-module-setting/:orgId backend จะเขียนตารางการตั้งค่าโมดูลระดับองค์กร แล้วผลจะไปปรากฏพร้อมกันสองทาง
- ระดับเมนู —
GET /api/user/:id/permissionของผู้ใช้ในองค์กรนั้นจะคืนค่า override แทน baseline ของบทบาท เมนูใน cms-web จึงเปลี่ยนตาม - ระดับ API — ModuleGate บนเส้นทางของโมดูลที่ถูกปิดจะตอบ 403 ทันที แม้ผู้ใช้จะเรียก API ตรงโดยไม่ผ่านหน้าเว็บ การกำกับดูแลจึงมีผลจริง ไม่ใช่แค่การซ่อนปุ่ม
ที่สำคัญคือ ทั้งสองทางเรียกใช้ ตัวตัดสินตัวเดียวกัน ในโค้ด backend จึงรับประกันว่าสิ่งที่เมนูแสดงกับสิ่งที่ API ยอมให้ทำจะไม่ขัดแย้งกัน
ความหมายของ baseline กับ override ในเชิงข้อมูล
- baseline มาจากสิทธิ์ที่ผูกกับบทบาทในระดับระบบ ทุกองค์กรได้ชุดเดียวกัน
- override คือแถวเฉพาะขององค์กรนั้น การกดบันทึกแบบกำหนดเองจะ เขียนทับทั้งชุด ไม่ใช่การเพิ่มทีละรายการ
- ปุ่มรีเซ็ตส่งสัญญาณให้ backend ลบ override ทั้งหมด ขององค์กรนั้น ทำให้กลับไปใช้ baseline ตามบทบาท
- ผู้ใช้ประเภทผู้ดำเนินการแพลตฟอร์มจะใช้ baseline เสมอ ไม่ถูก override — ปิดโมดูลให้องค์กรแล้ว ทีมงานภายในยังเข้าถึงได้ตามปกติ
กลไกโควตา (Plan Limits) ฝั่ง backend
โควตาไม่ได้เป็นโมดูลที่มี endpoint ของตัวเอง แต่เป็น ตัวให้บริการภายในที่โมดูลอื่นเรียกใช้ตอนกำลังจะสร้างข้อมูลใหม่ ลำดับการทำงานคือ อ่านค่าที่ตั้งไว้รายองค์กรก่อน ถ้าไม่มีค่านั้นจึงใช้ค่าเริ่มต้นของแพลตฟอร์ม แล้วนับจำนวนที่มีอยู่จริงมาเทียบ ถ้าเกินจะปฏิเสธพร้อมข้อความว่าถึงเพดานแพ็กเกจ
ค่าเริ่มต้นของแพลตฟอร์มเมื่อองค์กรยังไม่เคยถูกตั้งค่า
| รายการ | ค่าเริ่มต้น |
|---|---|
| กลุ่มเป้าหมายสูงสุด | 5 |
| เวิร์กโฟลว์ที่ active พร้อมกัน | 3 |
| เทมเพลตข้อความ | 20 |
| แอตทริบิวต์ที่กำหนดเอง | 30 |
| การรีเฟรชกลุ่มเป้าหมายอัตโนมัติ | ปิด |
ข้อควรทราบเพิ่มเติม
- ค่า
-1หมายถึงไม่จำกัด ซึ่งตรงกับตัวเลือก "ไม่จำกัด" บนหน้าจอ - จำนวน channel เป็นกรณีพิเศษ — ไม่ได้เก็บรวมกับโควตาอื่น แต่อ่านจากคอลัมน์เดิมขององค์กรเสมอ จึงไม่มีค่าเริ่มต้นในชุดค่ามาตรฐาน
- โมดูลที่บังคับใช้โควตาจริงได้แก่ การจัดการ LINE OA, กลุ่มเป้าหมายและตัวกรอง, เวิร์กโฟลว์, เทมเพลตข้อความ และการตั้งค่าแอตทริบิวต์
- สวิตช์รีเฟรชอัตโนมัติเป็นหนึ่งในค่าโควตาที่ backend เก็บจริง แม้ป้าย Premium บนหน้าจอจะเป็นเพียงข้อความอธิบาย
ทะเบียนโมดูลของระบบ
รายการโมดูลที่ปรากฏในตารางของหน้านี้มาจากตารางทะเบียนโมดูลระดับระบบ ซึ่งมีโมดูลจัดการของตัวเองที่ ถูกครอบด้วย guard ระดับ super admin ทุกเส้นทางเช่นกัน และรองรับการเพิ่ม แก้ไข และลบแบบ soft delete
จุดที่ต้องระวังเมื่อเพิ่มโมดูลใหม่: ชื่อโมดูลต้องตรงกับชื่อที่ ModuleGate ใช้ตรวจในโค้ดเป๊ะ ๆ ถ้าตั้งชื่อไม่ตรง gate จะหาไม่เจอ ผลคือโมดูลนั้นปรากฏในตารางให้ติ๊กได้ แต่การเปิดปิดจะไม่มีผลบังคับที่ระดับ API เลย