Dokumentasi Sistem

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

1

Buka halaman login

Kunjungi /login. Masukkan email dan password akun APSOC.

2

Supabase Auth memverifikasi kredensial

Email + password diverifikasi oleh Supabase. Token JWT dikembalikan.

3

Sistem membaca ACL role

Server membaca role aktif dari tabel acl_role_grants.

Admin / Coach

Redirect ke /dashboard

Member / Buddy

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. 1

    Buka Landing Page

    Kunjungi / → scroll ke section CTA atau klik 'Join Society'

  2. 2

    Isi Email

    Form Next Wave: input email aktif yang bisa diakses

  3. 3

    Klik 'Kirim Kode OTP'

    System kirim OTP 6-digit ke email kamu (berlaku 10 menit)

  4. 4

    Verifikasi OTP

    Input kode dari email → klik 'Verifikasi Kode'

  5. 5

    Lengkapi Profil Singkat

    Nama lengkap + Instagram (opsional)

  6. 6

    Klik 'Join Next Wave'

    Data tersimpan, kamu masuk waitlist. Counter publik bertambah +1

  7. 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. 1

    Browse Events

    Kunjungi /events → lihat list event aktif (filter by tipe)

  2. 2

    Pilih Event

    Klik card event → halaman detail dengan info lengkap (deskripsi, jadwal, kapasitas, harga)

  3. 3

    Klik 'Daftar Sekarang'

    Form 3-step wizard di sidebar event detail page

  4. 4

    Step 1 — Verifikasi Email

    Input email → kirim OTP → verifikasi (sama seperti Next Wave)

  5. 5

    Step 2 — Data Peserta

    Nama, HP, usia, Instagram, program yang diminati, catatan

  6. 6

    Step 3 — Konfirmasi + Consent

    Review data → centang persetujuan waiver → submit

  7. 7

    Terima Token Pendaftaran

    Sukses → halaman success menampilkan TOKEN (token.id) — simpan untuk cek status

  8. 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).

A

Sudah Punya Sertifikasi

Untuk freediver/mermaid yang sudah pegang lisensi dari AIDA, Molchanovs, SSI, atau cabang apnea sport lainnya.

  1. 1Buka /community → baca filosofi & syarat
  2. 2Klik 'Gabung Waiting List' → isi form Next Wave
  3. 3Tim APSOC verifikasi sertifikasi (admin contact)
  4. 4Lengkapi profil + surat sehat
  5. 5Aktif di waiting list latihan komunitas
B

Alumni Underwater Academy

Untuk yang lulus kelas di Underwater Academy (Discovery, Basic/AIDA 2, atau Advance) — auto eligible.

  1. 1Daftar kelas via /academy
  2. 2Ikuti program (theory + pool + open water)
  3. 3Lulus → dapat sertifikat + akses komunitas
  4. 4Admin auto-promote ke role 'community_member'
  5. 5Login ke /home → akses jadwal latihan komunitas

Onboarding Setelah Disetujui

  1. 1

    Admin Buat Akun Login

    Dari dashboard /dashboard/members atau /dashboard/accounts → klik 'Buat Akun Login' → system create akun Supabase + password sementara

  2. 2

    Kredensial Diberikan ke Member

    Admin share email + password sementara via WA/email private

  3. 3

    Login Pertama Kali

    Member buka /login → input email + password sementara → redirect ke /home

  4. 4

    Ganti PIN (Wajib)

    PIN default = DDMMYY tanggal lahir → harus diganti via /change-pin

  5. 5

    Lengkapi Profil + Consent

    Onboarding: kontak darurat, data medis, persetujuan waiver

  6. 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

/dashboard

Overview metrics: jumlah member aktif, batch berjalan, PWYF bulan ini, badge diperoleh, event mendatang, stats komunitas.

Members

/dashboard/members

Daftar 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/schedule

Kelola 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/enrolled

Kelola 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/certifications

Rekam & verifikasi sertifikasi member (AIDA, Molchanovs, dll). Verify/unverify cert, trigger badge evaluation.

Check-in

/dashboard/check-in

Absensi live per sesi. RSVP check-in, walk-in registration, rekam kehadiran.

Events

/dashboard/events

Kelola event freediving, mermaid class, talkshow. Buka/tutup pendaftaran, kelola peserta.

Trips

/dashboard/trips

Kelola trip freediving terkurasi. Itinerary, equipment list, enrollment management, konfirmasi pembayaran.

Skills

/dashboard/skills

Definisi skill APSOC (W1/AIDA 2, W2/AIDA 3). Quick-mark progress per member (pass/fail per skill).

Badges

/dashboard/badges

