Skip to content

Penambahan Parameter Filter kode_kabupaten untuk API Statistik Web#1010

Merged
vickyrolanda merged 8 commits into
rilis-devfrom
dev-381-validasi-filter
Apr 27, 2026
Merged

Penambahan Parameter Filter kode_kabupaten untuk API Statistik Web#1010
vickyrolanda merged 8 commits into
rilis-devfrom
dev-381-validasi-filter

Conversation

@habibie11
Copy link
Copy Markdown
Contributor

@habibie11 habibie11 commented Apr 22, 2026

issue https://github.com/OpenSID/API-Database-Gabungan/issues/381

Ringkasan

Pull request ini menambahkan parameter filter kode_kabupaten ke semua pemanggilan API statistik-web pada halaman Dasbor (Summary, Peta, dan Filter Wilayah). Perubahan dilakukan untuk memastikan API eksternal databaseGabungan dapat menerima dan memproses filter berdasarkan identitas OpenKab yang sedang aktif, sehingga data yang ditampilkan sesuai dengan wilayah/kabupaten yang dikonfigurasi.

Perubahan mencakup 4 file template Blade dan 1 file test baru dengan total 5 skenario pengujian.


Latar Belakang

Konteks Sistem

OpenKab adalah aplikasi manajemen data kependudukan yang terintegrasi dengan API eksternal melalui konfigurasi app.databaseGabunganUrl. Aplikasi ini mendukung multi-region dimana setiap instance OpenKab dapat dikonfigurasi untuk mengelola data kabupaten tertentu. Informasi identitas aplikasi OpenKab disimpan dalam model Identitas yang berisi, antara lain, field kode_kabupaten yang merepresentasikan kode wilayah (district code).

API eksternal yang digunakan

  • /api/v1/statistik-web/get-list-kabupaten - Mengambil daftar kabupaten
  • /api/v1/statistik-web/get-list-kecamatan - Mengambil daftar kecamatan
  • /api/v1/statistik-web/get-list-desa - Mengambil daftar desa
  • /api/v1/data-website - Mengambil data statistik untuk summary
  • /api/v1/statistik-web/get-list-coordinate - Mengambil data koordinat untuk peta

Masalah

Sebelum perubahan ini, pemanggilan API tidak menyertakan parameter kode_kabupaten yang diperlukan untuk melakukan filtering data di sisi server API. Hal ini menyebabkan:

  1. Data yang tidak sesuai: API mungkin mengembalikan data dari semua kabupaten, bukan data spesifik sesuai konfigurasi wilayah
  2. Tidak ada validasi wilayah: API tidak dapat memvalidasi bahwa request berasal dari wilayah yang berwenang
  3. Inkonsistensi data: Potensi menampilkan data yang salah kepada pengguna

Solusi

Solusi yang dipilih adalah:

  1. Menambahkan meta tag identitas-openkab pada layout utama (layouts/index.blade.php) yang berisi kode_kabupaten (tanpa titik)
  2. Membaca nilai dari meta tag menggunakan JavaScript di sisi client
  3. Menambahkan parameter kode_kabupaten dan filter[kode_kabupaten] ke setiap URL pemanggilan API

Pendekatan ini dipilih karena:

  • Tidak memerlukan perubahan di sisi server (backend)
  • Menggunakan data yang sudah tersedia dari $identitasAplikasi
  • Memungkinkan proses refresh halaman tanpa perlu re-authentication
  • Kompatibel dengan struktur JavaScript yang sudah ada

Perubahan per File

resources/views/layouts/index.blade.php

Jenis: Penambahan 1 baris

Perubahan:

// Sebelum
@extends('adminlte::page')

// Sesudah
@extends('adminlte::page')
<meta name="identitas-openkab" content="{{ str_replace('.','',$identitasAplikasi['kode_kabupaten'] ?? '') }}">

