specs / 039-Changes-Email-OTP

039 - Email OTP nyata (Resend)

  • Tanggal: 2026-08-20
  • Chat/topik: Backend kirim OTP email sungguhan untuk registrasi dan reset password.

Ringkasan perubahan

Mock OTP 1234 dihapus. POST /auth/otp/send generate kode 4 digit, simpan hash di tabel email_otps, kirim via Resend (sender yang sudah dipakai notifikasi). Verify/reset memakai hash + TTL 10 menit, cooldown 60 detik, max 5 percobaan.

Impact bisnis

Member baru dan reset password tidak lagi bergantung pada kode demo. Verifikasi identitas lewat inbox email. Deliverability bergantung pada EMAIL_FROM memakai domain yang sudah verified di Resend (alamat Gmail sebagai From biasanya ditolak).

Epic / User stories

  • Epic: Auth OTP email.
  • US: Sebagai member, saya ingin menerima kode verifikasi di email setelah daftar atau minta reset password, agar akun saya tidak bisa dibuka dengan kode tebakan tetap.
  • US: Sebagai member, saya ingin kode kadaluarsa dan tidak bisa dicoba berkali-kali, agar akun tetap aman.

User terdampak

Member (register, verify, forgot-password). Staf admin tidak mengelola OTP.

Aplikasi terdampak

  • mpc-be: PERLU — generate/store/send/verify OTP
  • mpc-admin: PERLU — model Prisma EmailOtp saja, tanpa UI
  • mpc-web: PERLU — hapus copy demo 1234 di /otp
  • mpc-android: TIDAK — kontrak API sama (4 digit, email)
  • mpc-ios: TIDAK — kontrak API sama
  • mpc-be-pos: TIDAK — tidak terkait
  • mpc-pos: TIDAK
  • mpc-owner: TIDAK
  • ksr-sync: TIDAK
  • mpc-crm: TIDAK

Perubahan schema

Tabel baru email_otps (id, email unique, code_hash, attempts, expires_at, created_at). Tidak ada kolom baru di customers.

Migration: mpc-dev/docs/schema/migration/026-email-otps.md. Jalankan ALTER di DB server (AUTO_MIGRATE=false di production).

Perubahan kode

  • mpc-be internal/customers: entity/repo OTP, SendOTP/VerifyOTP/ResetPassword, inject EmailSender; HTML BuildOTPEmailHTML; AutoMigrate entity (dev).
  • mpc-be mpc-dev/docs/api/be.md 1.4–1.6; changelog v1.10.
  • mpc-admin Prisma EmailOtp; changelog v0.13.
  • mpc-web /otp copy; changelog v0.9.