Website Mainra Games menampilkan koleksi game dari Mainra Team. Website ini statis, datanya dikelola melalui Supabase CMS dan di-cache di file games-data.json.
- ✅ Menampilkan game unggulan (Highlight)
- ✅ Daftar game yang responsif
- ✅ Desain modern untuk desktop dan mobile
- ✅ Data game dinamis dari Supabase (fallback ke JSON lokal)
- ✅ Dashboard admin di
/mrmainra/untuk kelola game, highlight, dan balasan review
index.html— Halaman utama menampilkan highlight dan 3 game terbaru.games.html— Daftar lengkap game dan highlight.learning.html— Halaman Mainra Learning Community.services.html— Halaman layanan Mainra Games.privacy-policy.html— Halaman kebijakan privasi.terms-of-use.html— Halaman syarat dan ketentuan penggunaan.Assets/data/games-data.json— Cache data game (dihasilkan dari Supabase oleh GitHub Actions).Assets/js/games-loader.js— Logika untuk memuat data game (Supabase → fallback JSON) dan merendernya.Assets/js/supabase-config.js— URL project + publishable key Supabase (nilai publik, aman untuk browser).Assets/js/supabase-client.js— Inisialisasiwindow.supabaseClient.mrmainra/index.html+mrmainra/assets/admin.js|admin.css— Dashboard admin (login Supabase Auth, RLS gated, Games, Analytics & Reviews, Social Broadcast, Contact Form Inbox, Admins).Assets/js/nav.js— Kontrol navigasi dan menu mobile.Assets/js/site.js— Script halaman publik: carousel highlight, tahun footer otomatis, dan integrasi validasi form kontak.Assets/js/contact-validation.js— Aturan validasi form kontak publik (batas panjang mengikuti CHECK di migrasi0024); dipakai browser sekaligus diuji olehtools/tests/contact-inbox.test.mjs.Assets/css/mainra.css— Gaya visual website.Assets/img/— Folder berisi gambar dan ikon website.supabase/— Migration SQL, seed, dan Edge Functions (sync-playstore,sync-reviews,sync-tracks,sync-voided-purchases,sync-inappproducts,sync-store-listings,sync-vitals,sync-conversions,verify-purchase,upload-image,process-review-queue,sync-buffer,ai-social-assistant,manage-admins).supabase/migrations/0018_game_tracks_and_releases.sql— Kolom metadata track, staged rollout status, version, dan changelog/release notes resmi dari Play Console.supabase/migrations/0019_game_voided_purchases.sql— Tabel transaksi dibatalkan, di-refund, dan chargeback/fraud (IAP).supabase/migrations/0020_game_inapp_products.sql— Tabel katalog In-App Products (IAP), SKU, harga lokal, deskripsi, dan etalase toko.supabase/migrations/0021_game_store_listings.sql— Tabel multi-language store listings (title, short description, full description, video promo).supabase/migrations/0022_game_vitals_metrics.sql— Tabel metrik stabilitas Android Vitals (Crash Rate, ANR Rate, Bad Behavior Thresholds).supabase/migrations/0023_game_conversion_and_purchase_verification.sql— Tabelgame_conversion_metrics(funnel store listing: visitors, acquisitions, conversion rate per negara/sumber trafik) dangame_purchase_verifications(verifikasi + acknowledgment IAP sisi server).supabase/migrations/0024_harden_contact_messages.sql— CHECK panjang fieldcontact_messages(nama 1-100, email 5-120, subjek ≤200, pesan 1-3000) dan policy insert publik yang hanya menerimastatus = 'unread'tanpareply_notes.supabase/migrations/0025_harden_review_queue_and_contact.sql— Cabut EXECUTE helper pgmq (read_/archive_/delete_review_queue,trigger_process_review_queue) darianon/authenticatedlalu re-grant keservice_role, pinsearch_path, secret workerreview_queue_secret, plus rate limit 5 pesan/jam per email dancreated_atyang ditetapkan server padacontact_messages.tools/sync-supabase.js— Mirror JSON → Supabase (insert-only, aman untuk edit admin).tools/pull-supabase.js— Bangun ulanggames-data.jsondari Supabase.tools/sync-playstore-reviews.js— Tarik review Play Store & posting balasan admin (butuh Play Developer API).tools/sync-playstore-tracks.js— Tarik track rilis, status staged rollout, dan changelog resmi via Play Developer API (edits.tracks).tools/sync-playstore-voided-purchases.js— Tarik riwayat voided purchases, deteksi refund abuse, dan fraud/chargeback via Play Developer API (purchases.voidedpurchases).tools/sync-playstore-inappproducts.js— Tarik katalog SKU produk in-game, harga IDR/USD, dan status IAP via Play Developer API (inappproducts).tools/sync-playstore-listings.js— Sinkronisasi 2 arah deskripsi toko dan metadata multibahasa via Play Developer API (edits.listings).tools/sync-playstore-vitals.js— Tarik metrik stabilitas teknis crash rate & ANR rate via Google Play Developer Reporting API (vitals.crashrate,vitals.anrrate).tools/*-utils.js— Helper murni (mapping/parsing respons API Play, utilitas HTTP & data game) yang dipakai script sync dan diuji langsung olehtools/tests/.tools/tests/— Suite pengujian Node (npm testdari foldertools, 38 test); termasuksecurity-invariants.test.mjsyang menegakkan invariant keamanan worker review-queue, kunci Gemini, dan migrasi0025.app-ads.txt— Daftar authorized seller untuk inventory aplikasi di Google AdMob.sellers.json— Referensi seller lokal dengan publisher ID AdMob.sitemap.xml— Daftar URL untuk crawler mesin pencari.robots.txt— Aturan crawl (mengizinkan/, termasuk/app-ads.txt).CNAME— Domain kustom GitHub Pages (mainragames.com)..github/workflows/— Workflow CI:scheduled-sync.yml(test + sync terjadwal) danvercel-diag.yml(diagnostik).
- Sumber kebenaran data game adalah Supabase (project
mainragames.com, tablegames,game_reviews,site_settings,admin_users). - Halaman publik membaca langsung dari Supabase via publishable key; bila gagal/offline, fallback ke
Assets/data/games-data.json. - GitHub Actions dua kali sehari (
scheduled-sync.yml,cron: '0 0,12 * * *'= 00:00 & 12:00 UTC / 07:00 & 19:00 WIB). Jobtestmenjalankannpm testdari foldertoolslebih dulu; jobsync(butuh jobtestlulus) lalu: scrape Play Store → mirror game baru ke Supabase (insert-only) → tarik konten terbaru dari Supabase untuk membangun ulanggames-data.json→ commit bila berubah. - Dashboard admin (
/mrmainra/) dipakai untuk edit game, atur featured/highlight, dan membalas review. akses dibatasi RLS: hanya user yang terdaftar dipublic.admin_users. - Balasan review untuk game Play Store disimpan sebagai draft di
game_reviews.reply_text; job sync (Actions atau tombol Fetch) mem-posting-nya ke Google Play via Play Developer API bilaGOOGLE_SERVICE_ACCOUNT_JSONdiset.
-
Grant admin: login Supabase → Authentication → tambahkan user, lalu jalankan:
insert into public.admin_users (user_id, email) select id, email from auth.users where email = 'email-anda@example.com';
-
Secrets GitHub Actions (Settings → Secrets and variables → Actions):
SUPABASE_URL=https://mjuzjvyatunjmgaiqtdv.supabase.coSUPABASE_SECRET_KEY= service role key (sb_secret_…/ legacyservice_role) — jangan pernah ditulis ke file repo.GOOGLE_SERVICE_ACCOUNT_JSON(opsional, untuk auto-post reply): JSON service account dari Google Cloud yang di-invite di Play Console dengan permission "Reply to reviews" lalu:supabase secrets set GOOGLE_SERVICE_ACCOUNT_JSON=...untuk Edge Function juga.IAP_VERIFY_SECRET(wajib untuk Edge Functionverify-purchase): fungsi ini fail-closed — bila secret belum di-set, semua request dibalas HTTP 503 dan verifikasi pembelian berhenti total. Set sebelum deploy:supabase secrets set IAP_VERIFY_SECRET=....- Worker
process-review-queuetidak butuh env tambahan: shared secret-nya dibaca dari tabelsite_settingsbarisreview_queue_secret, yang dibuat otomatis oleh migrasi0025. Triggerpg_netmengirimkannya sebagai headerx-worker-secret, dan permintaan tanpa secret yang cocok ditolak dengan HTTP 401.
Setelah
IAP_VERIFY_SECRETdi-set, deploy ulangverify-purchase, kalau tidak semua verifikasi pembelian akan gagal dengan HTTP 503. -
Deploy ulang Edge Functions bila diubah. Ulangi
supabase functions deploy <nama-fungsi> --no-verify-jwtuntuk setiap folder disupabase/functions/(14 fungsi):sync-playstore,sync-reviews,sync-tracks,sync-voided-purchases,sync-inappproducts,sync-store-listings,sync-vitals,sync-conversions,verify-purchase,upload-image,process-review-queue,sync-buffer,ai-social-assistant,manage-admins. -
Dashboard: buka
https://mainragames.github.io/mrmainra/(atauhttps://mainragames.com/mrmainra/setelah deploy) dan login.
Publisher ID yang digunakan project ini adalah pub-5867723400368399. File app-ads.txt sudah berisi otorisasi Google AdMob yang sesuai:
google.com, pub-5867723400368399, DIRECT, f08c47fec0942fa0
sellers.json yang ada di root project menyimpan referensi seller dengan seller_type PUBLISHER dan nama Faris Miqdad Al Barro' (yaitu nama pemilik akun publisher pada file lokal ini). Untuk akun publisher seperti ini, file tersebut bukan file yang harus di-host sendiri agar AdMob mengenal seller. Google menerbitkan file sellers.json authoritative di https://realtimebidding.google.com/sellers.json.
Agar informasi seller muncul transparan di file Google:
- Buka AdMob → Settings → Account.
- Pada Seller information (sellers.json), pilih Transparent lalu simpan.
- Tambahkan
mainragames.comsebagai business domain di AdMob hanya setelah domain tersebut diverifikasi. Domain tidak boleh menggunakanhttps://,www, subdomain, atau trailing slash. - Pastikan nama seller yang tampil di AdMob sama persis dengan nama pada payments profile AdMob. File repository hanya referensi lokal (namanya
Faris Miqdad Al Barro') — jangan mengubah file itu sebagai pengganti pengaturan di AdMob. - Tunggu hingga 7 hari, lalu cari
pub-5867723400368399pada file sellers.json Google untuk memverifikasi hasilnya.
File lokal ini sekarang mencatat contact_email, contact_address, version, domain, dan is_confidential: false sebagai referensi konfigurasi transparan yang diinginkan. Identifier TAG-ID sengaja tidak dicantumkan karena belum tersedia dan nilai f08c47fec0942fa0 pada app-ads.txt bukan TAG-ID. Metadata dummy ext.notice juga tidak digunakan. File ini bukan sumber authoritative AdMob dan tidak memverifikasi kepemilikan domain. Status transparansi, nama seller, dan domain authoritative tetap dikendalikan dari AdMob; verifikasi domain harus dilakukan di sana terlebih dahulu.