Skip to content

feat: Frontend — Domain Validation Check Tool #1053

Description

@apidong

Deskripsi

Buat halaman di OpenKab untuk mengecek domain apa yang terbaca oleh API Database Gabungan. Ini sangat membantu troubleshooting ketika dropdown Kabupaten/Kecamatan kosong atau error "Domain tidak diizinkan".

Background

Saat ini, jika API menolak request karena domain tidak diizinkan, user tidak tahu:

  1. Domain apa yang terbaca oleh API
  2. Dari header mana domain tersebut (Origin/Referer/Host)
  3. Apakah request server-side atau browser
  4. Apa yang perlu dilakukan untuk memperbaiki

Halaman yang Dibuat

URL: /pengaturan/domain-check

Menu: Pengaturan → Cek Domain API

Auth: Login required (hanya user yang sudah login bisa akses)

Tampilan

┌─────────────────────────────────────────────────┐
│  Cek Domain API Database Gabungan               │
│  (Hanya untuk Admin)                            │
├─────────────────────────────────────────────────┤
│                                                  │
│  [🔍 Cek Domain Sekarang]                       │
│                                                  │
│  ┌─────────────────────────────────────────────┐│
│  │ Domain Terdeteksi: simatik.bimakota.go.id   ││
│  │ Sumber: Origin header                       ││
│  │ Status: ✅ Diizinkan                        ││
│  │                                              ││
│  │ Detail Headers:                             ││
│  │ • Origin: https://simatik.bimakota.go.id    ││
│  │ • Host: api-simatik.bimakota.go.id          ││
│  │ • X-Forwarded-For: 103.152.36.67            ││
│  │                                              ││
│  │ User: OpenKab (ID: 2)                       ││
│  │ Allowed Domains: simatik.bimakota.go.id     ││
│  │                                              ││
│  │ Rekomendasi:                                ││
│  │ Domain sudah diizinkan. Tidak ada            ││
│  │ perubahan needed.                           ││
│  └─────────────────────────────────────────────┘│
│                                                  │
└─────────────────────────────────────────────────┘

File yang Diubah/Dibuat

File Perubahan
resources/views/pengaturan/domain-check.blade.php BARU — View halaman
app/Http/Controllers/DomainCheckController.php BARU — Controller
routes/web.php Tambah route di dalam group auth
resources/views/layouts/navigations/sidebar.blade.php Tambah menu sidebar (hanya untuk admin)

Security

routes/web.php

Route::middleware(['auth'])->group(function () {
    Route::prefix('pengaturan')->group(function () {
        Route::get('domain-check', [DomainCheckController::class, 'index'])->name('domain-check.index');
        Route::post('domain-check', [DomainCheckController::class, 'check'])->name('domain-check.check');
    });
});

DomainCheckController.php

public function index()
{
    if (!auth()->check()) {
        abort(403, 'Unauthorized');
    }
    
    return view('pengaturan.domain-check');
}

public function check(Request )
{
    if (!auth()->check()) {
        return response()->json(['message' => 'Unauthorized'], 403);
    }
    
     = Setting::where('key', 'database_gabungan_api_key')->value('value');
    
     = Http::withHeaders([
        'Authorization' => 'Bearer ' . ,
        'Accept' => 'application/json',
    ])->get(config('app.databaseGabunganUrl') . '/api/v1/debug/domain-check');
    
    return response()->json(->json());
}

Logic Frontend

.click(function() {
    $.ajax({
        url: '{{ route("domain-check.check") }}',
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}'
        },
        success: function(response) {
            .html(renderResult(response));
        },
        error: function(xhr) {
            if (xhr.status === 403) {
                alert('Anda tidak memiliki akses');
            } else {
                .html(renderError(xhr.responseJSON));
            }
        }
    });
});

Testing

  1. Test tanpa login → harus redirect ke halaman login
  2. Test dengan login user biasa → bisa akses
  3. Test dengan login admin → bisa akses
  4. Klik tombol "Cek Domain Sekarang" → tampilkan hasil
  5. Verify domain terdeteksi dengan benar
  6. Verify status (diizinkan/tidak) sesuai
  7. Verify recommendation muncul

Dependensi

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions