ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
Swim Private Hub의 개인 수영 레슨. 코치를 선택하고 수영장을 고른 뒤 시간을 정해 원하는 코치와 함께 배울 수 있습니다
Aplikasi les renang privat. Pilih coach, pilih kolam, dan pilih jamnya. Anak atau kamu belajar berenang dengan coach pilihan sendiri, di kolam mitra Swim Private Hub.
교육TypeScript · JavaScriptGitHub @akramshipskin온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Swim Private Hub -- marketplace 3-sisi (kolam, coach, member) untuk les renang privat. Duplikat dari les-renang-cianjur.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Marketplace les renang privat -- kolam (venue), coach independen yang bisa mengajar di beberapa kolam, dan member/orang tua yang membeli paket untuk 1 coach di 1 kolam lalu booking jamnya. Fork dari les-renang-cianjur (produk terpisah 100%, zero shared code/DB), multi-tenant lewat model Pool/PoolAffiliation.README 전문 보기 ↗
Marketplace les renang privat -- kolam (venue), coach independen yang bisa
mengajar di beberapa kolam, dan member/orang tua yang membeli paket untuk 1 coach
di 1 kolam lalu booking jamnya. Fork dari les-renang-cianjur (produk terpisah
100%, zero shared code/DB), multi-tenant lewat model Pool/PoolAffiliation.
Peringatan: README ini ringkasan, bukan acuan aturan bisnis. Urutan acuan bila bertentangan: (1) kode, (2) docs/aturan-bisnis-saat-ini.md, (3) docs/KEPUTUSAN.md, (4) brand-kit/MESSAGING.md, (5) dokumen lama dan README ini. Dokumen lama seperti docs/designs/marketplace-pivot.md (bagi hasil persen, paket lintas kolam) sudah tidak berlaku.
@prisma/adapter-pg)npm install
npx prisma generate
npm run dev
Buka http://localhost:3000.
Buat file .env di root project (lihat .env.example untuk daftar lengkap):
| Variable | Keterangan |
|---|---|
DATABASE_URL | Connection string PostgreSQL (Supabase project TERPISAH dari les-renang-cianjur -- jangan pernah reuse). Untuk migrasi, pakai session pooler (port 5432) -- transaction pooler (port 6543) tidak mendukung advisory lock yang dibutuhkan prisma migrate. |
AUTH_SECRET | Secret untuk NextAuth (generate dengan npx auth secret). |
MIDTRANS_SERVER_KEY / MIDTRANS_CLIENT_KEY / MIDTRANS_IS_PRODUCTION | Kredensial Midtrans PLATFORM (service provider posture -- 1 akun buat semua kolam, bukan per-kolam). |
MIDTRANS_IRIS_SERVER_KEY | Opsional -- pencairan otomatis (lihat src/lib/disbursement.ts). Kosong = pencairan tetap manual lewat /admin/withdrawals. |
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT | Kredensial web push (generate dengan npx web-push generate-vapid-keys). |
NEXT_PUBLIC_APP_URL | Base URL aplikasi. |
npx prisma migrate dev
Kalau DATABASE_URL di .env memakai transaction pooler (port 6543), migrasi akan hang -- override sementara ke session pooler (port 5432) saat migrasi:
DATABASE_URL="<session-pooler-url>" npx prisma migrate dev --name <nama_migrasi>
src/proxy.ts -- middleware untuk guard peran (ADMIN/COACH/MEMBER) dan redirect ganti-password wajib. Di Next.js 16, file middleware ini bernama proxy.ts, bukan middleware.ts.src/lib/cancel-booking.ts -- logika pembatalan booking dengan row-level lock (SELECT ... FOR UPDATE) untuk mencegah race condition saat banyak pembatalan konkuren pada paket yang sama.src/app/api/booking/route.ts -- klaim slot pake conditional update (CAS). Paket hanya bisa dipakai di kolam tempat beli, untuk coach paket itu, di dalam jam buka kolam.src/app/api/availability/route.ts -- endpoint pengecekan slot (filter via ?poolId=), termasuk perhitungan kelayakan pembatalan mandiri per booking.prisma/schema.prisma -- model utama: User (role ADMIN/COACH/MEMBER/POOL_OWNER), Pool, PoolAffiliation, Package, Payment, Availability, Booking, PushSubscription, CoachProfile, WalletTransaction, WithdrawalRequest, MemberWalletTransaction, CoachChangeRequest. Kolom/tabel model lama (PackageTemplate, Pool.commissionPercent/coachSharePercent, Package.isSingleSession/templateId) masih ada di database tapi tidak dipakai kode lagi (drop menyusul). Availability constraint unique(coachId, date, startTime) SENGAJA gak include poolId -- 1 coach cuma boleh punya 1 slot terbuka per jam di SELURUH kolam.src/lib/pricing.ts + src/lib/wallet.ts -- model harga-dari-coach: member bayar harga kolam + harga coach + biaya layanan SPH; tiap sesi Hadir kolam & coach dapat harga mereka ÷ jumlah sesi (dipotong PPh 0,5%), sisanya SPH. Kolam yang dikredit = kolam tempat sesi diajar. WalletTransaction = ledger sumber kebenaran, walletBalance di Pool/CoachProfile cuma cache.src/lib/withdrawal.ts + src/lib/disbursement.ts -- pengajuan pencairan (saldo kepotong pas request, bukan pas approve) + integrasi Midtrans Iris opsional (belum aktif sampai MIDTRANS_IRIS_SERVER_KEY diisi -- fallback manual di /admin/withdrawals).src/app/daftar-kolam/, src/app/daftar-coach/ -- pendaftaran mandiri kolam & coach (pola anti-spam sama kayak /register). Gak ada lagi migrasi jaringan lama via script -- semua mulai dari 0.Admin (founder, sole superadmin di Phase 1) -- kelola user, beri paket gratis manual (tanpa bagi hasil), harga tiket & biaya layanan per kolam (/admin/kolam), ganti coach, riwayat pembayaran, overview booking semua coach, laporan kinerja coach, laporan komisi platform (/admin/komisi), dan proses pencairan saldo (/admin/withdrawals). Belum ada admin per-pool (di luar wallet) -- deferred ke Phase 2.
Pool Owner -- memasang harga tiket paket 4/8 sesi, info & jam buka kolam, laporan, saldo & pencairan kolamnya sendiri. Tidak punya akses ke kolam lain.
Coach -- membuka slot jadwal per kolam yang dia terafiliasi (PoolAffiliation), melihat jadwal coach lain, menandai kehadiran member di sesi yang sudah lewat (memicu payout ke saldonya, /coach/saldo), dan mencairkan saldo.
Member -- membeli paket 4/8 sesi (atau 1 sesi coba) untuk 1 coach di 1 kolam via Midtrans atau saldo, booking slot coach itu, pembatalan mandiri (jatah per paket), riwayat booking. Uang masuk ke platform dulu, lalu dibagi ke saldo kolam & coach per sesi.
Coach shortcut (/pelatih/[coachId], publik) -- halaman statis nunjukin kolam-kolam tempat 1 coach ngajar + link WA, biar parent bisa nemuin coach yang mengajar di kolam lain.
Guest (publik, tanpa login) -- landing page jualan (/), panduan produk (/panduan, /panduan-member), dan halaman legal (/kebijakan-privasi, /syarat-ketentuan, /kebijakan-pengembalian, /kebijakan-cookie). Pendaftaran (/register) punya proteksi anti-spam sederhana (honeypot field + minimum waktu isi form) dan validasi format nomor HP Indonesia di client & server.
<title>/description sendiri; halaman privat (admin/coach/member/profil/ganti-password) di-set noindex.src/app/opengraph-image.tsx -- generate social preview image (1200x630) secara dinamis, gak perlu file gambar statis.src/app/robots.ts & src/app/sitemap.ts -- robots.txt dan sitemap.xml dibuat otomatis oleh Next.js, area privat di-disallow.src/app/not-found.tsx -- halaman 404 custom, konsisten sama design system.Di-deploy otomatis ke Vercel setiap push ke main. Environment variables diatur lewat Vercel dashboard, bukan dari .env lokal.
src/lib/coach-specialties.ts -- daftar keahlian coach (checklist tetap, bukan free-text), plus CoachProfile.hasCertification/certificationNote (badge, bukan proses verifikasi).src/lib/format.ts -- helper format & validasi (nomor telepon Indonesia, rupiah, proper case nama).src/components/legal-page-layout.tsx -- layout bersama buat 4 halaman legal (privasi, S&K, pengembalian, cookie).