จัดการผู้ใช้งาน CMS
ภาพรวม
โมดูล user ดูแลบัญชีผู้ใช้ที่เข้ามาทำงานในระบบ CMS ครอบคลุมตั้งแต่การสร้าง แก้ไข เปิด/ปิดสถานะ ลบแบบ soft/hard การรีเซ็ตรหัสผ่านโดยผู้ดูแลระบบ การอ่านสิทธิ์ของตัวเอง ไปจนถึงการกำหนดว่าผู้ใช้แต่ละคนเข้าถึง LINE OA ใดได้บ้าง
ลักษณะเฉพาะของโมดูลนี้คือ route ทั้งหมดถูก register ไว้บน group public แล้วผูก JwtLoginAuth
เข้าไปเอง แทนที่จะใช้ global JwtAuth เหตุผลคือหน้าจัดการผู้ใช้ต้องเรียกได้โดยไม่ต้องผูกกับ
lineOaId ซึ่งเป็นเงื่อนไขของ group authed
Business Flow
การจัดการข้อมูลผู้ใช้
GET /api/userแสดงรายการผู้ใช้แบบแบ่งหน้า รองรับ filter และ search ตามQueryParamsUserDtoโดย scope ผลลัพธ์ตามองค์กรของผู้เรียกGET /api/user/find-all-objectคืนข้อมูลรูปแบบ{id: name}สำหรับใช้ทำ dropdownPOST /api/userสร้างผู้ใช้ใหม่ รับเป็น multipart/form-data เพื่อรองรับการอัปโหลดรูป avatar ระบบจะ hash รหัสผ่านและบันทึกลง password historyPUT /api/user/:idแก้ไขข้อมูล และPUT /api/user/:id/statusเปิด/ปิดการใช้งานบัญชีDELETE /api/user/:idลบแบบ soft delete โดย stamp ค่าdeleted_dateDELETE /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
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/user | ct.findAll | readAll user |
| GET | /api/user/find-all-object | ct.findAllObject | — |
| GET | /api/user/:id | ct.findById | read user |
| GET | /api/user/:id/permission | ct.findPermissionByUserId | จำกัดใน service |
| GET | /api/user/:id/oa-access | ct.getOaAccess | read user |
| PUT | /api/user/:id/oa-access | ct.updateOaAccess | update user |
| POST | /api/user | ct.create | create user |
| POST | /api/user/:id/admin-reset-password | ct.adminResetPassword | update user |
| PUT | /api/user/:id | ct.update | update user |
| PUT | /api/user/:id/status | ct.updateStatusById | update user |
| DELETE | /api/user/:id | ct.delete | delete user |
| DELETE | /api/user/:id/hard | ct.hardDelete | auth.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เพื่อ mapmodule_idไปเป็นชื่อโมดูลภายในFindPermissionByUserID - Storage — การอัปโหลดรูป avatar ทำผ่าน
internal/storage - หมายเหตุ — flow forgot / reset / change password ที่ผู้ใช้ทำเองไม่ได้อยู่ในโมดูลนี้ แต่อยู่ในโมดูล auth