Repositori ini dibangun sebagai sistem informasi yang merekam aktivitas gim papan Cashflowpoly sebagai rangkaian event, memvalidasi data masuk, menyimpan data secara konsisten di PostgreSQL, lalu mengolahnya menjadi metrik literasi finansial dan capaian misi yang tampil pada dasbor web. Modul manajemen ruleset berbasis konfigurasi dinamis disediakan agar instruktur dapat mengubah parameter permainan tanpa mengubah kode.
Tujuan utama:
- Menerima event permainan dari IDN atau simulator melalui REST API.
- Menjaga kualitas data melalui validasi skema, validasi aturan domain, idempotensi, dan keterurutan event.
- Mengelola ruleset sebagai konfigurasi variabel permainan (CRUD, versioning, aktivasi).
- Menghitung metrik pada level sesi dan pemain dari log event.
- Menyajikan analitika melalui UI web berbasis ASP.NET Core MVC (Razor Views).
- UI berjalan di browser dan mengonsumsi data dari REST API.
- Menampilkan performa pembelajaran pemain individu.
- Menampilkan performa pembelajaran agregat.
- Menampilkan performa misi pemain individu.
- Menampilkan performa misi agregat.
- Mengelompokkan data berdasarkan ruleset yang aktif pada sesi.
- Membuat ruleset baru untuk mengubah variabel permainan (contoh: batas giliran, nilai uang, batas transaksi).
- Menampilkan daftar ruleset (termasuk ruleset default Cashflowpoly).
- Menghapus ruleset dengan pembatasan saat sistem sudah memakai ruleset pada sesi.
- Mengatur ruleset aktif per sesi (aktivasi berbasis versi).
- Menulis data permainan ke basis data dari event.
- Membaca data dari basis data untuk kebutuhan analitika dan manajemen ruleset.
- Menyimpan pemain, sesi, ruleset dan versi, event, proyeksi arus kas, metric snapshot, serta log validasi.
Arsitektur dibagi menjadi tiga komponen:
- Cashflowpoly.Api: REST API (ASP.NET Core 10) + Swagger UI.
- Cashflowpoly.Ui: MVC (Controller + Razor Views) yang memanggil REST API via
HttpClient. - PostgreSQL: penyimpanan data dan sumber kebenaran untuk analitika.
UI tidak mengakses database secara langsung. UI membaca data dari REST API agar konsisten dengan kontrak API dan skema data.
Catatan kontrak API:
- Prefix endpoint aktif:
/api/v1/.... - Opsi transisi (default nonaktif): set
FeatureFlags__EnableLegacyApiCompatibility=truebila sementara perlu rewrite/api/*ke/api/v1/*.
| No | Perangkat lunak | Fungsi penggunaan |
|---|---|---|
| 1 | Windows 11 Home | Sistem operasi untuk pengembangan dan pengujian |
| 2 | Visual Studio Code | IDE untuk menulis kode dan menjalankan debug |
| 3 | .NET 10 SDK | Toolchain untuk membangun REST API dan MVC |
| 4 | PostgreSQL | DBMS untuk menyimpan sesi, event, ruleset, proyeksi, dan metrik |
| 5 | Docker Desktop | Menjalankan seluruh komponen melalui container |
| 6 | DBeaver | Mengelola PostgreSQL (koneksi, skema, query, inspeksi data) |
| 7 | Google Chrome | Menguji UI MVC dan mengakses Swagger UI |
| 8 | Swagger UI (Swashbuckle) | Dokumentasi dan uji endpoint API dari browser |
| 9 | Postman | Uji fungsional endpoint API (black-box) |
| 10 | Tailwind CSS | Styling UI dasbor MVC |
.
+- .env
+- Cashflowpoly.sln
+- README.md
+- docker-compose.yml
+- database/
| +- 00_create_schema.sql
| +- 01_seed_default_rulesets_components.sql
+- docs/
| +- Img/
| +- 00-Panduan/
| | +- 00-01-panduan-setup-lingkungan.md
| | +- 00-02-manual-pengguna-dan-skenario-operasional.md
| | +- 00-03-panduan-menjalankan-sistem.md
| +- 01-Spesifikasi/
| | +- 01-01-spesifikasi-kebutuhan-sistem.md
| | +- 01-02-spesifikasi-event-dan-kontrak-api.md
| | +- 01-03-spesifikasi-ruleset-dan-validasi.md
| +- 02-Perancangan/
| | +- 02-01-rencana-implementasi-dan-struktur-solution-dotnet.md
| | +- 02-02-rancangan-model-data-dan-basis-data.md
| | +- 02-03-definisi-metrik-dan-agregasi.md
| | +- 02-04-metrik-gameplay-fisik-dan-turunan.md
| | +- 02-05-rancangan-dashboard-analitika-mvc.md
| | +- 02-06-spesifikasi-ui-mvc-dan-rancangan-viewmodel.md
| +- 03-Pengujian/
| | +- 03-01-rencana-pengujian-fungsional-dan-validasi.md
| | +- 03-02-laporan-hasil-pengujian.md
+- src/
+- Cashflowpoly.Api/
+- Cashflowpoly.Ui/
- Pastikan konteks Docker lokal:
docker context use default- Siapkan env dev (sekali):
Copy-Item .env.example .env.dev- Jalankan dev watch:
docker compose --env-file .env.dev -f docker-compose.yml -f docker-compose.watch.yml up --build- Ngoding seperti biasa, auto-reload jalan.
- Jika perlu verifikasi lokal sebelum merge/deploy:
powershell -ExecutionPolicy Bypass -File scripts/ops/run-local-checks.ps1 -SkipIntegrationTests- Selesai kerja, stop dev:
docker compose --env-file .env.dev -f docker-compose.yml -f docker-compose.watch.yml downAkses (sesuai env dev):
- API + Swagger:
http://localhost:5041/swagger - UI MVC:
http://localhost:5203
- Install Docker, Docker Compose, Git.
- Clone repo atau checkout revision yang ingin dideploy.
- Siapkan env prod (isi secret benar):
.env.prod. - Verifikasi lokal sebelum deploy (disarankan):
powershell -ExecutionPolicy Bypass -File scripts/ops/run-local-checks.ps1- Deploy awal atau redeploy:
powershell -ExecutionPolicy Bypass -File scripts/ops/redeploy-production.ps1Atau manual:
docker compose --env-file .env.prod -f docker-compose.yml -f docker-compose.prod.yml --profile tunnel up -d --build db api ui nginx cloudflared- Verifikasi:
docker compose --env-file .env.prod -f docker-compose.yml -f docker-compose.prod.yml ps
curl http://localhost/health/ready
docker logs cashflowpoly-tunnel --tail 20Jika CLOUDFLARE_TUNNEL_TOKEN kosong, skrip deploy otomatis menjalankan production tanpa cloudflared.
Catatan keamanan lokal:
- Set
JWT_SIGNING_KEYdi.env.dev(dev) dan.env.prod(production), minimal 32 karakter. - Untuk rotasi key JWT, bisa pakai:
JWT_SIGNING_KEYS_JSON(array JSON key +kid+ window aktivasi), atauJwt:SigningKeysFile/Jwt:SigningKeyFile(secret file, cocok untuk mount dari secret manager).
- Registrasi publik untuk semua role (
INSTRUCTORdanPLAYER) tersedia melalui endpointPOST /api/v1/auth/register. - Untuk bootstrap user awal via environment, aktifkan
AUTH_BOOTSTRAP_SEED_DEFAULT_USERS=truedan isi username/password bootstrap.
Rute UI utama:
- Analitika sesi:
/Analytics - Manajemen ruleset:
/Rulesets
Gunakan konfigurasi berikut:
- Host:
localhost - Port:
5432 - Database:
cashflowpoly - User:
cashflowpoly - Password:
cashflowpoly
DBeaver menampilkan tabel pada schema public setelah PostgreSQL menjalankan skrip pada folder database/ saat volume database masih kosong (00_create_schema.sql lalu 01_seed_default_rulesets_components.sql).
Untuk development:
docker compose --env-file .env.dev -f docker-compose.yml -f docker-compose.watch.yml downUntuk production:
docker compose --env-file .env.prod -f docker-compose.yml -f docker-compose.prod.yml --profile tunnel downJika perlu menghapus data database/volume:
docker compose --env-file .env.prod -f docker-compose.yml -f docker-compose.prod.yml --profile tunnel down -vBuat database dan user, lalu jalankan:
database/00_create_schema.sqldatabase/01_seed_default_rulesets_components.sql(seed ruleset default + katalog komponen mode pemula/mahir)
API memakai koneksi database dari ConnectionStrings:Default.
UI memakai base URL API dari ApiBaseUrl.
JWT API dibaca dari Jwt:SigningKey dengan fallback ke environment variable JWT_SIGNING_KEY.
Untuk production hardening, API juga mendukung multi-key rotation via Jwt:SigningKeys / JWT_SIGNING_KEYS_JSON serta secret file (Jwt:SigningKeysFile / Jwt:SigningKeyFile).
Contoh lokal (sesuai .env dan launch settings):
- API:
http://localhost:5041atauhttps://localhost:7041 - UI:
http://localhost:5203atauhttps://localhost:7203
dotnet run --project src/Cashflowpoly.ApiBuka terminal baru:
dotnet run --project src/Cashflowpoly.UiEndpoint tambahan yang tersedia:
DELETE /api/v1/rulesets/{rulesetId}hapus ruleset (jika belum dipakai sesi)GET /api/v1/sessionsdaftar sesiPOST /api/v1/playersbuat pemainGET /api/v1/playersdaftar pemainPOST /api/v1/sessions/{sessionId}/playerstambah pemain ke sesiGET /api/v1/rulesets/{rulesetId}detail ruleset + versiGET /api/v1/rulesets/components/defaultsdaftar ruleset default komponen (mode pemula + mahir)GET /api/v1/rulesets/{rulesetId}/componentsdetail komponen ruleset daricomponent_catalog(opsional?version=).POST /api/v1/analytics/sessions/{sessionId}/recomputehitung ulang metrikGET /api/v1/observability/metricsringkasan metrik operasional endpoint (request count, error rate, latency)GET /api/v1/security/audit-logsringkasan audit log keamananGET /health/liveliveness API/UIGET /health/readyreadiness API/UI
- Gunakan Swagger untuk uji cepat endpoint dan gunakan Postman untuk skenario uji black-box yang terdokumentasi.
Seluruh dokumen TA disimpan pada folder docs/ agar repositori memuat artefak desain dan artefak implementasi pada satu tempat.
Dokumen kunci:
- Spesifikasi kebutuhan sistem (SRS):
docs/01-Spesifikasi/01-01-spesifikasi-kebutuhan-sistem.md - Kontrak API:
docs/01-Spesifikasi/01-02-spesifikasi-event-dan-kontrak-api.md - Spesifikasi ruleset:
docs/01-Spesifikasi/01-03-spesifikasi-ruleset-dan-validasi.md - Rencana implementasi dan struktur solusi:
docs/02-Perancangan/02-01-rencana-implementasi-dan-struktur-solution-dotnet.md - Model data dan basis data:
docs/02-Perancangan/02-02-rancangan-model-data-dan-basis-data.md - Definisi metrik dan agregasi:
docs/02-Perancangan/02-03-definisi-metrik-dan-agregasi.md - Variabel gameplay fisik dan metrik turunan:
docs/02-Perancangan/02-04-metrik-gameplay-fisik-dan-turunan.md - Rancangan dasbor MVC:
docs/02-Perancangan/02-05-rancangan-dashboard-analitika-mvc.md - Spesifikasi UI dan ViewModel:
docs/02-Perancangan/02-06-spesifikasi-ui-mvc-dan-rancangan-viewmodel.md
- Build verifikasi:
dotnet build src/Cashflowpoly.Api/Cashflowpoly.Api.csproj -c Releasedotnet build src/Cashflowpoly.Ui/Cashflowpoly.Ui.csproj -c Releasedotnet build tests/Cashflowpoly.Api.Tests/Cashflowpoly.Api.Tests.csproj -c Release
- Jalankan seluruh test API:
dotnet test tests/Cashflowpoly.Api.Tests/Cashflowpoly.Api.Tests.csproj -c Release. - Integration test API (auth + RBAC + ruleset + analytics flow) dijalankan via xUnit + Testcontainers, jadi Docker daemon wajib aktif saat
dotnet test. - Jalankan hanya integration test:
dotnet test tests/Cashflowpoly.Api.Tests/Cashflowpoly.Api.Tests.csproj -c Release --filter "Category=Integration". - Jalankan test non-integration (lebih cepat):
dotnet test tests/Cashflowpoly.Api.Tests/Cashflowpoly.Api.Tests.csproj -c Release --filter "Category!=Integration". - Jalankan load test baseline:
powershell -ExecutionPolicy Bypass -File scripts/perf/run-load-test.ps1 -BaseUrl http://localhost:5041. - Koleksi Postman:
postman/Cashflowpoly.postman_collection.json. - Uji endpoint melalui Swagger UI untuk verifikasi cepat.
- Jalankan skenario pengujian fungsional melalui Postman sesuai dokumen rencana pengujian.
- Validasi dasbor dengan membandingkan metrik UI vs data pada tabel
metric_snapshotsdan proyeksi transaksi. - Verifikasi end-to-end API, RBAC, dan Web UI dilakukan mengikuti checklist pada
docs/03-Pengujian/03-01-rencana-pengujian-fungsional-dan-validasi.md. - Artefak bukti formal tersimpan pada
docs/evidence/. - Verifikasi lokal pengganti pipeline otomatis:
powershell -ExecutionPolicy Bypass -File scripts/ops/run-local-checks.ps1.
- Backup database dilakukan dengan mekanisme native PostgreSQL sesuai environment deployment.
- Uji restore tetap wajib dilakukan berkala untuk memastikan backup dapat dipulihkan.
Lisensi akan ditentukan untuk repositori ini.