ผู้ใช้งาน CMS และการยืนยันตัวตน
ภาพรวม
Domain นี้มี 3 ตาราง: user เก็บบัญชีผู้ใช้งานฝั่ง CMS (แยกตามองค์กร), password_history
เก็บรหัสผ่านที่เข้ารหัสแล้วพร้อมวันหมดอายุ (ตาราง user ไม่มี คอลัมน์ password) และ
forgot_password เก็บ code สำหรับลิงก์รีเซ็ตรหัสผ่านพร้อมวันหมดอายุ
ตาราง user
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของผู้ใช้งาน |
organization_id | INTEGER | NOT NULL | – | องค์กรที่ผู้ใช้สังกัด (FK ไป organization.id) |
email | TEXT | NOT NULL | – | อีเมลที่ใช้ล็อกอิน |
avatar | TEXT | NULL | – | URL/path ของรูปโปรไฟล์ |
role_id | INTEGER | NOT NULL | 0 | บทบาทของผู้ใช้ (FK ไป system_role.id) |
firstname | TEXT | NOT NULL | – | ชื่อจริง |
lastname | TEXT | NOT NULL | – | นามสกุล |
type | UserType (enum) | NOT NULL | – | ประเภทผู้ใช้: onemoby (ทีมแพลตฟอร์ม) หรือ customer (ลูกค้า) |
status | CommonStatus (enum) | NOT NULL | – | สถานะบัญชี (active, inactive, delete ฯลฯ) |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้างบัญชี |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้สร้าง |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด (Prisma @updatedAt) |
updated_by | INTEGER | NULL | 0 | user id ของผู้แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete (NULL = ยังไม่ถูกลบ) |
verification_token | VARCHAR(64) | NULL | – | token สำหรับยืนยันอีเมล/ตั้งรหัสผ่านครั้งแรก (มีใน DB จริงแต่ยังไม่ถูก track ใน Prisma) |
ตาราง password_history
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | INTEGER | NOT NULL | nextval (serial) | ลำดับ |
user_id | INTEGER | NOT NULL | 0 | Id user -> ref จาก table user.id |
password | VARCHAR(255) | NOT NULL | – | รหัสผ่าน (เก็บแบบเข้ารหัส/hash) |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
expired_date | TIMESTAMPTZ(3) | NOT NULL | – | วันที่ password หมดอายุ |
ตาราง forgot_password
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | INTEGER | NOT NULL | nextval (serial) | ลำดับ |
code | VARCHAR(50) | NOT NULL | – | code สำหรับเช็คว่า url สำหรับ reset password ถูกต้อง |
user_id | INTEGER | NOT NULL | 0 | Id user -> ref จาก table user.id |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
expired_date | TIMESTAMPTZ(3) | NOT NULL | – | วันที่ code หมดอายุ |
status | CommonStatus (enum) | NOT NULL | active | สถานะของ code (ใช้แล้ว/ยกเลิกจะไม่เป็น active) |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
หมายเหตุ
- Foreign key:
user.organization_id->organization.id,user.role_id->system_role.id,password_history.user_id->user.id,forgot_password.user_id->user.id - ตาราง
userไม่มีคอลัมน์ password — รหัสผ่านที่ใช้งานอยู่คือ record ล่าสุดในpassword_historyของ user คนนั้น ตารางนี้จึงทำหน้าที่ทั้งเก็บรหัสผ่านปัจจุบันและประวัติ (ใช้ตรวจไม่ให้ตั้งรหัสซ้ำของเดิม) พร้อมบังคับวันหมดอายุผ่านexpired_date userมี index บนdeleted_date- ชื่อตาราง
userเป็น reserved word ของ PostgreSQL จึงต้องเขียนเป็นpublic."user"เมื่อ query ด้วย SQL ตรงๆ - ไม่มีตาราง
user_line_oaในระบบ — สิ่งที่ชื่อคล้ายกันคือ indexline_user_line_oa_id_idxซึ่งเป็น index บนคอลัมน์line_oa_idของตารางline_userไม่ใช่ตารางแยก