feat: tambahkan parameter identitas openkab#1007
feat: tambahkan parameter identitas openkab#1007pandigresik wants to merge 1 commit 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 |
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.
Perubahan yang dilakukan:
.gitignore/template_ai/ke daftar ignore untuk menjaga file template AI tidak masuk ke version controlpublic/build-web/assets/vendor-02370d6c.jsresources/views/layouts/presisi/index.blade.phpidentitas-openkabyang berisi kode kabupaten:<meta name="identitas-openkab" content="{{ str_replace('.','',$identitasAplikasi['kode_kabupaten'] ?? '') }}">resources/views/layouts/presisi/partials/javascript.blade.phpkode_kabupatendanfilter[kode_kabupaten]ke setiap request AJAX:resources/views/layouts/web.blade.phpidentitas-openkabyang sama untuk layout web utamaresources/views/web/partials/property.blade.phpAlasan perubahan:
kode_kabupatendi setiap AJAX call yang ada di aplikasiDampak perubahan:
Positif:
kode_kabupatenPerlu diperhatikan:
kode_kabupatendanfilter[kode_kabupaten]Masalah Terkait (Related Issue)
Closes #996
Sebelum perbaikan (masalah):
kode_kabupatensecara manualSetelah perbaikan (fix):
kode_kabupatendanfilter[kode_kabupaten]Testing pada fitur lain yang terkait:
Daftar Periksa (Checklist)
Code Review
Dependencies yang ditambahkan
Manual Testing
Testing Identitas Meta Tag
identitas-openkabada di HTMLidentitas-openkabada di HTMLTesting AJAX Parameter Injection
kode_kabupatendanfilter[kode_kabupaten]ada di request URLTesting Fitur Statistik Presisi
Testing Fitur Data Desa Aktif
page[size]=6ada di requestTesting Fitur Artikel dan Konten Web
Automated Testing
Screenshots / Video
simplescreenrecorder-2026-04-21_15.56.32.mp4
(Tambahkan screenshot atau video jika diperlukan untuk mendemonstrasikan perubahan)
Contoh Meta Tag di HTML:
Contoh Request URL dengan Parameter:
Teknis Detail
Cara Kerja AJAX Setup
identitas-openkab$.ajaxSetup()untuk menangkap semua request AJAX sebelum dikirimkode_kabupatendanfilter[kode_kabupaten]ditambahkan ke URL?) untuk menentukan apakah menggunakan?atau&Format Kode Kabupaten
Kode kabupaten diambil dari
$identitasAplikasi['kode_kabupaten']dan karakter titik (.) dihapus menggunakanstr_replace('.',''). Ini untuk memastikan format kode kabupaten konsisten.Parameter yang Ditambahkan
Setiap request AJAX akan menerima dua parameter tambahan:
kode_kabupaten: Parameter utama untuk identifikasi kabupatenfilter[kode_kabupaten]: Parameter dalam format filter untuk kompatibilitas dengan API yang menggunakan format filterTesting
Unit Testing
Tidak ada unit test baru yang ditambahkan karena perubahan ini terutama pada view dan JavaScript.
Breaking Changes
Tidak ada breaking changes yang sengaja dibuat. Namun, perlu diperhatikan:
kode_kabupatendanfilter[kode_kabupaten]perlu ditinjau ulangMigration Guide
Tidak ada migration database yang diperlukan untuk perubahan ini.
Untuk developer yang bekerja dengan frontend:
identitas-openkabkode_kabupatensecara manual di AJAX callglobal: falsedi options AJAX:References
feat/set_identitas_openkabrilis-dev✅ DO's (Hal yang harus dilakukan)
kode_kabupatendi endpoint API yang membutuhkan filter kabupatenfilter[kode_kabupaten]untuk endpoint yang menggunakan format filteridentitas-openkabjika perlu diakses dari JavaScript❌ DON'Ts (Hal yang tidak boleh dilakukan)
kode_kabupatensecara manual di AJAX call (sudah otomatis)$.ajaxSetup()tanpa alasan yang jelas