Skip to main content

สมัครใช้งาน (Self-service Registration)

ภาพรวม

โมดูล registration เปิดทางให้ลูกค้าใหม่สมัครใช้งานระบบได้ด้วยตัวเอง โดยไม่ต้องรอให้ admin สร้างบัญชีให้ ขั้นตอนโดยรวมคือผู้ใช้กรอกฟอร์มสมัคร ระบบสร้าง organization และ user แล้วส่งอีเมลยืนยัน จากนั้นผู้ใช้กดลิงก์ยืนยันและเริ่มใช้งานได้ทันที นอกจากนี้ยังมี endpoint สำหรับตรวจสอบอีเมลซ้ำแบบเรียลไทม์ให้ฟอร์มฝั่งเว็บเรียกใช้

ทุก route ของโมดูลนี้เป็น @Public() เพราะในขั้นตอนนี้ยังไม่มี token

Business Flow

  1. ผู้ใช้พิมพ์อีเมลลงในฟอร์ม cms-web เรียก GET /api/auth/check-email?email=... เพื่อแจ้งทันทีว่าอีเมลนี้ใช้ได้หรือมีอยู่ในระบบแล้ว
  2. POST /api/auth/register พร้อมข้อมูลการสมัคร เช่น อีเมล รหัสผ่าน และชื่อองค์กร
    • hash รหัสผ่านด้วย bcrypt ใน hash.go
    • สร้างแถวในตาราง organization และ user โดยผูก role เริ่มต้นของลูกค้า
    • สร้าง verification token แบบสุ่มด้วย crypto/rand แล้วแปลงเป็น hex
    • ตอบกลับสถานะ 201
  3. ระบบส่งอีเมลยืนยันผ่าน Mailer ที่แชร์ร่วมกันใน internal/mail ซึ่งใช้ environment กลุ่ม MAIL_SMTP_* ชุดเดียวกับ nodemailer transport ของ NestJS เดิม จึงให้ผลลัพธ์เหมือนกัน
  4. ผู้ใช้กดลิงก์ในอีเมล ระบบเรียก GET /api/auth/verify-email?token=... แล้วเปลี่ยนสถานะ user เป็นยืนยันแล้ว ทำให้ผู้ใช้ล็อกอินได้
  5. จากจุดนี้ผู้ใช้เข้าสู่ flow ปกติ คือ login แล้วเลือก LINE OA ก่อนเริ่มใช้งาน CMS

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

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

MethodRouteHandlerGuard
POST/api/auth/registerct.registerpublic (ตอบ 201)
GET/api/auth/verify-emailct.verifyEmailpublic, รับ query token
GET/api/auth/check-emailct.checkEmailpublic, รับ query email

RegisterRoutes(public, _, d) — โมดูลนี้ไม่ใช้ group authed เลย

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

  • Permission — ไม่ต้องมีสิทธิ์ใด ๆ เพราะเป็น public ทั้งหมด
  • ตารางorganization, user, system_role (สำหรับ role เริ่มต้น) และ password_history
  • Mailerinternal/mail/mail.go ตั้งค่าจาก environment MAIL_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