Data Dictionary
Domain / enum
| Domain | Nilai | Arti |
|---|---|---|
member_status |
unverified, active, suspended, deleted |
Lifecycle akun; deleted adalah soft delete. |
member_role |
member, super_admin |
Otorisasi tingkat aplikasi. |
plan_type |
free, trial, paid |
Model komersial paket. |
license_status |
active, active_free, grace_period, suspended, cancelled |
Status lisensi dan claim JWT. |
order_status |
pending_payment, paid, failed, expired, cancelled, duplicate |
Status sesi checkout. |
payment_status |
pending, settlement, failed, expired, cancelled, refunded |
Status canonical pembayaran. |
payment_gateway |
midtrans, xendit |
Gateway pada versi awal. |
Definisi data lintas tabel
| Elemen | Tipe/format | Definisi dan aturan |
|---|---|---|
id |
UUID v4 | Identifier internal. |
created_at, updated_at |
UTC timestamptz |
updated_at berubah saat entitas dimutasi. |
email |
maks. 320 karakter | Ditim/lowercase sebelum penyimpanan; unik global. |
*_hash |
string hash | Hash satu arah; nilai asli tidak disimpan atau dilog. |
amount / price_amount |
bigint |
Unit minor sesuai currency; tidak memakai floating point. |
currency |
ISO 4217, 3 karakter | Default saat ini IDR. |
metadata, payload, features |
jsonb |
Data fleksibel yang tetap divalidasi aplikasi; tanpa secret. |
expires_at |
UTC timestamptz |
Batas token, order, atau akses; null hanya untuk konsep tanpa expiry. |
Definisi entitas
| Entitas | Identitas bisnis | Data penting | Retensi / catatan |
|---|---|---|---|
| Member | members.email |
Nama, password hash, status, role. | Soft-delete agar jejak transaksi/audit tetap ada. |
| Product | products.code |
Nama, redirect SSO, status aktif, grace period. | Nonaktifkan, jangan hapus bila punya lisensi. |
| Plan | product_id + code |
Harga, durasi, interval, tipe, fitur. | Harga dapat berubah; order menyimpan snapshot. |
| License | licenses.license_key |
Pemilik, produk, tier, status, masa aktif. | ID tidak berubah saat renew; baru dibuat ulang setelah cancelled. |
| Order | orders.order_number |
Member, plan, nominal, gateway, expiry. | Nilai komersial setelah dibuat tidak dimutasi. |
| Payment | gateway + gateway_transaction_id |
Order, status gateway, nominal, waktu bayar. | Response mentah disanitasi dari data sensitif. |
| Webhook Event | gateway + external_event_id |
Payload, validasi signature, waktu proses. | Bukti idempotensi dan troubleshooting. |
| OAuth Client | oauth_clients.client_id |
Redirect URI, scope, secret hash. | Secret ditampilkan sekali saat pendaftaran client. |
| Authorization Code | code_hash |
Member, client, produk/lisensi, PKCE, expiry. | Sekali pakai dan berumur sangat singkat. |
| Refresh Token | token_hash |
Client, member, lisensi, scope, revoke/rotation. | Direvoke saat logout, insiden, atau lisensi suspended. |
| JWT Signing Key | kid |
Public JWK, RS256, lifecycle key. | Private key hanya direferensikan ke secret manager. |
| Audit Log | id |
Aktor, aksi, objek, hasil, IP, metadata aman. | Append-only; tidak diedit oleh aplikasi biasa. |
Aturan kualitas dan keamanan data
- Foreign key memakai
RESTRICTuntuk data keuangan/audit danCASCADEhanya untuk token sementara yang tidak bermakna tanpa pemiliknya. - Webhook dengan signature invalid tidak boleh mengubah
orders,payments, ataulicenses; event tetap dicatat. - Settlement mengubah
payments,orders,licenses, danaudit_logsdalam satu transaksi database. - Akses webhook payload, audit log, dan data OAuth dibatasi untuk Super Admin atau service backend yang berwenang.
- Unique constraint dan idempotency key menangani checkout/webhook ganda; frontend bukan satu-satunya kontrol.