Skip to main content

จัดการผู้ใช้งาน CMS

ภาพรวม

โมดูล user ดูแลบัญชีผู้ใช้ที่เข้ามาทำงานในระบบ CMS ครอบคลุมตั้งแต่การสร้าง แก้ไข เปิด/ปิดสถานะ ลบแบบ soft/hard การรีเซ็ตรหัสผ่านโดยผู้ดูแลระบบ การอ่านสิทธิ์ของตัวเอง ไปจนถึงการกำหนดว่าผู้ใช้แต่ละคนเข้าถึง LINE OA ใดได้บ้าง

ลักษณะเฉพาะของโมดูลนี้คือ route ทั้งหมดถูก register ไว้บน group public แล้วผูก JwtLoginAuth เข้าไปเอง แทนที่จะใช้ global JwtAuth เหตุผลคือหน้าจัดการผู้ใช้ต้องเรียกได้โดยไม่ต้องผูกกับ lineOaId ซึ่งเป็นเงื่อนไขของ group authed

Business Flow

การจัดการข้อมูลผู้ใช้

  1. GET /api/user แสดงรายการผู้ใช้แบบแบ่งหน้า รองรับ filter และ search ตาม QueryParamsUserDto โดย scope ผลลัพธ์ตามองค์กรของผู้เรียก
  2. GET /api/user/find-all-object คืนข้อมูลรูปแบบ {id: name} สำหรับใช้ทำ dropdown
  3. POST /api/user สร้างผู้ใช้ใหม่ รับเป็น multipart/form-data เพื่อรองรับการอัปโหลดรูป avatar ระบบจะ hash รหัสผ่านและบันทึกลง password history
  4. PUT /api/user/:id แก้ไขข้อมูล และ PUT /api/user/:id/status เปิด/ปิดการใช้งานบัญชี
  5. DELETE /api/user/:id ลบแบบ soft delete โดย stamp ค่า deleted_date
  6. DELETE /api/user/:id/hard ลบข้อมูลจริง ต้องเป็น super admin และส่ง query ?confirm=true กำกับ

การรีเซ็ตรหัสผ่านโดยผู้ดูแลระบบ

POST /api/user/:id/admin-reset-password ให้ผู้ดูแลระบบสั่งรีเซ็ตรหัสผ่านของผู้ใช้คนอื่นได้โดยตรง ซึ่งเป็นคนละเส้นทางกับ self-service flow ในหัวข้อจัดการรหัสผ่าน

การอ่านสิทธิ์ของตัวเอง

GET /api/user/:id/permission มีเงื่อนไขพิเศษคือ service จะตรวจว่า :id ต้องตรงกับ selfId ใน CLS มิฉะนั้นตอบกลับ 400 พร้อมข้อความ Cannot access other userId ฝั่ง cms-web ใช้ผลลัพธ์ของ endpoint นี้ตัดสินใจว่าจะแสดงเมนูใดบ้าง

การกำหนดสิทธิ์เข้าถึง OA รายบุคคล

GET /api/user/:id/oa-access และ PUT /api/user/:id/oa-access ให้ผู้ดูแลขององค์กรกำหนดว่า ผู้ใช้คนนี้มองเห็นและเลือก LINE OA ใดได้บ้าง โดยบันทึกลงตาราง user_line_oa ความสามารถนี้เป็นส่วนที่เพิ่มเข้ามาใหม่นอกเหนือจากระบบ NestJS เดิม

ไฟล์และฟังก์ชันหลัก

โค้ดอยู่ที่ internal/modules/user/ ประกอบด้วย controller.go, service.go และ dto.go

MethodRouteHandlerPolicy (metadata)
GET/api/userct.findAllreadAll user
GET/api/user/find-all-objectct.findAllObject
GET/api/user/:idct.findByIdread user
GET/api/user/:id/permissionct.findPermissionByUserIdจำกัดใน service
GET/api/user/:id/oa-accessct.getOaAccessread user
PUT/api/user/:id/oa-accessct.updateOaAccessupdate user
POST/api/userct.createcreate user
POST/api/user/:id/admin-reset-passwordct.adminResetPasswordupdate user
PUT/api/user/:idct.updateupdate user
PUT/api/user/:id/statusct.updateStatusByIdupdate user
DELETE/api/user/:idct.deletedelete user
DELETE/api/user/:id/hardct.hardDeleteauth.SuperAdmin()

ทุก route ใส่ ct.jwtLogin (JwtLoginAuth) เป็น middleware ตัวแรกเสมอ

จุดเชื่อมต่อกับ Service อื่น

  • Permission — policy metadata ใช้ PolicyModuleUser แต่ยังไม่บังคับใช้จริง สิ่งที่บังคับจริงในปัจจุบันคือ auth.SuperAdmin() บน route hard delete
  • ตารางที่เกี่ยวข้องuser, user_line_oa, organization, system_role, system_role_module, organization_module, password_history, forgot_password
  • Cross-module — เรียก systemmodule.Service.FindAllObject เพื่อ map module_id ไปเป็นชื่อโมดูลภายใน FindPermissionByUserID
  • Storage — การอัปโหลดรูป avatar ทำผ่าน internal/storage
  • หมายเหตุ — flow forgot / reset / change password ที่ผู้ใช้ทำเองไม่ได้อยู่ในโมดูลนี้ แต่อยู่ในโมดูล auth