Skip to main content

ตั้งค่าโมดูลของ Organization (Super Admin)

ภาพรวม

หน้านี้เป็นเครื่องมือภายในของทีมงานระดับ super admin สำหรับสองเรื่อง

  • เปิดหรือปิดโมดูลของ CMS แยกตามองค์กร — กำหนดว่าองค์กรใดใช้ฟีเจอร์ใดได้บ้าง ผลลัพธ์คือเมนูที่ผู้ใช้ปลายทางเห็นในเมนูด้านข้าง
  • กำหนดขีดจำกัดของแพ็กเกจ (plan limits) — จำนวน channel, กลุ่มเป้าหมาย, เวิร์กโฟลว์, เทมเพลต และแอตทริบิวต์สูงสุดที่องค์กรนั้นสร้างได้ พร้อมแสดงปริมาณที่ใช้ไปแล้ว

หน้านี้อยู่ที่ /xsd2safsadf/module-setting ซึ่งใช้ชื่อ path ระดับแรกเป็นสตริงสุ่มโดยเจตนา ไม่มีลิงก์เข้าจากที่ใดในระบบ ต้องพิมพ์ URL ตรงเท่านั้น

ข้อควรทราบเรื่องความปลอดภัย — การซ่อน URL เป็นเพียงชั้นเสริมเท่านั้น ไม่ใช่กลไกป้องกันจริง การควบคุมสิทธิ์ที่แท้จริงอยู่ที่ฝั่งเซิร์ฟเวอร์ซึ่งคุ้มครองปลายทางทั้งหมดด้วย guard ระดับ super admin ผู้ที่ไม่มีสิทธิ์แม้จะเปิดหน้านี้ได้ก็จะเห็นเพียงข้อความแจ้งว่าไม่ได้รับอนุญาต เพราะทุกคำขอถูกปฏิเสธด้วยสถานะ 403

หน้านี้ไม่มีการตรวจสิทธิ์ระดับ route ฝั่งหน้าเว็บ และเขียนด้วยรูปแบบที่ต่างจากหน้าอื่นในระบบ คือไม่ได้ใช้ตัวจัดการคำขอกลางและไม่ได้ตั้งค่า breadcrumb หรือเมนูที่กำลังใช้งาน

Business Flow

1. เปิดหน้าและโหลดรายการองค์กร

  1. เมื่อเปิดหน้า ระบบตรวจสอบ token และโหลดสิทธิ์ตามปกติ จากนั้นดึงรายการองค์กรจาก GET /org-module-setting/organizations
  2. หากเซิร์ฟเวอร์ตอบสถานะ 403 หน้าจะแสดงเพียงกล่องแจ้งเตือนว่าต้องใช้บัญชี super admin แล้วหยุดการทำงานทั้งหมด
  3. หากเกิดข้อผิดพลาดอื่น เช่น เซิร์ฟเวอร์ขัดข้องหรือเครือข่ายล้มเหลว ระบบจะไม่แจ้งอะไรเลย ผู้ใช้จะเห็นเพียงรายการเลือกองค์กรที่ว่างเปล่า
  4. เมื่อสำเร็จ รายการเลือกจะแสดงองค์กรทั้งหมดพร้อมรหัสและชื่อ องค์กรที่มีการกำหนดโมดูลเองจะมีคำว่า custom ต่อท้าย และรายการนี้ค้นหาได้

2. เลือกองค์กร

  1. เมื่อเลือกองค์กร ระบบดึงข้อมูลสองชุดพร้อมกัน คือรายการโมดูลจาก GET /org-module-setting/{orgId} และขีดจำกัดแพ็กเกจจาก GET /org-module-setting/{orgId}/limits
  2. โมดูลที่เปิดใช้งานอยู่จะถูกติ๊กไว้เป็นค่าตั้งต้นในตาราง
  3. ข้าง ๆ รายการเลือกจะมีป้ายบอกสถานะการตั้งค่า เป็นสีฟ้าเมื่อองค์กรนี้มีการกำหนดเอง และสีเทาเมื่อใช้ค่าเริ่มต้น
  4. หากดึงขีดจำกัดแพ็กเกจไม่สำเร็จ เช่นในกรณีที่ยังไม่เคยกำหนดค่าให้องค์กรนี้ แผงขีดจำกัดจะไม่ปรากฏโดยไม่มีข้อความอธิบาย

3. เปิดปิดโมดูลและบันทึก

  1. ตารางโมดูลมีสามคอลัมน์ คือ ช่องติ๊กเปิดใช้งาน ชื่อโมดูล และรายการการกระทำที่โมดูลนั้นรองรับ
  2. การติ๊กหรือเอาติ๊กออกเป็นการเปลี่ยนสถานะฝั่งหน้าเว็บเท่านั้น ยังไม่ส่งไปยังเซิร์ฟเวอร์
  3. ปุ่ม Save as override บันทึกชุดโมดูลที่ติ๊กไว้เป็นการตั้งค่าเฉพาะขององค์กรนั้น ผ่าน PUT /org-module-setting/{orgId}
  4. ปุ่ม Reset to default ลบการตั้งค่าเฉพาะทิ้ง ทำให้องค์กรกลับไปใช้ชุดโมดูลมาตรฐาน
  5. เซิร์ฟเวอร์ตอบกลับว่าผลลัพธ์เป็นโหมดมาตรฐานหรือโหมดกำหนดเอง พร้อมจำนวนโมดูลที่เปิดใช้งาน ระบบจะแสดงข้อความยืนยันให้เหมาะกับแต่ละกรณี
  6. หลังบันทึกสำเร็จ ระบบโหลดข้อมูลโมดูลและขีดจำกัดใหม่ พร้อมโหลดรายการองค์กรอีกครั้งเพื่ออัปเดตป้าย custom ในรายการเลือก
  7. หากบันทึกล้มเหลว ระบบแสดงข้อความผิดพลาดมาตรฐานโดยไม่ได้อ่านรายละเอียดจากเซิร์ฟเวอร์

