บทบาทและสิทธิ์การใช้งานโมดูล
ภาพรวม
Domain นี้มี 4 ตาราง: system_role (บทบาท), system_module (โมดูล/ฟีเจอร์ในระบบ),
system_role_module (สิทธิ์ของบทบาทต่อโมดูล) และ organization_module (การเปิด/จำกัดโมดูล
รายองค์กร) สิทธิ์ที่ผู้ใช้ได้จริงคือผลรวมของสิทธิ์ตาม role กับโมดูลที่องค์กรนั้นได้รับอนุญาต
ตาราง system_role
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของบทบาท |
name | TEXT | NOT NULL | – | ชื่อบทบาท เช่น admin, editor, viewer |
total | INTEGER | NOT NULL | 5 | จำนวนผู้ใช้สูงสุดที่ถือบทบาทนี้ได้ |
type | UserType (enum) | NOT NULL | – | บทบาทนี้ใช้กับผู้ใช้ประเภทใด: onemoby หรือ customer |
status | CommonStatus (enum) | NOT NULL | – | สถานะบทบาท (active, inactive ฯลฯ) |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้สร้าง |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
updated_by | INTEGER | NULL | 0 | user id ของผู้แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
ตาราง system_module
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของโมดูล |
name | TEXT | NOT NULL | – | ชื่อโมดูล/ฟีเจอร์ เช่น import-mapping, campaign |
actions | TEXT | NOT NULL | – | รายการ action ที่โมดูลนี้รองรับ คั่นด้วยเครื่องหมายจุลภาค เช่น readAll,read,create,update,delete |
status | CommonStatus (enum) | NOT NULL | – | สถานะโมดูล (active = เปิดใช้ในระบบ) |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้สร้าง |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
updated_by | INTEGER | NULL | 0 | user id ของผู้แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
ตาราง system_role_module
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key |
role_id | INTEGER | NOT NULL | – | บทบาท (FK ไป system_role.id) |
module_id | INTEGER | NOT NULL | – | โมดูล (FK ไป system_module.id) |
actions | TEXT | NOT NULL | – | action ที่บทบาทนี้ทำได้กับโมดูลนี้ (subset ของ system_module.actions) |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้สร้าง |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
updated_by | INTEGER | NULL | 0 | user id ของผู้แก้ไขล่าสุด |
ตาราง organization_module
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key |
organization_id | INTEGER | NOT NULL | – | องค์กร (FK ไป organization.id, ON DELETE CASCADE) |
module_id | INTEGER | NOT NULL | – | โมดูล (FK ไป system_module.id, ON DELETE CASCADE) |
actions | TEXT | NOT NULL | – | action ที่องค์กรนี้ได้รับอนุญาตกับโมดูลนี้ |
created_date | TIMESTAMPTZ | NOT NULL | now() | วันที่สร้าง |
updated_date | TIMESTAMPTZ | NULL | – | วันที่แก้ไขล่าสุด |
หมายเหตุ
organization_module ไม่มีอยู่ใน schema.prisma และไม่มีไฟล์ migration ที่ track ไว้ —
ตารางถูกสร้างตรงบนฐานข้อมูล โครงสร้างข้างต้นดึงมาจาก pg_dump ของ preprod
(schema-dumps/2026-07-24/schema.sql) จึงไม่มีคอลัมน์ created_by/updated_by/deleted_date
เหมือนตารางอื่นใน domain นี้ และ timestamp เป็น TIMESTAMPTZ (ไม่ระบุ precision 3)
- Unique constraint:
organization_module (organization_id, module_id) — หนึ่งองค์กรมีได้ 1 แถว
ต่อโมดูล
- Foreign key:
system_role_module.role_id -> system_role.id,
system_role_module.module_id -> system_module.id,
organization_module.organization_id -> organization.id,
organization_module.module_id -> system_module.id
system_role มี index บน deleted_date
- คอลัมน์
actions ทั้ง 3 ตารางเก็บเป็นสตริงคั่นจุลภาค ไม่ใช่ array หรือ JSON เช่น
readAll,read,create,update,delete โดย readAll หมายถึงดูข้อมูลได้ทั้งองค์กร ส่วน read
หมายถึงดูเฉพาะรายการของตัวเอง
- การเพิ่มโมดูลใหม่ต้อง insert ทั้ง
system_module, system_role_module (ให้ role ที่เกี่ยวข้อง)
และ organization_module (สำหรับองค์กรลูกค้าที่มี override อยู่แล้ว) ดูตัวอย่างได้ที่
manual-sql/9.import_mapping.sql