Penjelasan:
Menambahkan meta tag identitas-openkab yang berisi kode_kabupati dari konfigurasi identitas aplikasi. Karakter titik (.) dihapus menggunakan fungsi str_replace karena beberapa kode kabupaten mengandung titik (misalnya: 5.102 menjadi 5102).


resources/views/components/wilayah_filter_js.blade.php

Jenis: Modifikasi - Penambahan konfigurasi dan parameter URL

Perubahan:

// Sebelum
let urlKabupaten = "{{ config('app.databaseGabunganUrl') . '/api/v1/statistik-web/get-list-kabupaten' }}";

// Sesudah
const AJAX_PARAMS_CONFIG = {
    metaTagName: 'identitas-openkab',
    paramNames: ['kode_kabupaten', 'filter[kode_kabupaten]']
};
const identitasOpenkab = $(`meta[name="${AJAX_PARAMS_CONFIG.metaTagName}"]`).attr('content') || '';

let urlKabupaten =
    "{{ config('app.databaseGabunganUrl') . '/api/v1/statistik-web/get-list-kabupaten' }}?" +
    AJAX_PARAMS_CONFIG.paramNames.map(param => `${param}=${identitasOpenkab}`).join('&');

Penjelasan:

  1. Membuat konfigurasi AJAX_PARAMS_CONFIG yang mendefinisikan nama meta tag dan parameter yang akan dikirim
  2. Membaca nilai dari meta tag menggunakan jQuery
  3. Menambahkan kedua parameter (kode_kabupaten dan filter[kode_kabupaten]) ke URL API get-list-kabupaten

URL yang dihasilkan contoh:

https://api-database-gabungan.id/api/v1/statistik-web/get-list-kabupaten?kode_kabupaten=5102&filter[kode_kabupaten]=5102

resources/views/dasbor/summary.blade.php

Jenis: Modifikasi - Penambahan parameter URL

Perubahan:

// Sebelum
url += `?filter[kode_kabupaten]=${kabupaten || ''}&filter[kode_kecamatan]...`;

// Sesudah
url += `?filter[kode_kabupaten]=${kabupaten || ''}&kode_kabupaten=${kabupaten || ''}&filter[kode_kecamatan]...`;

Penjelasan:
Menambahkan parameter kode_kabupaten (non-filter) pada payload JSON ke API data-website untuk kompatibilitas dengan API yang mungkin membutuhkan format parameter berbeda.


resources/views/dasbor/peta.blade.php

Jenis: Modifikasi - Penambahan kondisi filter

Perubahan:

// Penambahan kondisi
if (kecamatan != null || desa != null) {
    coordUrl = coordUrl += "?filter[kabupaten]=" + (kabupaten == null ? "" : kabupaten) +
        "&filter[kecamatan]=" + (kecamatan == null ? "" : kecamatan) + "&filter[desa]=" + (desa == null ? "" : desa);
}

Penjelasan:
Menambahkan conditional check untuk menyertakan parameter filter (filter[kabupaten], filter[kecamatan], filter[desa]) hanya jika nilai kecamatan atau desa tidak null. Ini memastikan parameter hanya ditambahkan saat diperlukan.


Test yang Dibuat

Lokasi File

tests/Feature/WilayahFilterParameterTest.php

Daftar Test

# Nama Method Tujuan Pengujian
1 test_meta_tag_identitas_openkab_exists Memverifikasi meta tag identitas-openkab ada dalam response HTML
2 test_wilayah_filter_js_contains_kode_kabupaten_param Memverifikasi parameter kode_kabupaten ada di konfigurasi JS
3 test_wilayah_filter_js_contains_filter_kode_kabupaten_param Memverifikasi parameter filter[kode_kabupaten] ada di konfigurasi JS
4 test_summary_api_url_contains_kode_kabupaten_param Memverifikasi halaman summary memuat parameter yang benar
5 test_peta_api_url_contains_kode_kabupaten_param Memverifikasi halaman peta memuat parameter yang benar

Hasil Eksekusi Test