4. ขีดจำกัดแพ็กเกจและปริมาณการใช้งาน

แผงขีดจำกัดจะแสดงเมื่อเลือกองค์กรแล้วและดึงข้อมูลได้สำเร็จ ประกอบด้วยห้ารายการ

รายการสิ่งที่ควบคุม
ช่องทาง LINE OAจำนวน channel สูงสุดที่องค์กรสร้างได้
กลุ่มเป้าหมายจำนวนกลุ่มเป้าหมายสูงสุด
เวิร์กโฟลว์ที่ใช้งานอยู่จำนวนเวิร์กโฟลว์ที่เปิดใช้งานพร้อมกันได้
เทมเพลตจำนวนเทมเพลตข้อความสูงสุด
คุณสมบัติที่กำหนดเองจำนวนแอตทริบิวต์ที่กำหนดเองสูงสุด

แต่ละรายการแสดงชื่อ ตัวเลขที่ใช้ไปเทียบกับขีดจำกัด แถบความคืบหน้า ช่องกรอกตัวเลข และตัวเลือก "ไม่จำกัด"

กติกาการแสดงผลที่ควรทราบ

  • รายการที่ตั้งเป็นไม่จำกัดจะแสดงแถบสีเทาเต็มความยาว และช่องกรอกตัวเลขจะถูกปิดการใช้งาน
  • รายการที่ใช้งานถึงหรือเกินขีดจำกัดแล้วจะถูกเน้นเป็นสีแดงทั้งแถว เพื่อให้เห็นได้ทันที
  • เมื่อเอาติ๊ก "ไม่จำกัด" ออก ระบบจะตั้งค่าขีดจำกัดเป็นจำนวนที่ใช้ไปแล้วในปัจจุบัน ไม่ใช่ศูนย์ เพื่อไม่ให้ขีดจำกัดต่ำกว่าข้อมูลที่มีอยู่จริง

แถวสุดท้ายเป็นสวิตช์เปิดปิดการรีเฟรชกลุ่มเป้าหมายอัตโนมัติ ซึ่งมีป้าย Premium กำกับไว้ แต่ป้ายนี้เป็นเพียงข้อความอธิบาย ไม่ได้บังคับตามแพ็กเกจแต่อย่างใด

เมื่อกดบันทึกขีดจำกัด ระบบส่งค่าทั้งชุดไปยัง PUT /org-module-setting/{orgId}/limits แล้วโหลดข้อมูลใหม่

5. ความแตกต่างระหว่างค่ามาตรฐานกับการกำหนดเอง

โมเดลสิทธิ์ของโมดูลมีสองระดับ

ระดับความหมายสัญญาณบนหน้าจอ
ค่ามาตรฐาน (baseline)ชุดโมดูลเริ่มต้นที่ทุกองค์กรได้รับเหมือนกันป้ายสีเทา และรายการเลือกไม่มีคำต่อท้าย
กำหนดเอง (override)องค์กรนี้มีชุดโมดูลเฉพาะที่ super admin กำหนดไว้ป้ายสีฟ้า และรายการเลือกมีคำว่า custom ต่อท้าย

การกดบันทึกแบบกำหนดเองจะสร้างหรืออัปเดตชุดเฉพาะให้ตรงกับที่ติ๊กไว้ ส่วนการรีเซ็ตจะลบชุดเฉพาะทิ้งเพื่อกลับไปใช้ค่ามาตรฐาน

6. ผลลัพธ์ที่ส่งต่อไปถึงผู้ใช้ปลายทาง

  1. Super admin ปรับโมดูลที่หน้านี้
  2. ผู้ใช้ในองค์กรนั้นเข้าสู่ระบบ ระบบเรียกสิทธิ์ของผู้ใช้ ซึ่งเซิร์ฟเวอร์จะตอบเฉพาะโมดูลที่องค์กรเปิดไว้และบทบาทของผู้ใช้มีสิทธิ์
  3. หน้าเว็บแปลงข้อมูลนี้เป็นชุดกฎการเข้าถึง
  4. เมนูด้านข้าง เมนูลัด และการตรวจสิทธิ์ระดับหน้า จะตัดสินใจจากชุดกฎนั้นว่าผู้ใช้เห็นและเข้าถึงอะไรได้บ้าง

ข้อจำกัดที่ควรระวังในการใช้งาน

  • ระบบไม่ติดตามการเปลี่ยนแปลงที่ยังไม่ได้บันทึก หากติ๊กโมดูลหรือแก้ตัวเลขแล้วเปลี่ยนองค์กรหรือปิดแท็บ ค่าที่แก้ไว้จะหายไปโดยไม่มีคำเตือน
  • ปุ่มบันทึกไม่ถูกปิดเมื่อไม่มีการเปลี่ยนแปลง จึงกดซ้ำได้เรื่อย ๆ
  • ข้อผิดพลาดที่ไม่ใช่ 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 จะเขียนตารางการตั้งค่าโมดูลระดับองค์กร แล้วผลจะไปปรากฏพร้อมกันสองทาง

  1. ระดับเมนูGET /api/user/:id/permission ของผู้ใช้ในองค์กรนั้นจะคืนค่า override แทน baseline ของบทบาท เมนูใน cms-web จึงเปลี่ยนตาม
  2. ระดับ 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 เลย