feat: tambahkan parameter identitas openkab#1007
feat: tambahkan parameter identitas openkab#1007pandigresik wants to merge 7 commits intorilis-devfrom
Conversation
|
🔄 AI PR Review sedang antri di server...
|
🔒 Security ReviewTotal Temuan: 2 isu (2 Critical)
|
| beforeSend: function (xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); | ||
| if (settings.url.indexOf('?') === -1) { | ||
| settings.url += '?kode_kabupaten=' + identitasOpenkab+'&filter[kode_kabupaten]=' + identitasOpenkab; |
There was a problem hiding this comment.
[CRITICAL] 🔒 Security: URL Parameter Injection via Unencoded Meta Tag Value
Masalah: Nilai identitasOpenkab dari meta tag langsung dikonkatenasi ke URL tanpa encodeURIComponent(). Attacker yang bisa memanipulasi meta tag (misal via XSS di tempat lain atau server-side injection) dapat menyuntikkan parameter tambahan atau karakter khusus yang merusak URL.
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}Risiko:
- Parameter Pollution: Attacker inject
&admin=1atau parameter sensitif lain - URL Breaking: Karakter seperti
#,&,=bisa merusak struktur URL - Filter Bypass: Jika backend mengandalkan parameter ini untuk authorization, bisa di-bypass
- Impact: Semua AJAX request di aplikasi terpengaruh karena menggunakan
$.ajaxSetup()global
PoC (Chrome Console):
// Jalankan di Chrome DevTools Console (F12 → Console)
// Pastikan sudah login ke aplikasi di tab yang sama
// Step 1: Manipulasi meta tag untuk inject parameter berbahaya
$('meta[name="identitas-openkab"]').attr('content', '1234&admin=true&role=superadmin');
// Step 2: Trigger AJAX request (contoh ke endpoint apapun)
const testUrl = '/api/test-endpoint';
const resp = await fetch(testUrl, {
method: 'GET',
headers: { 'X-Requested-With': 'XMLHttpRequest' }
});
// Step 3: Periksa URL yang sebenarnya dikirim
console.log('URL yang dikirim:', resp.url);
// Expected output: /api/test-endpoint?kode_kabupaten=1234&admin=true&role=superadmin&filter[kode_kabupaten]=1234&admin=true&role=superadmin
// Step 4: Verifikasi parameter diterima backend
const data = await resp.text();
console.log('Response:', data);
// Alternatif: Test dengan jQuery AJAX
$.get('/api/desa', function(data) {
console.log('jQuery AJAX berhasil dengan parameter terinjeksi');
});
// Periksa Network tab untuk melihat URL finalFix:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
// Validasi format kode kabupaten (hanya angka, 4-6 digit)
if (!identitasOpenkab || !/^\d{4,6}$/.test(identitasOpenkab)) {
console.error('Invalid kode_kabupaten format');
return; // Abort jika tidak valid
}
// Encode value sebelum ditambahkan ke URL
const encodedValue = encodeURIComponent(identitasOpenkab);
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + encodedValue + '&filter[kode_kabupaten]=' + encodedValue;
} else {
settings.url += '&kode_kabupaten=' + encodedValue + '&filter[kode_kabupaten]=' + encodedValue;
}
}
});| beforeSend: function(xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); | ||
| if (settings.url.indexOf('?') === -1) { | ||
| settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab; |
There was a problem hiding this comment.
[CRITICAL] 🔒 Security: URL Parameter Injection via Unencoded Meta Tag Value (Duplicate)
Masalah: Identik dengan isu di resources/js/web.js - nilai identitasOpenkab dari meta tag langsung dikonkatenasi ke URL tanpa encodeURIComponent(). Ini adalah duplikasi kode yang sama di admin panel.
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}Risiko:
- Parameter Pollution: Attacker inject parameter tambahan seperti
&is_admin=1 - Authorization Bypass: Jika backend filter berdasarkan
kode_kabupaten, bisa di-bypass - Admin Panel Exposure: Lebih berbahaya karena ini di admin panel dengan privilege lebih tinggi
- Impact: Semua AJAX request di admin panel terpengaruh
PoC (Chrome Console):
// Jalankan di Chrome DevTools Console (F12 → Console)
// Pastikan sudah login sebagai admin di panel /presisi
// Step 1: Manipulasi meta tag untuk inject parameter privilege escalation
$('meta[name="identitas-openkab"]').attr('content', '1234&bypass_auth=1&role_id=1');
// Step 2: Trigger AJAX request ke endpoint admin (contoh DataTables)
const adminEndpoint = '/presisi/api/users'; // Sesuaikan dengan endpoint yang ada
const resp = await fetch(adminEndpoint, {
method: 'GET',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json'
}
});
// Step 3: Periksa URL yang sebenarnya dikirim
console.log('Admin URL yang dikirim:', resp.url);
// Expected: /presisi/api/users?kode_kabupaten=1234&bypass_auth=1&role_id=1&filter[kode_kabupaten]=1234&bypass_auth=1&role_id=1
// Step 4: Cek apakah parameter terinjeksi diterima backend
const data = await resp.json();
console.log('Admin Response:', data);
// Alternatif: Test dengan DataTables AJAX yang umum di AdminLTE
$('#example-table').DataTable().ajax.reload();
// Periksa Network tab untuk melihat parameter yang terinjeksiFix:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
// Validasi format kode kabupaten (hanya angka, 4-6 digit)
if (!identitasOpenkab || !/^\d{4,6}$/.test(identitasOpenkab)) {
console.error('Invalid kode_kabupaten format');
return; // Abort jika tidak valid
}
// Encode value sebelum ditambahkan ke URL
const encodedValue = encodeURIComponent(identitasOpenkab);
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + encodedValue + '&filter[kode_kabupaten]=' + encodedValue;
} else {
settings.url += '&kode_kabupaten=' + encodedValue + '&filter[kode_kabupaten]=' + encodedValue;
}
}
});Rekomendasi Tambahan:
- Pertimbangkan untuk membuat fungsi helper terpusat daripada duplikasi kode
- Tambahkan server-side validation untuk memastikan
kode_kabupatenvalid - Gunakan whitelist approach di backend untuk parameter yang diizinkan
⚡ Performance ReviewTotal Temuan: 2 isu (2 Critical, 0 High)
|
| window.bootstrap = bootstrap; | ||
| $.ajaxSetup({ | ||
| beforeSend: function (xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); |
There was a problem hiding this comment.
[CRITICAL] ⚡ Performance: jQuery Selector Tanpa Cache di AJAX beforeSend
Masalah: Selector $('meta[name="identitas-openkab"]').attr('content') dipanggil di dalam beforeSend callback yang akan dieksekusi pada SETIAP request AJAX. Ini menyebabkan DOM query berulang untuk elemen yang nilainya statis (tidak berubah selama page lifecycle).
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');Dampak:
- Production Impact: Jika halaman melakukan 50 AJAX requests, akan ada 50x DOM query untuk elemen yang sama
- Performance Cost: ~0.5-2ms per query × jumlah AJAX requests
- Scalability: Pada dashboard dengan banyak AJAX (DataTables, charts, live updates), overhead bisa mencapai 100-500ms total per page load
Fix:
// Cache selector di luar ajaxSetup (hanya query 1x saat page load)
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content') || '';
$.ajaxSetup({
beforeSend: function(xhr, settings) {
// Gunakan cached value
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}
}
});|
|
||
| $.ajaxSetup({ | ||
| beforeSend: function(xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); |
There was a problem hiding this comment.
[CRITICAL] ⚡ Performance: jQuery Selector Tanpa Cache di AJAX beforeSend (Duplikasi)
Masalah: Sama seperti resources/js/web.js - selector $('meta[name="identitas-openkab"]').attr('content') dipanggil berulang di setiap AJAX request. Masalah ini terduplikasi di admin panel, yang biasanya memiliki lebih banyak AJAX requests (DataTables, form submissions, live data).
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');Dampak:
- Production Impact: Admin panel dengan DataTables bisa melakukan 100+ AJAX requests per halaman (pagination, sorting, filtering)
- Performance Cost: 100 requests × 1ms = 100ms overhead hanya untuk DOM query
- User Experience: Pada koneksi lambat atau device low-end, ini bisa menyebabkan lag yang terasa
- Worst Case: Dashboard dengan multiple DataTables + live charts = 200-300 AJAX requests = 200-300ms wasted
Fix:
// Cache selector di luar ajaxSetup
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content') || '';
$.ajaxSetup({
beforeSend: function(xhr, settings) {
// Gunakan cached value
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}
}
});Rekomendasi Tambahan: Pertimbangkan untuk membuat satu file shared JavaScript untuk logic ini agar tidak duplikasi kode antara web.js dan javascript.blade.php.
📝 Code Quality ReviewTotal Temuan: 5 isu (0 Critical, 5 High)
|
| window.$ = $; | ||
| window.jQuery = $; | ||
| window.bootstrap = bootstrap; | ||
| $.ajaxSetup({ |
There was a problem hiding this comment.
[HIGH] 📝 Code Quality: Code Duplication - DRY Violation
Kategori: Architecture
Masalah: Logic $.ajaxSetup() untuk inject parameter kode_kabupaten diduplikasi persis di 2 tempat berbeda:
resources/js/web.js(L10-19) - untuk public webresources/views/layouts/presisi/partials/javascript.blade.php(L30-39) - untuk admin panel
Duplikasi ini melanggar prinsip DRY (Don't Repeat Yourself) dan menyulitkan maintenance. Jika ada bug atau perlu perubahan logic, harus diubah di 2 tempat.
Kode:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}
}
});Fix:
Ekstrak ke shared utility module yang bisa digunakan di kedua context:
// resources/js/utils/ajax-setup.js
export function setupAjaxDefaults() {
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (!identitasOpenkab) {
console.warn('Meta tag identitas-openkab tidak ditemukan');
return;
}
const params = `kode_kabupaten=${identitasOpenkab}&filter[kode_kabupaten]=${identitasOpenkab}`;
settings.url += settings.url.indexOf('?') === -1 ? `?${params}` : `&${params}`;
}
});
}
// resources/js/web.js
import { setupAjaxDefaults } from './utils/ajax-setup';
setupAjaxDefaults();
// Untuk admin panel, buat inline script yang import dari build:
// <script>window.setupAjaxDefaults && window.setupAjaxDefaults();</script>| <script nonce="{{ csp_nonce() }}"> | ||
| var selectedMenuObj = null; | ||
|
|
||
| $.ajaxSetup({ |
There was a problem hiding this comment.
[HIGH] 📝 Code Quality: Code Duplication - DRY Violation
Kategori: Architecture
Masalah: Sama dengan temuan di resources/js/web.js L10. Logic $.ajaxSetup() diduplikasi persis di file ini. Ini adalah copy-paste dari web.js yang ditempatkan di Blade partial admin panel.
Kode:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}
}
});Fix:
Lihat fix di temuan sebelumnya (web.js L10). Gunakan shared utility yang sama untuk menghindari duplikasi.
| window.bootstrap = bootstrap; | ||
| $.ajaxSetup({ | ||
| beforeSend: function (xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); |
There was a problem hiding this comment.
[HIGH] 📝 Code Quality: Missing Null/Undefined Check
Kategori: JS Quality
Masalah: Kode langsung menggunakan identitasOpenkab tanpa validasi apakah meta tag ada atau tidak. Jika meta tag tidak ditemukan (misalnya karena error di Blade atau data $identitasAplikasi kosong), identitasOpenkab akan undefined dan URL akan menjadi ?kode_kabupaten=undefined&filter[kode_kabupaten]=undefined.
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;Fix:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
// Guard clause: skip jika meta tag tidak ada
if (!identitasOpenkab) {
console.warn('Meta tag identitas-openkab tidak ditemukan, AJAX request tanpa kode_kabupaten');
return;
}
const params = `kode_kabupaten=${identitasOpenkab}&filter[kode_kabupaten]=${identitasOpenkab}`;
settings.url += settings.url.indexOf('?') === -1 ? `?${params}` : `&${params}`;
}
});|
|
||
| $.ajaxSetup({ | ||
| beforeSend: function(xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); |
There was a problem hiding this comment.
[HIGH] 📝 Code Quality: Missing Null/Undefined Check
Kategori: JS Quality
Masalah: Sama dengan temuan di resources/js/web.js L12. Tidak ada validasi apakah meta tag identitas-openkab ada atau tidak sebelum digunakan.
Kode:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;Fix:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
if (!identitasOpenkab) {
console.warn('Meta tag identitas-openkab tidak ditemukan, AJAX request tanpa kode_kabupaten');
return;
}
const params = `kode_kabupaten=${identitasOpenkab}&filter[kode_kabupaten]=${identitasOpenkab}`;
settings.url += settings.url.indexOf('?') === -1 ? `?${params}` : `&${params}`;
}
});| $.ajaxSetup({ | ||
| beforeSend: function (xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); | ||
| if (settings.url.indexOf('?') === -1) { |
There was a problem hiding this comment.
[HIGH] 📝 Code Quality: Hardcoded Configuration
Kategori: JS Quality
Masalah: Parameter names (kode_kabupaten, filter[kode_kabupaten]) di-hardcode langsung di logic. Jika di masa depan perlu menambah parameter lain atau mengubah naming convention, harus mengubah kode di multiple places. Lebih baik menggunakan konfigurasi.
Kode:
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}Fix:
// Definisikan config di top-level atau import dari config file
const AJAX_PARAMS_CONFIG = {
metaTagName: 'identitas-openkab',
paramNames: ['kode_kabupaten', 'filter[kode_kabupaten]']
};
$.ajaxSetup({
beforeSend: function(xhr, settings) {
const identitasOpenkab = $(`meta[name="${AJAX_PARAMS_CONFIG.metaTagName}"]`).attr('content');
if (!identitasOpenkab) {
console.warn(`Meta tag ${AJAX_PARAMS_CONFIG.metaTagName} tidak ditemukan`);
return;
}
const params = AJAX_PARAMS_CONFIG.paramNames
.map(name => `${name}=${identitasOpenkab}`)
.join('&');
settings.url += settings.url.indexOf('?') === -1 ? `?${params}` : `&${params}`;
}
});
🐛 Bug Detection ReviewTotal Temuan: 2 isu (1 Critical, 1 High)
|
| window.bootstrap = bootstrap; | ||
| $.ajaxSetup({ | ||
| beforeSend: function (xhr, settings) { | ||
| const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content'); |
There was a problem hiding this comment.
[CRITICAL] 🐛 Bug: Undefined Injection ke URL AJAX
Kode: const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
Skenario:
- Jika meta tag
<meta name="identitas-openkab">tidak ada di DOM (misalnya karena error di Blade rendering, atau view yang tidak include layout dengan benar) $('meta[name="identitas-openkab"]').attr('content')akan returnundefined(bukan string kosong)- Variabel
identitasOpenkabmenjadiundefined - Saat di-concatenate ke URL di baris 14/16, JavaScript akan convert
undefinedmenjadi string literal"undefined" - Semua AJAX request akan punya parameter:
?kode_kabupaten=undefined&filter[kode_kabupaten]=undefined
Dampak:
- Backend API menerima string
"undefined"sebagai kode kabupaten - Query database akan gagal atau return data yang salah
- Filter tidak berfungsi dengan benar
- Potensi data leak jika backend tidak validasi strict
Fix:
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content') || '';
if (!identitasOpenkab) {
console.error('Meta tag identitas-openkab tidak ditemukan');
return; // atau throw error untuk mencegah request dengan data invalid
}| var selectedMenuObj = null; | ||
|
|
||
| $.ajaxSetup({ | ||
| beforeSend: function(xhr, settings) { |
There was a problem hiding this comment.
[CRITICAL] 🐛 Bug: Undefined Injection ke URL AJAX (Duplikasi)
Kode: const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content');
Skenario:
- Sama persis dengan bug di
resources/js/web.jsline 12 - Jika meta tag tidak ada di DOM,
attr('content')returnundefined - String literal
"undefined"akan masuk ke semua AJAX request di admin panel - Karena ini di dalam
$(function() {...}), error baru terdeteksi setelah DOM ready
Dampak:
- Semua fitur admin yang pakai AJAX (DataTables, Select2 remote, form submission) akan kirim
kode_kabupaten=undefined - Backend API menerima data invalid
- Potensi crash atau data corruption jika backend tidak handle edge case ini
Fix:
$(function () {
const identitasOpenkab = $('meta[name="identitas-openkab"]').attr('content') || '';
if (!identitasOpenkab) {
console.error('Meta tag identitas-openkab tidak ditemukan di admin panel');
// Tampilkan alert ke user atau redirect ke error page
return;
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (settings.url.indexOf('?') === -1) {
settings.url += '?kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
} else {
settings.url += '&kode_kabupaten=' + identitasOpenkab + '&filter[kode_kabupaten]=' + identitasOpenkab;
}
}
});
// ... rest of code
});
🤖 AI Code Review — Selesai📋 Ringkasan Semua Review
Total inline comments: 11 |
…ab into feat/set_identitas_openkab
…ab into feat/set_identitas_openkab
Pull Request: Set Identitas OpenKab untuk API-Database-Gabungan
Deskripsi
Pull request ini menambahkan fitur identitas OpenKab yang memungkinkan aplikasi untuk mengirimkan kode kabupaten secara otomatis ke setiap request AJAX. Fitur ini penting untuk integrasi API-Database-Gabungan agar data yang ditampilkan sesuai dengan kabupaten yang sedang aktif.
Ringkasan Perubahan
.gitignore/template_ai/resources/views/layouts/presisi/index.blade.phpidentitas-openkabresources/views/layouts/web.blade.phpidentitas-openkabresources/views/layouts/presisi/partials/javascript.blade.phpresources/js/web.jspublic/build-web/manifest.jsonresources/views/presisi/statistik/*.blade.phpresources/views/presisi/wilayah/peta.blade.phpresources/views/web/partials/property.blade.phpDepedency
https://github.com/OpenSID/API-Database-Gabungan/pull/379
Problem Statement (What & Why)
Masalah:
Beberapa OpenKab menggunakan server API Database Gabungan yang sama. Contoh: Kabupaten Mesuji dan Tulang Bawang menggunakan database gabungan milik Mesuji. Pada halaman publik belum ada identifikasi pengambilan data yang ditampilkan sehingga akan menampilkan semua data dari database gabungan tersebut.
Solusi:
Menambahkan parameter identitas OpenKab (
kode_kabupaten) ke setiap request AJAX agar API hanya mengembalikan data sesuai dengan kabupaten yang bersangkutan.Perubahan yang Dilakukan
1. Meta Tag Identitas
resources/views/layouts/presisi/index.blade.php:8<meta name="identitas-openkab" content="{{ str_replace('.','',$identitasAplikasi['kode_kabupaten'] ?? '') }}">resources/views/layouts/web.blade.php:10<meta name="identitas-openkab" content="{{ str_replace('.','',$identitasAplikasi['kode_kabupaten'] ?? '') }}">Menambahkan meta tag di head layout untuk dibaca oleh JavaScript. Nilai diambil dari konfigurasi
$identitasAplikasi['kode_kabupaten'].2. AJAX Setup Hook
resources/views/layouts/presisi/partials/javascript.blade.php:30-57resources/js/web.js:12-38- Versi Vite untuk frontendKonfigurasi AJAX global yang akan menginjeksi parameter
kode_kabupatendanfilter[kode_kabupaten]ke semua request AJAX secara otomatis.3. View Files Updated
Semua file yang melakukan AJAX call ke API database gabungan sekarang akan otomatis ter-filter:
resources/views/presisi/statistik/sandang.blade.php(line 318)resources/views/presisi/statistik/adat.blade.phpresources/views/presisi/statistik/aktivitas-keagamaan.blade.phpresources/views/presisi/statistik/jaminan-sosial.blade.phpresources/views/presisi/statistik/kesehatan.blade.phpresources/views/presisi/statistik/ketenagakerjaan.blade.phpresources/views/presisi/statistik/pangan.blade.phpresources/views/presisi/statistik/papan.blade.phpresources/views/presisi/statistik/pendidikan.blade.phpresources/views/presisi/statistik/senibudaya.blade.phpresources/views/presisi/wilayah/peta.blade.phpresources/views/presisi/geo_spasial/index.blade.phpresources/views/web/index.blade.phpresources/views/web/partials/property.blade.php4. Build Assets
Alasan Perubahan
Dampak Perubahan
Positif:
Perlu Diperhatikan:
$identitasAplikasi['kode_kabupaten']tersedia di semua halaman^\d{4}$kode_kabupatenataufilter[kode_kabupaten]Steps to Reproduce
Sebelum Perbaikan:
https://api-****.berdesa.id/api/v1/desa-aktif)Setelah Perbaikan:
identitas-openkabdengan kode kabupaten sudah ada di HTMLkode_kabupatenhttps://api-****.berdesa.id/api/v1/desa-aktif?kode_kabupaten=3201- harusnya hanya desa dari kabupaten 3201Testing Checklist
✅ Manual Testing
Testing Identitas Meta Tag
identitas-openkabadaTesting AJAX Parameter Injection
kode_kabupatenada di request URLTesting Fitur Statistik Presisi
Testing Fitur Data Desa Aktif
Testing Fitur Peta
Masalah Terkait (Related Issue)
Sebelum Perbaikan:
Setelah Perbaikan:
Breaking Changes
Tidak ada breaking changes yang sengaja dibuat. Namun, perlu diperhatikan:
kode_kabupatenperlu ditinjau ulangMigration Guide
Tidak ada migration database yang diperlukan.
Untuk developer yang bekerja dengan frontend:
identitas-openkabkode_kabupatensecara manualReferences
feat/set_identitas_openkabrilis-dev✅ DO's
filter[kode_kabupaten]untuk endpoint dengan format filter❌ DON'Ts
screenshot
simplescreenrecorder-2026-04-21_15.56.32.mp4