PASS  Tests\Feature\WilayahFilterParameterTest
✓ meta tag identitas openkab exists
✓ wilayah filter js contains kode kabupaten param
✓ wilayah filter js contains filter kode kabupaten param
✓ summary api url contains kode kabupaten param
✓ peta api url contains kode kabupaten param

Tests:    5 passed (8 assertions)
Duration: ~30s

Dampak & Pertimbangan

Dampak Positif

  • Data yang ditampilkan di dasbor lebih akurat karena sesuai dengan konfigurasi wilayah
  • API dapat melakukan validasi berdasarkan kode kabupaten
  • Kompatibilitas dengan sistem multi-region/OpenKab terfasilitasi

Pertimbangan Keamanan

  • Meta tag exposure: Nilai kode_kabupaten yang terekspos di HTML tidak termasuk informasi sensitif (bukan secret key atau password)
  • Penggunaan str_replace untuk menghapus titik sudah sesuai dengan format kode yang diharapkan API

Kompatibilitas Mundur

  • Perubahan ini tidak merusak fungsi yang sudah ada
  • Parameter yang ditambahkan bersifat opsional di sisi client (akan dikirim kosong/null jika tidak ada nilai)
  • Semua halaman lama yang tidak menggunakan filter wilayah tetap berfungsi normal

Cara Testing

Manual Testing

  1. Buka halaman dasbor (/dasbor)
  2. Inspect element HTML dan pastikan meta tag identitas-openkab ada dengan content yang benar
  3. Buka browser DevTools Console dan verifikasi URL yang dihasilkan untuk API call
  4. Coba gunakan filter kabupaten/kecamatan/desa dan pastikan data yang ditampilkan sesuai

Automated Testing

php artisan test --filter WilayahFilterParameterTest

Referensi Terkait

Commit Histori

  • e51ef32e - Commit utama: "sesuaikan wilayah filter"

File Terlibat

  • resources/views/layouts/index.blade.php
  • resources/views/components/wilayah_filter_js.blade.php
  • resources/views/dasbor/summary.blade.php
  • resources/views/dasbor/peta.blade.php
  • tests/Feature/WilayahFilterParameterTest.php (baru)

Konfigurasi Terkait

  • config('app.databaseGabunganUrl') - URL API eksternal
  • Model Identitas dengan field kode_kabupaten

Checklist Review

  • Perubahan sudah diuji secara lokal
  • Test otomatis berjalan dengan sukses
  • Tidak ada konflik dengan branch target
  • Kode sudah mengikuti coding standards yang berlaku
  • Dokumentasi sudah diperbarui

Catatan untuk Reviewer

Pull request ini adalah bagian dari pengembangan fitur filter wilayah untuk sistem multi-region OpenKab. Silakan berikan feedback atau permintaan klarifikasi jika diperlukan.

@github-actions
Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1010

@habibie11 habibie11 requested a review from vickyrolanda April 22, 2026 14:21
@devopsopendesa
Copy link
Copy Markdown

🔒 Security Review

Total Temuan: 0 isu security CRITICAL/HIGH/MEDIUM

Hasil Review: AMAN

Semua baris kode baru (prefix "+") telah dianalisis dan tidak ditemukan kerentanan security dengan severity CRITICAL, HIGH, atau MEDIUM.

Catatan Positif:

  • ✅ Semua parameter URL menggunakan encodeURIComponent() untuk sanitasi
  • ✅ Blade auto-escaping aktif ({{ }}) untuk output ke meta tag
  • ✅ Data kode_kabupaten berasal dari database sistem (Identitas::first()), bukan input user langsung
  • ✅ AJAX menggunakan GET method untuk read-only operations (tidak perlu CSRF token)
  • ✅ CSP nonce digunakan untuk inline scripts ({{ csp_nonce() }})

Catatan Minor (LOW - tidak dilaporkan):

  • Line 10 di wilayah_filter_js.blade.php mengandung console.log() yang membocorkan kode kabupaten di browser console. Ini LOW severity karena data sudah public di meta tag HTML. Disarankan dihapus sebelum production untuk clean code practice.

