สมัครใช้งาน (Self-service Registration)
ภาพรวม
โมดูล registration เปิดทางให้ลูกค้าใหม่สมัครใช้งานระบบได้ด้วยตัวเอง โดยไม่ต้องรอให้ admin สร้างบัญชีให้ ขั้นตอนโดยรวมคือผู้ใช้กรอกฟอร์มสมัคร ระบบสร้าง organization และ user แล้วส่งอีเมลยืนยัน จากนั้นผู้ใช้กดลิงก์ยืนยันและเริ่มใช้งานได้ทันที นอกจากนี้ยังมี endpoint สำหรับตรวจสอบอีเมลซ้ำแบบเรียลไทม์ให้ฟอร์มฝั่งเว็บเรียกใช้
ทุก route ของโมดูลนี้เป็น @Public() เพราะในขั้นตอนนี้ยังไม่มี token
Business Flow
- ผู้ใช้พิมพ์อีเมลลงในฟอร์ม cms-web เรียก
GET /api/auth/check-email?email=...เพื่อแจ้งทันทีว่าอีเมลนี้ใช้ได้หรือมีอยู่ในระบบแล้ว POST /api/auth/registerพร้อมข้อมูลการสมัคร เช่น อีเมล รหัสผ่าน และชื่อองค์กร- hash รหัสผ่านด้วย bcrypt ใน
hash.go - สร้างแถวในตาราง
organizationและuserโดยผูก role เริ่มต้นของลูกค้า - สร้าง verification token แบบสุ่มด้วย
crypto/randแล้วแปลงเป็น hex - ตอบกลับสถานะ 201
- hash รหัสผ่านด้วย bcrypt ใน
- ระบบส่งอีเมลยืนยันผ่าน Mailer ที่แชร์ร่วมกันใน
internal/mailซึ่งใช้ environment กลุ่มMAIL_SMTP_*ชุดเดียวกับ nodemailer transport ของ NestJS เดิม จึงให้ผลลัพธ์เหมือนกัน - ผู้ใช้กดลิงก์ในอีเมล ระบบเรียก
GET /api/auth/verify-email?token=...แล้วเปลี่ยนสถานะ user เป็นยืนยันแล้ว ทำให้ผู้ใช้ล็อกอินได้ - จากจุดนี้ผู้ใช้เข้าสู่ flow ปกติ คือ login แล้วเลือก LINE OA ก่อนเริ่มใช้งาน CMS
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/registration/ ประกอบด้วย controller.go, service.go,
dto.go และ hash.go
| Method | Route | Handler | Guard |
|---|---|---|---|
| POST | /api/auth/register | ct.register | public (ตอบ 201) |
| GET | /api/auth/verify-email | ct.verifyEmail | public, รับ query token |
| GET | /api/auth/check-email | ct.checkEmail | public, รับ query email |
RegisterRoutes(public, _, d) — โมดูลนี้ไม่ใช้ group authed เลย
จุดเชื่อมต่อกับ Service อื่น
- Permission — ไม่ต้องมีสิทธิ์ใด ๆ เพราะเป็น public ทั้งหมด
- ตาราง —
organization,user,system_role(สำหรับ role เริ่มต้น) และpassword_history - Mailer —
internal/mail/mail.goตั้งค่าจาก environmentMAIL_SMTP_HOST,MAIL_SMTP_PORT,MAIL_SMTP_USER,MAIL_SMTP_PASS,MAIL_SMTP_FROM_NAMEและMAIL_SMTP_FROM_EMAILADDRESS - หมายเหตุ deviation — NestJS เดิมสร้าง nodemailer transport ของตัวเองใน constructor ส่วนฝั่ง Go ใช้ Mailer ที่แชร์ร่วมกัน แต่พฤติกรรมการส่งเหมือนกันเพราะอ่าน environment ชุดเดียวกัน
- เอกสารที่ต่อเนื่อง — การเข้าสู่ระบบและ JWT และ User Management