Manajemen Pengguna
Kelola akun pengguna dan hak akses sistem.
| # | Nama | Role | Aksi |
|---|
# Plan 3: Manajemen Pengguna (Admin User Management) > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Tambah halaman admin `/admin/users` untuk CRUD pengguna dan assign role — hanya bisa diakses oleh `administrator`. **Architecture:** Buat `AdminUserController` dengan 5 endpoint JSON (`index`, `store`, `update`, `destroy`, `resetPassword`). Buat view `resources/views/admin/users.blade.php` dengan pola DaisyUI yang sama persis seperti `data.blade.php` (fetch API, toast, modals, table rows). Tambahkan link "Admin" ke navbar di `map.blade.php` dan `data.blade.php` — muncul hanya untuk role `administrator`. Semua route di-protect dengan `role:administrator`. **Tech Stack:** Laravel 13, Spatie Permission v8, Blade, Vanilla JS (fetch + async/await), DaisyUI 4, Tailwind CSS, Font Awesome 6. > **Scope note:** Ini adalah Plan 3 dari `missing_features.md` (A-01). Plan 4–6 adalah subsistem terpisah yang masing-masing butuh plan tersendiri. --- ## Progress | Task | Status | |------|--------| | Task 1: AdminUserController | ✅ Selesai (file dibuat, belum di-commit) | | Task 2: Routes | ⚠️ Sebagian — `use` statement ditambah, route group belum | | Task 3: View admin/users.blade.php | ❌ Belum | | Task 4: Navbar links (map + data) | ❌ Belum | | Task 5: Tests | ❌ Belum | | Task 6: Docs | ❌ Belum | **Commit dulu sebelum lanjut:** ```bash git add app/Http/Controllers/AdminUserController.php routes/web.php git commit -m "feat: add AdminUserController, add use statement to routes" ``` --- ## File Map | Action | File | |--------|------| | Create | `app/Http/Controllers/AdminUserController.php` | | Modify | `routes/web.php` | | Create | `resources/views/admin/users.blade.php` | | Modify | `resources/views/map.blade.php` | | Modify | `resources/views/data.blade.php` | | Create | `tests/Feature/AdminUserTest.php` | | Modify | `missing_features.md` | | Modify | `README.md` | --- ## Task 1: Buat AdminUserController ✅ File sudah dibuat di `app/Http/Controllers/AdminUserController.php`. - [x] **Step 1: Tulis controller** ```php get()->map(fn($u) => [ 'id' => $u->id, 'name' => $u->name, 'email' => $u->email, 'role' => $u->getRoleNames()->first() ?? null, ]); return response()->json($users); } public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|string|min:8', 'role' => 'required|string|exists:roles,name', ]); $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => $validated['password'], ]); $user->syncRoles([$validated['role']]); return response()->json(['success' => true, 'data' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'role' => $validated['role'], ]]); } public function update(Request $request, $id) { $user = User::findOrFail($id); $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $id, 'role' => 'required|string|exists:roles,name', ]); $user->update(['name' => $validated['name'], 'email' => $validated['email']]); $user->syncRoles([$validated['role']]); return response()->json(['success' => true, 'data' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'role' => $validated['role'], ]]); } public function destroy($id) { $user = User::findOrFail($id); if ($user->id === auth()->id()) { return response()->json(['message' => 'Tidak dapat menghapus akun sendiri.'], 403); } $user->delete(); return response()->json(['success' => true]); } public function resetPassword(Request $request, $id) { $user = User::findOrFail($id); $request->validate([ 'password' => 'required|string|min:8|confirmed', ]); $user->update(['password' => $request->password]); return response()->json(['success' => true]); } } ``` - [ ] **Step 2: Commit** ```bash git add app/Http/Controllers/AdminUserController.php git commit -m "feat: add AdminUserController with CRUD and password reset" ``` --- ## Task 2: Tambah Routes Admin **Files:** - Modify: `routes/web.php` > **STATUS:** `use App\Http\Controllers\AdminUserController;` sudah ditambah di routes/web.php. Tinggal tambahkan route group di Step 1 lalu commit. - [ ] **Step 1: Tambah route group admin** Di `routes/web.php`, dalam middleware group `auth`, tambahkan **sebelum** kurung tutup `});` terakhir: ```php // 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']); }); }); ``` - [ ] **Step 2: Commit** ```bash git add routes/web.php git commit -m "feat: add admin user management routes" ``` --- ## Task 3: Buat View Admin Users **Files:** - Create: `resources/views/admin/users.blade.php` Ikuti pola `data.blade.php` (sticky navbar, DaisyUI, JS fetch, toast, modals). - [ ] **Step 1: Tulis view lengkap** ```html
Kelola akun pengguna dan hak akses sistem.
| # | Nama | Role | Aksi |
|---|