APSOC — Panduan Lengkap
Sistem manajemen komunitas freediving untuk Apnea Society.
Roles & Akses
5 Tipe Pengguna
APSOC menggunakan sistem ACL (Access Control List) berbasis role. Setiap pengguna dapat memiliki satu atau lebih role.
Akses Admin
Super Admin
Akses penuh ke semua modul + pengaturan ACL
Admin
Kelola member, jadwal, akademi, event, analytics
Coach
Kelola sesi, absensi, batch, sertifikasi, skill
Akses Member
Buddy
Member senior — akses tambahan ke buddy system & statistik
Community Member
Anggota komunitas — akses area member standar
Authentication
Alur Login
Buka halaman login
Kunjungi /login. Masukkan email dan password akun APSOC.
Supabase Auth memverifikasi kredensial
Email + password diverifikasi oleh Supabase. Token JWT dikembalikan.
Sistem membaca ACL role
Server membaca role aktif dari tabel acl_role_grants.
Redirect ke /dashboard
Redirect ke /profile
PIN Sekunder
PIN 6 digit sebagai lapisan verifikasi kedua. Default dari tanggal lahir (DDMMYY), harus diganti saat pertama kali login.
Keamanan Login
- • Rate limit: 5 percobaan login per 15 menit (per IP & per email)
- • PIN: 5 percobaan salah → akun terkunci 30 menit
- • Cookie token: HttpOnly + Secure (HTTPS) — tidak bisa diakses JS
- • Logout → token Supabase di-revoke immediately
- • Audit log: setiap login attempt, PIN action, permission denial
Alur Pengguna
Cara Daftar Waiting List
Waiting list (Next Wave) untuk calon member yang ingin di-notifikasi saat batch baru dibuka. Tidak perlu akun — cukup verifikasi email.
- 1
Buka Landing Page
Kunjungi / → scroll ke section CTA atau klik 'Join Society'
- 2
Isi Email
Form Next Wave: input email aktif yang bisa diakses
- 3
Klik 'Kirim Kode OTP'
System kirim OTP 6-digit ke email kamu (berlaku 10 menit)
- 4
Verifikasi OTP
Input kode dari email → klik 'Verifikasi Kode'
- 5
Lengkapi Profil Singkat
Nama lengkap + Instagram (opsional)
- 6
Klik 'Join Next Wave'
Data tersimpan, kamu masuk waitlist. Counter publik bertambah +1
- 7
Tunggu Notifikasi
Saat batch baru buka, admin email kamu duluan sebelum publik
Penting
Email harus terverifikasi sebelum data masuk database (mitigasi spam)
Privacy
Data hanya dipakai untuk notifikasi batch — tidak dibagikan ke pihak ketiga
Alur Pengguna
Cara Daftar Event
Event publik (kelas, workshop, talkshow) bisa didaftari tanpa akun member. Pakai token tracking untuk cek status kapan saja.
- 1
Browse Events
Kunjungi /events → lihat list event aktif (filter by tipe)
- 2
Pilih Event
Klik card event → halaman detail dengan info lengkap (deskripsi, jadwal, kapasitas, harga)
- 3
Klik 'Daftar Sekarang'
Form 3-step wizard di sidebar event detail page
- 4
Step 1 — Verifikasi Email
Input email → kirim OTP → verifikasi (sama seperti Next Wave)
- 5
Step 2 — Data Peserta
Nama, HP, usia, Instagram, program yang diminati, catatan
- 6
Step 3 — Konfirmasi + Consent
Review data → centang persetujuan waiver → submit
- 7
Terima Token Pendaftaran
Sukses → halaman success menampilkan TOKEN (token.id) — simpan untuk cek status
- 8
Tunggu Konfirmasi Admin
Admin review → approve/reject → notifikasi via email
Cek Status
Buka /events/[slug]/status → input token atau email kamu
Anti Spam
Rate limit 3 daftar per IP per 10 menit + honeypot field
Internal Event
Event tag 'internal' = member only, tidak muncul di /events publik
Alur Pengguna
Cara Jadi Anggota Komunitas
Komunitas APSOC bersifat semi-eksklusif — hanya untuk yang sudah punya basic foundation (sertifikasi apnea sport ATAU alumni Underwater Academy).
Sudah Punya Sertifikasi
Untuk freediver/mermaid yang sudah pegang lisensi dari AIDA, Molchanovs, SSI, atau cabang apnea sport lainnya.
- 1Buka /community → baca filosofi & syarat
- 2Klik 'Gabung Waiting List' → isi form Next Wave
- 3Tim APSOC verifikasi sertifikasi (admin contact)
- 4Lengkapi profil + surat sehat
- 5Aktif di waiting list latihan komunitas
Alumni Underwater Academy
Untuk yang lulus kelas di Underwater Academy (Discovery, Basic/AIDA 2, atau Advance) — auto eligible.
- 1Daftar kelas via /academy
- 2Ikuti program (theory + pool + open water)
- 3Lulus → dapat sertifikat + akses komunitas
- 4Admin auto-promote ke role 'community_member'
- 5Login ke /home → akses jadwal latihan komunitas
Onboarding Setelah Disetujui
- 1
Admin Buat Akun Login
Dari dashboard /dashboard/members atau /dashboard/accounts → klik 'Buat Akun Login' → system create akun Supabase + password sementara
- 2
Kredensial Diberikan ke Member
Admin share email + password sementara via WA/email private
- 3
Login Pertama Kali
Member buka /login → input email + password sementara → redirect ke /home
- 4
Ganti PIN (Wajib)
PIN default = DDMMYY tanggal lahir → harus diganti via /change-pin
- 5
Lengkapi Profil + Consent
Onboarding: kontak darurat, data medis, persetujuan waiver
- 6
Profil Aktif — Mulai Latihan
Bisa RSVP sesi, lihat skill progress, ambil badge, akses semua fitur member
Admin Area
Dashboard Admin
Akses khusus Super Admin, Admin, dan Coach. URL: /dashboard/*
Dashboard
/dashboardOverview metrics: jumlah member aktif, batch berjalan, PWYF bulan ini, badge diperoleh, event mendatang, stats komunitas.
Members
/dashboard/membersDaftar seluruh anggota. Buat member baru, edit profil, lihat timeline aktivitas, kelola akun login (buat akun Supabase, reset password), assign/revoke ACL role.
- Detail member (timeline, sertifikasi, badge, skill)
- Buat akun login
- Reset password
- Assign role
Schedule
/dashboard/scheduleKelola sesi latihan. Buat template berulang, generate jadwal mingguan, assign coach, check-in absensi live.
- Template sesi (weekly recurring)
- Generate & publish
- Coach assignment
- Check-in live
Academy / Batch
/dashboard/enrolledKelola batch kursus AIDA/Molchanovs. Screening peserta, verifikasi pembayaran, rekam hasil akhir, terbitkan sertifikat.
- Buat & manage batch
- Enrollment state machine
- Verifikasi pembayaran
- Record certificate
Certifications
/dashboard/certificationsRekam & verifikasi sertifikasi member (AIDA, Molchanovs, dll). Verify/unverify cert, trigger badge evaluation.
Check-in
/dashboard/check-inAbsensi live per sesi. RSVP check-in, walk-in registration, rekam kehadiran.
Events
/dashboard/eventsKelola event freediving, mermaid class, talkshow. Buka/tutup pendaftaran, kelola peserta.
Trips
/dashboard/tripsKelola trip freediving terkurasi. Itinerary, equipment list, enrollment management, konfirmasi pembayaran.
Skills
/dashboard/skillsDefinisi skill APSOC (W1/AIDA 2, W2/AIDA 3). Quick-mark progress per member (pass/fail per skill).
Badges
/dashboard/badgesDefinisi & award badge. Badge otomatis (rule engine) + badge manual kehormatan. Award ke member pilihan.
Dive Buddy
/dashboard/dive-buddyPasangan buddy freediving. Buat pasangan, pause/end relasi. Jadwal & rekam hasil buddy exam.
Pay What You Feel
/dashboard/pwyfRekam kontribusi PWYF member. Filter per periode, rekonsiliasi dengan CSV bank (BCA/Mandiri).
Analytics
/dashboard/analyticsCommunity health metrics, training activity, academic pipeline, progress heatmap skill.
Blog
/dashboard/blogKelola artikel blog. Buat/edit/publish/hapus artikel dengan metadata SEO lengkap.
Audit Log
/dashboard/auditRiwayat semua aksi admin: login, perubahan data, grant/revoke role, setting diubah. Filter by type, target, tanggal.
Settings
/dashboard/settingsKonfigurasi brand, feature flags (aktifkan/nonaktifkan modul), operasional (jam sesi, kapasitas), notifikasi.
- Brand (nama, tagline, social)
- Feature flags (PWYF, maintenance mode)
- Operational
- Notification templates
ACL / Roles
/dashboard/aclRole-Based Access Control. Edit matrix permission per role, assign/revoke role ke member.
- Permission matrix per role
- Assign role ke person
- Revoke role
Next Wave
/dashboard/next-waveKelola waiting list calon member. Follow-up, promote ke akun member, tracking status.
- List waitlist
- Promote to member
- Send notification
Kelola Akun
/dashboard/accountsManajemen akun login Supabase. Buat akun, reset PIN, promote role, link enrollment ke person.
- Buat akun dari enrollment
- Reset PIN
- Promote to member
- Link enrollment
Semua Peserta
/dashboard/pesertaGabungan peserta dari semua sumber: batch enrollment, event registration, trip. Filter, link ke akun member.
Challenges
/dashboard/challengesGamifikasi komunitas. Buat challenge (skill milestone, attendance streak, custom), track completion, auto-award badge.
Ocean Signals
/dashboard/signalsPengumuman internal untuk member. Buat, publish, pin, archive. Tampil di home member.
Gear Locker
/dashboard/gearInventaris perlengkapan komunitas. Track aset: buoy, lanyard, storage box, dll.
Rekonsiliasi
/dashboard/reconciliationUpload CSV bank (BCA/Mandiri) dan cocokkan dengan data PWYF. Identifikasi transaksi belum ter-record.
Progress Analytics
/dashboard/progressVisualisasi progress skill seluruh member. Heatmap, completion rate, distribusi per level.
Member Area
Area Member
Desain mobile-first. URL: /home, /profile, dsb.
Alur Onboarding Member Baru
Admin buat data member
Admin isi form: nama, email, tanggal lahir, kontak. System generate kode member & PIN sementara.
Admin buat akun login
Klik 'Buat Akun Login'. System buat akun Supabase & generate password sementara.
Member login pertama kali
Member masuk dengan email + password sementara → redirect ke /profile → diminta ganti PIN.
Lengkapi profil
Member isi kontak darurat, data kesehatan, setujui consent. Profil aktif.
Home
/homeDashboard personal member. Quick links, sesi berikutnya, pinned badge, skill summary, ocean signals.
Profil
/profileData lengkap member. Identitas, kontak darurat, data kesehatan, sesi berikutnya, badge, quick links.
Edit Profil
/profile/edit/*Edit identitas, kontak darurat, data medis & waiver.
Jadwal Sesi
/scheduleLihat sesi latihan mendatang. RSVP hadir/tidak. Lihat riwayat sesi sebelumnya.
Progress Skill
/progressPantau progress skill AIDA 2 & AIDA 3. Status: belum mulai, sedang, lulus, gagal. Progress bar keseluruhan.
Kelas Saya
/enrolledDaftar batch yang diikuti. Status enrollment, jadwal, hasil akhir.
Sertifikasi
/certificatesSemua depth card & sertifikasi yang dimiliki. Status verifikasi.
Badges
/profile/badgesGaleri badge yang diperoleh. Pin badge favorit (maks 3) untuk ditampilkan di profil.
Ganti PIN
/change-pinGanti PIN sekunder (6 digit). PIN digunakan untuk verifikasi aksi sensitif.
Privasi & Data
/profile/privacyLihat log akses data, download data pribadi, tarik consent.
Statistik
/statsAnalytics personal: attendance chart, skill radar, badge collection, streak data.
Trip Saya
/tripsDaftar trip yang diikuti. Status enrollment, detail trip, tombol batalkan.
Notifikasi
/notificationsPusat notifikasi. Badge earned, batch accepted, skill marked, system announcements. Mark read, dismiss.
Buddy Dashboard
/buddyKhusus role Buddy. Lihat pasangan buddy, assist check-in member lain, statistik buddy, hasil ujian.
Leaderboard
/leaderboardPeringkat komunitas: sessions attended, challenges completed, PWYF contributions. Top 50 + ranking sendiri.
PWYF Saya
/pwyfRiwayat kontribusi Pay What You Feel. Total, jumlah kontribusi, detail per bulan.
ACL
Tabel Akses Fitur
Ringkasan permission per role. Admin dapat mengubah matrix ini melalui /dashboard/acl.
| Fitur | S.Admin | Admin | Coach | Buddy | Member |
|---|---|---|---|---|---|
| Akses Dashboard Admin | |||||
| Lihat daftar member | |||||
| Buat member baru | |||||
| Kelola akun login member | |||||
| Assign role ACL | |||||
| Edit matrix permission | |||||
| Kelola sesi latihan | |||||
| Check-in absensi | |||||
| Kelola batch & akademi | |||||
| Verifikasi sertifikat | |||||
| Quick-mark skill | |||||
| Kelola event & trip | |||||
| Lihat analytics | |||||
| Kelola settings | |||||
| Lihat audit log | |||||
| Akses profil sendiri | |||||
| Lihat jadwal sesi | |||||
| RSVP sesi | |||||
| Lihat sertifikat sendiri | |||||
| Lihat progress skill sendiri | |||||
| Daftar event & trip | |||||
| PWYF kontribusi | |||||
| Kelola challenges | |||||
| Complete challenge (member) | |||||
| Kelola ocean signals | |||||
| Lihat notifikasi sendiri | |||||
| Lihat leaderboard | |||||
| Kelola next wave | |||||
| Kelola akun login | |||||
| Buddy assist check-in |
Admin Guide
Kelola Member & Akun Login
Tambah member baru
- Buka /dashboard/members → klik Tambah
- Isi: nama lengkap, email, tanggal lahir (wajib), kontak, kota
- System auto-generate kode member (APSOC-2026-XXXX) dan PIN sementara (DDMMYY)
Buat akun login Supabase
- Detail member → tab 'Akun Login' → 'Buat Akun Login'
- Password sementara ditampilkan sekali — catat dan berikan ke member
Reset password member
- Tab 'Akun Login' → 'Generate Link Reset Password'
- Salin link dan bagikan ke member lewat WA/email (berlaku 1 jam)
Assign role ke member
- Buka /dashboard/acl/persons/[id] → 'Add Role'
- Role bisa diberi expiry date (instruktur tamu, dll)
Teknikal
Tech Stack
Framework
Next.js 16 (App Router)
React 19 + TypeScript
Styling
Tailwind CSS v4
shadcn/ui (Base UI)
Backend
Hono API Router
Mounted di Next.js /api/*
Database
PostgreSQL (Supabase)
Drizzle ORM (type-safe)
Auth
Supabase Auth
Email+password + custom PIN
Hosting
Vercel (target)
Edge-compatible proxy
APSOC System v1.0 · Apnea Society Yogyakarta · 2026