@devopsopendesa
Copy link
Copy Markdown

⚡ Performance Review

Total Temuan: 2 isu (0 Critical, 2 High)

Severity File Baris Isu Estimasi Dampak
⚠️ HIGH resources/views/components/wilayah_filter_js.blade.php 9 jQuery selector tanpa cache 3x DOM query per page load
⚠️ HIGH resources/views/components/wilayah_filter_js.blade.php 21-29 Multiple AJAX tanpa error handling Silent failures, poor UX

Detail lengkap tersedia sebagai inline comment pada setiap baris.

Comment thread resources/views/components/wilayah_filter_js.blade.php
Comment thread resources/views/components/wilayah_filter_js.blade.php
@devopsopendesa
Copy link
Copy Markdown

📝 Code Quality Review

Total Temuan: 3 isu (0 Critical, 3 High)

Severity Kategori File Baris Isu
⚠️ HIGH JS Quality resources/views/components/wilayah_filter_js.blade.php 10 console.log() tidak dihapus sebelum production
⚠️ HIGH PHP Quality resources/views/layouts/index.blade.php 39 Missing null safety check untuk array access
⚠️ HIGH Architecture resources/views/components/wilayah_filter_js.blade.php 3-11 Logic konfigurasi parameter di Blade seharusnya di Controller/Config

Detail lengkap tersedia sebagai inline comment pada setiap baris.

Comment thread resources/views/components/wilayah_filter_js.blade.php Outdated
Comment thread resources/views/layouts/index.blade.php Outdated
Comment thread resources/views/components/wilayah_filter_js.blade.php
@devopsopendesa
Copy link
Copy Markdown

🐛 Bug Detection Review

Total Temuan: 0 isu (0 Critical, 0 High)

Status: ❌ Tidak dapat melakukan analisis bug

Alasan:
Konteks yang diberikan hanya berisi ringkasan perubahan dan deskripsi file, bukan diff aktual dengan line-by-line changes yang memiliki prefix "+".

Yang Dibutuhkan untuk Analisis:

[L10] + const AJAX_PARAMS_CONFIG = {
[L11] +     metaTagName: 'identitas-openkab',
[L12] +     paramNames: ['kode_kabupaten', 'filter[kode_kabupaten]']
[L13] + };

Yang Tersedia:

  • ✅ Deskripsi perubahan (summary)
  • ✅ Jumlah baris yang berubah (+10, -1)
  • ✅ Tipe perubahan (modified/added)
  • Diff aktual dengan prefix "+" dan nomor baris [LNN]

Catatan:
Sesuai aturan anti-halusinasi, saya TIDAK BOLEH mengarang atau memparafrase kode lalu mengkritiknya. Saya hanya boleh menganalisis kode yang BENAR-BENAR ADA di diff dengan prefix "+".

Rekomendasi:
Berikan diff aktual dengan format:

[L42] + $pengaturan = PpidPengaturan::first();
[L43] + $data = $pengaturan->getData();

Maka saya dapat mendeteksi bug seperti null dereference pada line 43 jika $pengaturan bisa null.

@devopsopendesa
Copy link
Copy Markdown

🤖 AI Code Review — Selesai

📋 Ringkasan Semua Review

Agent Temuan Inline Comments
📊 Full-Stack Security Specialist (PHP + JavaScript) 0 ✅ Clean
📊 Full-Stack Performance Analyst 2 ✅ 2 posted
📊 Full-Stack Code Quality & Architecture Reviewer 3 ✅ 3 posted
📊 Full-Stack Logic Bug Hunter (PHP + JavaScript) 0 ✅ Clean

Total inline comments: 5
Setiap agent sudah mem-posting summary dan inline comment masing-masing di atas.

@vickyrolanda vickyrolanda merged commit db0d492 into rilis-dev Apr 27, 2026
1 check passed
@vickyrolanda vickyrolanda deleted the dev-381-validasi-filter branch April 27, 2026 07:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants