Langsung ke konten utama

Ringkasan

KilatKoding menyimpan state utamanya di Supabase PostgreSQL. Selain tabel user-facing seperti profile, subscription, dan payments, repo ini juga sudah menyiapkan tabel operasional seperti webhook events, audit logs, dan persistent rate limits.

Migrasi yang tersedia

FileMembuat atau menambah
20260316000001_create_profiles.sqlTabel profiles dan trigger auto-create profile
20260316000002_create_subscriptions.sqlTabel subscriptions dan FREE tier default
20260316000003_create_payments.sqlTabel payments dan enum pembayaran
20260316000004_create_waitlist.sqlTabel waitlist
20260316000005_create_ai_usage.sqlTabel ai_usage
20260317000006_add_admin_roles_and_billing_hardening.sqlTabel user_roles, metadata billing, index dan RPC admin
20260317000007_add_avatar_storage.sqlKolom avatar profile dan storage bucket avatars
20260317000008_add_webhook_events.sqlTabel webhook_events dan RPC claim idempotent
20260317000009_add_persistent_rate_limits.sqlTabel rate_limit_buckets dan RPC consume rate limit
20260317000010_add_audit_logs.sqlTabel audit_logs

Tabel yang paling penting

TabelFungsi
profilesNama lengkap, avatar, metadata profil
subscriptionsPlan aktif, status, periode berjalan, cancel flags
paymentsRiwayat pembayaran dan metadata gateway
waitlistDaftar email waitlist
ai_usageTracking penggunaan token AI
user_rolesRole aplikasi seperti admin dan member
webhook_eventsLedger event webhook
rate_limit_bucketsPenyimpanan rate limit persisten
audit_logsJejak perubahan penting

Source of truth access control

Source of truth akses admin adalah tabel user_roles, bukan ADMIN_EMAILS. ADMIN_EMAILS hanya dipakai sebagai bootstrap awal agar email tertentu otomatis di-upsert menjadi admin saat login pertama.

Avatar storage

Repo ini memakai bucket avatars di Supabase Storage.

Aturan penting

  • ukuran maksimal avatar: 2 MB
  • format yang diterima: image/jpeg, image/png, image/webp, image/gif
  • object path: ${userId}/avatar
  • signed URL avatar berlaku terbatas dan dibuat saat dibutuhkan

Webhook ledger

Tabel webhook_events dipakai untuk:
  • mencegah duplicate processing,
  • menyimpan payload event,
  • mencatat status processed atau failed,
  • membantu debugging dari admin dashboard.

Audit log

Tabel audit_logs menangkap event seperti:
  • perubahan profil,
  • aksi admin,
  • status payment sukses atau gagal,
  • perubahan subscription.
Ini penting untuk operasi harian dan investigasi masalah.

Persistent rate limit

Jika SUPABASE_SERVICE_ROLE_KEY tersedia, KilatKoding akan memakai Supabase untuk rate limit persisten pada:
  • contact form,
  • waitlist,
  • payment creation,
  • AI routes.
Kalau env itu tidak ada, repo fallback ke in-memory rate limit. Cocok untuk local development, tetapi tidak ideal untuk production multi-instance.

Cara apply migrasi

npx supabase db push
Kalau kamu tidak memakai Supabase CLI, kamu bisa menyalin file SQL ke SQL editor Supabase secara berurutan.

Cara generate ulang type database

npx supabase gen types typescript --project-id YOUR_PROJECT_ID > types/database.ts
Lakukan ini setelah migrasi live kamu benar-benar sudah sesuai.
Kalau billing, admin, avatar, atau webhook terasa tidak konsisten, cek dulu apakah semua migrasi sudah benar-benar terpasang di project Supabase kamu.
Kalau kamu ingin gambaran relasi tabel yang lebih cepat dibaca daripada daftar migrasi, buka Peta database.