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
EmailOtpsaja, tanpa UI - mpc-web: PERLU — hapus copy demo
1234di/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, injectEmailSender; HTMLBuildOTPEmailHTML; AutoMigrate entity (dev). - mpc-be
mpc-dev/docs/api/be.md1.4–1.6; changelog v1.10. - mpc-admin Prisma
EmailOtp; changelog v0.13. - mpc-web
/otpcopy; changelog v0.9.