Files
D1041231009-WebGIS-PovertyMap/routes/web.php
T
GuavaPopper f855f7e027 feat: Plan 4 — Dashboard Statistik + Gap Analysis
- Add /dashboard route (all authenticated roles)
- Add dashboard view with Chart.js 4.4:
  - 4 stat cards (ibadah, miskin, jiwa, % terjangkau)
  - Donut chart: ibadah per jenis
  - Horizontal bar chart: miskin per kondisi rumah
  - Gap Analysis: Turf.js coverage computation, doughnut chart,
    per-ibadah coverage table sorted by KK count, uncovered family list
  - esc() helper applied to all user-data innerHTML
- Add Dashboard nav link to map, data, and admin views
- 5 new tests: unauthenticated redirect + all 4 roles can access
- Mark K-02 and K-03 complete in missing_features.md
- Update README with new page and feature section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03 14:19:37 +07:00

56 lines
2.6 KiB
PHP

<?php
use App\Http\Controllers\AdminUserController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\IbadahController;
use App\Http\Controllers\MiskinController;
use Illuminate\Support\Facades\Route;
// Auth routes (public, redirect to /map if already logged in)
Route::get('/login', [AuthController::class, 'showLogin'])->name('login')->middleware('guest');
Route::post('/login', [AuthController::class, 'login'])->middleware('guest');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout')->middleware('auth');
// All other routes require authentication
Route::middleware('auth')->group(function () {
// Web pages
Route::get('/', fn() => view('welcome'));
Route::get('/map', fn() => view('map'));
Route::get('/data', fn() => view('data'));
Route::get('/dashboard', fn() => view('dashboard'))->name('dashboard');
// API routes moved here for session + CSRF middleware
Route::prefix('api')->group(function () {
// Rumah Ibadah — read: all roles, write: administrator + pengurus_ibadah
Route::get('/ibadah', [IbadahController::class, 'index']);
Route::middleware('role:administrator|pengurus_ibadah')->group(function () {
Route::post('/ibadah', [IbadahController::class, 'store']);
Route::put('/ibadah/{id}', [IbadahController::class, 'update']);
Route::delete('/ibadah/{id}', [IbadahController::class, 'destroy']);
});
// Rumah Miskin — read: all roles, write: administrator + petugas_pendataan
Route::get('/miskin', [MiskinController::class, 'index']);
Route::middleware('role:administrator|petugas_pendataan')->group(function () {
Route::post('/miskin', [MiskinController::class, 'store']);
Route::put('/miskin/{id}', [MiskinController::class, 'update']);
Route::delete('/miskin/{id}', [MiskinController::class, 'destroy']);
});
});
// Admin routes — hanya administrator
Route::middleware('role:administrator')->group(function () {
Route::get('/admin/users', fn() => view('admin.users'))->name('admin.users');
Route::prefix('api/admin')->group(function () {
Route::get('/users', [AdminUserController::class, 'index']);
Route::post('/users', [AdminUserController::class, 'store']);
Route::put('/users/{id}', [AdminUserController::class, 'update']);
Route::delete('/users/{id}', [AdminUserController::class, 'destroy']);
Route::put('/users/{id}/password', [AdminUserController::class, 'resetPassword']);
});
});
});