Definisi & award badge. Badge otomatis (rule engine) + badge manual kehormatan. Award ke member pilihan.

Dive Buddy

/dashboard/dive-buddy

Pasangan buddy freediving. Buat pasangan, pause/end relasi. Jadwal & rekam hasil buddy exam.

Pay What You Feel

/dashboard/pwyf

Rekam kontribusi PWYF member. Filter per periode, rekonsiliasi dengan CSV bank (BCA/Mandiri).

Analytics

/dashboard/analytics

Community health metrics, training activity, academic pipeline, progress heatmap skill.

Blog

/dashboard/blog

Kelola artikel blog. Buat/edit/publish/hapus artikel dengan metadata SEO lengkap.

Audit Log

/dashboard/audit

Riwayat semua aksi admin: login, perubahan data, grant/revoke role, setting diubah. Filter by type, target, tanggal.

Settings

/dashboard/settings

Konfigurasi 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/acl

Role-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-wave

Kelola waiting list calon member. Follow-up, promote ke akun member, tracking status.

  • List waitlist
  • Promote to member
  • Send notification

Kelola Akun

/dashboard/accounts

Manajemen 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/peserta

Gabungan peserta dari semua sumber: batch enrollment, event registration, trip. Filter, link ke akun member.

Challenges

/dashboard/challenges

Gamifikasi komunitas. Buat challenge (skill milestone, attendance streak, custom), track completion, auto-award badge.

Ocean Signals

/dashboard/signals

Pengumuman internal untuk member. Buat, publish, pin, archive. Tampil di home member.

Gear Locker

/dashboard/gear

Inventaris perlengkapan komunitas. Track aset: buoy, lanyard, storage box, dll.

Rekonsiliasi

/dashboard/reconciliation

Upload CSV bank (BCA/Mandiri) dan cocokkan dengan data PWYF. Identifikasi transaksi belum ter-record.

Progress Analytics

/dashboard/progress

Visualisasi 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

1

Admin buat data member

Admin isi form: nama, email, tanggal lahir, kontak. System generate kode member & PIN sementara.

2

Admin buat akun login

Klik 'Buat Akun Login'. System buat akun Supabase & generate password sementara.

3

Member login pertama kali

Member masuk dengan email + password sementara → redirect ke /profile → diminta ganti PIN.

4

Lengkapi profil

Member isi kontak darurat, data kesehatan, setujui consent. Profil aktif.

Home

/home

Dashboard personal member. Quick links, sesi berikutnya, pinned badge, skill summary, ocean signals.

Profil

/profile

Data 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

/schedule

Lihat sesi latihan mendatang. RSVP hadir/tidak. Lihat riwayat sesi sebelumnya.

Progress Skill

/progress

Pantau progress skill AIDA 2 & AIDA 3. Status: belum mulai, sedang, lulus, gagal. Progress bar keseluruhan.

Kelas Saya

/enrolled

Daftar batch yang diikuti. Status enrollment, jadwal, hasil akhir.

Sertifikasi

/certificates

Semua depth card & sertifikasi yang dimiliki. Status verifikasi.

Badges

/profile/badges

Galeri badge yang diperoleh. Pin badge favorit (maks 3) untuk ditampilkan di profil.

Ganti PIN

/change-pin

Ganti PIN sekunder (6 digit). PIN digunakan untuk verifikasi aksi sensitif.

Privasi & Data

/profile/privacy

Lihat log akses data, download data pribadi, tarik consent.

Statistik

/stats

Analytics personal: attendance chart, skill radar, badge collection, streak data.

Trip Saya

/trips

Daftar trip yang diikuti. Status enrollment, detail trip, tombol batalkan.

Notifikasi

/notifications

Pusat notifikasi. Badge earned, batch accepted, skill marked, system announcements. Mark read, dismiss.

Buddy Dashboard

/buddy

Khusus role Buddy. Lihat pasangan buddy, assist check-in member lain, statistik buddy, hasil ujian.

Leaderboard

/leaderboard

Peringkat komunitas: sessions attended, challenges completed, PWYF contributions. Top 50 + ranking sendiri.

PWYF Saya

/pwyf

Riwayat 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.

FiturS.AdminAdminCoachBuddyMember
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

Step 1

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)
Step 2

Buat akun login Supabase

  • Detail member → tab 'Akun Login' → 'Buat Akun Login'
  • Password sementara ditampilkan sekali — catat dan berikan ke member
Step 3

Reset password member

  • Tab 'Akun Login' → 'Generate Link Reset Password'
  • Salin link dan bagikan ke member lewat WA/email (berlaku 1 jam)
Step 4

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