Repository navigation
feat: Service Klien API Satu Data & Menu DataSpasial Berbasis Peran (KAB-01) - #1307
Open
pandigresik wants to merge 2 commits into
Open
pandigresik wants to merge 2 commits into
pandigresik wants to merge 2 commits into
Conversation
Contributor
|
🔄 AI PR Review sedang antri di server...
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request: feat: Service Klien API Satu Data & Menu DataSpasial Berbasis Peran (KAB-01)
Description
PR ini membangun fondasi integrasi DataSpasial untuk OpenKab: satu service klien terpusat untuk seluruh endpoint
/api/v1/dataspasial/*milik API Satu Data (API-Database-Gabungan), lima menu DataSpasial yang hanya terbuka bagi peran berwenang, serta penanganan kegagalan yang menampilkan pesan "data sementara tidak tersedia" alih-alih halaman error. OpenKab tidak terhubung langsung ke database gabungan dan tidak membuat tabelds_*— seluruh baca/tulis melewati API Satu Data. Satu-satunya perubahan data lokal adalah peran & izin (spatie), yang dipasok lewat data migration agar otomatis tersedia saat deploy.Changes made:
app/Services/DataSpasialApiService.php— pintu tunggal seluruh pemanggilan/api/v1/dataspasial/*(10 operasi baca + 3 operasi tulis), bearer token, timeout, header identitas pemanggil, klasifikasi hasil tiga-keadaan, dan cache baca TTL + invalidasi setelah tulis.app/Services/DataSpasialResult.php,app/Enums/DataSpasialStatus.php,app/Enums/DataSpasialReason.php,app/Exceptions/DataSpasialUnavailableException.php— status yang dapat dibedakan:data/empty/unavailablebesertareasonuntuk log.config/dataspasial.php(timeout,cache_ttl,cache_store,cache_prefix,path_prefix, header identitas, pesan unavailable) dan penambahanAPI_DATASPASIAL_TIMEOUT+API_DATASPASIAL_CACHE_TTLke.env.example. Base URL & token tidak dikonfigurasi di sini.app/Enums/Modul.phpsebagai satu-satunya sumber kebenaran menu admin.dataspasialpadaroutes/web.phpdijaga middlewarepermission:dataspasial-*-read(server-side, bukan sekadar menyembunyikan menu) + 5 controller kerangka diapp/Http/Controllers/DataSpasial/.resources/views/dataspasial/unavailable.blade.phpdanempty.blade.php, komponenresources/views/components/dataspasial-status.blade.php, serta 5 halaman kerangka menu.database/migrations/2026_10_14_000001_create_dataspasial_roles.php— menyediakan peran Admin Skema, Operator Impor, Analis OPD beserta matriks izinnya; role administrator diberi akses lewatadmin:menu-update.app/Services/BaseApiService.php— perbaiki presedensi operator pada headerAuthorization('Bearer '.$x['k'] ?? ''→'Bearer '.($x['k'] ?? '')).tests/Feature/DataSpasial/*(service, menu access, result, role migration, unavailable) dantests/Browser/SmokeDataSpasialMenuTest.php, seluruhnya terisolasi denganDatabaseTransactions.Reason for change:
X-OpenKab-User-Id/X-OpenKab-User-Nameagar tercatat pada audit API-07 (OpenSID/API-Database-Gabungan#473).php artisan migratesudah cukup tanpa langkahdb:seedmanual.Impact of change:
✅ Konsistensi: Semua modul DataSpasial memakai satu
DataSpasialApiService; tidak ada pemanggilanHttp::langsung ke/dataspasial/*.✅ Keamanan: Menu tersembunyi dan akses URL ditolak (403) bagi peran tanpa izin.
✅ Ketahanan: Degradasi anggun saat API bermasalah; tanpa halaman error.
✅ Observabilitas: Kegagalan API dicatat (
Log::warning) dengan endpoint, status, dan reason, tanpa membocorkan detail teknis ke pengguna.✅ Performa: Cache baca TTL (default 300 dtk) menekan permintaan berulang; invalidasi kasar per-namespace mencegah data basi setelah tulis/impor.
Related Issue
#1296
Steps to Reproduce
Kata kunci verifikasi (fitur baru):
php artisan migratepada basis data bersih (menjalankan data migration peran) laluphp artisan admin:menu-update.administrator→ navigasi memuat grup DataSpasial berisi 5 submenu: Skema DataSpasial, Peta Gabungan, Dasbor DataSpasial, Impor Data, Monitoring.Settingdatabase_gabungan_api_keyterisi danAPI_DATABASE_GABUNGAN_HOSTmenunjuk API Satu Data.analis opd→ ✅ hanya Peta Gabungan, Dasbor, Monitoring yang tampil; akses langsung ke/dataspasial/skemadan/dataspasial/impor→ ❌ 403 Forbidden.Testing on related features:
BaseApiService) ✅ tidak terganggu (perbaikan presedensi hanya memperbaiki kasus token kosong).Checklist
Technical Details
Technical Explanation
Alur service (
DataSpasialApiService)config('app.databaseGabunganUrl')(envAPI_DATABASE_GABUNGAN_HOST) dan token dariSettingkeydatabase_gabungan_api_key— mengikuti pengaturan database gabungan yang sudah ada (bukan config/env khusus DataSpasial).DataSpasialStatus(data/empty/unavailable) denganDataSpasialResultimmutable yang memvalidasi invariant di constructor.unauthorized; 503 pada/dataspasial/*→module_not_installed(keadaan "modul belum terpasang / belum dikonfigurasi sepenuhnya" diperoleh dari respons API, sesuai API-02/Perbaikan data papan #467); 5xx lain →http_5xx; 400SchemaVersionUnsupported→schema_version_unsupported; timeout/connection →timeout/connection_failed.dataspasial:get:{generation}:{path}:{md5(query)}; invalidasi O(1) dengan menaikkan nomor generasi setelah operasi tulis sukses.routes/web.phpmemakaipermission:dataspasial-{menu}-read; visibilitas menu mengikuti JSONteam.menu.Team(grup) +Rolespatie denganteam_idsama. Matriks: Admin Skema → skema (read/write/edit/delete) + baca peta/dasbor/monitoring; Operator Impor → impor (read/write) + baca peta/dasbor/monitoring; Analis OPD → baca peta/dasbor/monitoring. Administrator → seluruh permission viaadmin:menu-update.Configuration changes
.env(opsional, ada default):Base URL & token tidak memakai env khusus:
API_DATABASE_GABUNGAN_HOST→config('app.databaseGabunganUrl')Settingkeydatabase_gabungan_api_keyDependencies added
No new dependencies.
Testing
Manual Testing
administratordengan 5 submenu.X-OpenKab-User-Id&X-OpenKab-User-Nameterkirim pada request baca & tulis.Automated Testing
vendor/bin/pest tests/Feature/DataSpasial/DataSpasialApiServiceTest.php— sukses, kosong, 503, timeout, konfigurasi tidak lengkap, header audit, cache & invalidasi.vendor/bin/pest tests/Feature/DataSpasial/DataSpasialMenuAccessTest.php— visibilitas menu + penolakan URL langsung per peran.vendor/bin/pest tests/Feature/DataSpasial/DataSpasialRoleMigrationTest.php— 3 peran + matriks izin + idempotensi + akses administrator.vendor/bin/pest tests/Feature/DataSpasial/DataSpasialUnavailableTest.php— pesan generik, empty state, kerangka utuh, tanpa stack trace.vendor/bin/pest tests/Browser/SmokeDataSpasialMenuTest.php— smoke menu per peran.Screenshots / Video
simplescreenrecorder-2026-10-14_15.15.40.mp4
Before:
Menu DataSpasial belum tersedia; tidak ada service klien API Satu Data.
After:
Grup menu DataSpasial tampil sesuai peran; seluruh pemanggilan API Satu Data melewati satu service; kegagalan API tampil sebagai pesan di area konten.
Breaking Changes
None. (
app/Services/BaseApiService.phphanya memperbaiki presedensi operator agar token kosong tidak memicu peringatan akses array — perilaku untuk token valid tidak berubah.)Migration Guide
Cukup jalankan:
Tidak ada perubahan tabel
ds_*(tabel DataSpasial tetap berada di API Satu Data).Catatan Penyimpangan dari Deskripsi Issue
Perubahan desain berikut disepakati selama klarifikasi spesifikasi:
.env"). Keduanya otomatis mengikuti pengaturan database gabungan —config('app.databaseGabunganUrl')danSettingdatabase_gabungan_api_key— untuk menghindari dua sumber kebenaran.php artisan migratepada deploy.DatabaseTransactionsagar tidak mengotori basis data.References
specs/003-dataspasial-integration/contracts/dataspasial-api.mdspecs/003-dataspasial-integration/spec.md,plan.md,research.md,data-model.md,quickstart.mdAdditional notes: Fitur ini adalah fondasi; fungsi rinci tiap menu (editor sektor/isian/pemetaan, peta geospasial, dashboard agregat, log entri) menjadi lingkup fitur turunan KAB-02/KAB-04/KAB-06/KAB-08 dan dibangun di atas kontrak service ini tanpa mengubahnya.