Skip to main content

ผู้ใช้งาน CMS และการยืนยันตัวตน

ภาพรวม

Domain นี้มี 3 ตาราง: user เก็บบัญชีผู้ใช้งานฝั่ง CMS (แยกตามองค์กร), password_history เก็บรหัสผ่านที่เข้ารหัสแล้วพร้อมวันหมดอายุ (ตาราง user ไม่มี คอลัมน์ password) และ forgot_password เก็บ code สำหรับลิงก์รีเซ็ตรหัสผ่านพร้อมวันหมดอายุ

ตาราง user

ColumnTypeNullableDefaultคำอธิบาย
idINTEGERNOT NULLnextval (serial)Primary key ของผู้ใช้งาน
organization_idINTEGERNOT NULLองค์กรที่ผู้ใช้สังกัด (FK ไป organization.id)
emailTEXTNOT NULLอีเมลที่ใช้ล็อกอิน
avatarTEXTNULLURL/path ของรูปโปรไฟล์
role_idINTEGERNOT NULL0บทบาทของผู้ใช้ (FK ไป system_role.id)
firstnameTEXTNOT NULLชื่อจริง
lastnameTEXTNOT NULLนามสกุล
typeUserType (enum)NOT NULLประเภทผู้ใช้: onemoby (ทีมแพลตฟอร์ม) หรือ customer (ลูกค้า)
statusCommonStatus (enum)NOT NULLสถานะบัญชี (active, inactive, delete ฯลฯ)
created_dateTIMESTAMPTZ(3)NOT NULLCURRENT_TIMESTAMPวันที่สร้างบัญชี
created_byINTEGERNOT NULL0user id ของผู้สร้าง
updated_dateTIMESTAMPTZ(3)NULLวันที่แก้ไขล่าสุด (Prisma @updatedAt)
updated_byINTEGERNULL0user id ของผู้แก้ไขล่าสุด
deleted_dateTIMESTAMPTZ(3)NULLวันที่ลบแบบ soft delete (NULL = ยังไม่ถูกลบ)
verification_tokenVARCHAR(64)NULLtoken สำหรับยืนยันอีเมล/ตั้งรหัสผ่านครั้งแรก (มีใน DB จริงแต่ยังไม่ถูก track ใน Prisma)

ตาราง password_history

ColumnTypeNullableDefaultคำอธิบาย
idINTEGERNOT NULLnextval (serial)ลำดับ
user_idINTEGERNOT NULL0Id user -> ref จาก table user.id
passwordVARCHAR(255)NOT NULLรหัสผ่าน (เก็บแบบเข้ารหัส/hash)
created_dateTIMESTAMPTZ(3)NOT NULLCURRENT_TIMESTAMPวันที่สร้าง
expired_dateTIMESTAMPTZ(3)NOT NULLวันที่ password หมดอายุ

ตาราง forgot_password

ColumnTypeNullableDefaultคำอธิบาย
idINTEGERNOT NULLnextval (serial)ลำดับ
codeVARCHAR(50)NOT NULLcode สำหรับเช็คว่า url สำหรับ reset password ถูกต้อง
user_idINTEGERNOT NULL0Id user -> ref จาก table user.id
created_dateTIMESTAMPTZ(3)NOT NULLCURRENT_TIMESTAMPวันที่สร้าง
expired_dateTIMESTAMPTZ(3)NOT NULLวันที่ code หมดอายุ
statusCommonStatus (enum)NOT NULLactiveสถานะของ code (ใช้แล้ว/ยกเลิกจะไม่เป็น active)
deleted_dateTIMESTAMPTZ(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 ในระบบ — สิ่งที่ชื่อคล้ายกันคือ index line_user_line_oa_id_idx ซึ่งเป็น index บนคอลัมน์ line_oa_id ของตาราง line_user ไม่ใช่ตารางแยก