151 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers\Admin;
 | 
						|
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\User;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\Hash;
 | 
						|
use Illuminate\Validation\Rule;
 | 
						|
use Spatie\Permission\Models\Role;
 | 
						|
 | 
						|
class UserController extends Controller
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Display a listing of users
 | 
						|
     */
 | 
						|
    public function index()
 | 
						|
    {
 | 
						|
        $users = User::with('roles')->paginate(10);
 | 
						|
 | 
						|
        return view('admin.users.index', compact('users'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Show the form for creating a new user
 | 
						|
     */
 | 
						|
    public function create()
 | 
						|
    {
 | 
						|
        $roles = Role::all();
 | 
						|
 | 
						|
        return view('admin.users.create', compact('roles'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Store a newly created user
 | 
						|
     */
 | 
						|
    public function store(Request $request)
 | 
						|
    {
 | 
						|
        $validated = $request->validate([
 | 
						|
            'name' => ['required', 'string', 'max:255'],
 | 
						|
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
 | 
						|
            'username' => ['required', 'string', 'max:255', 'unique:users'],
 | 
						|
            'password' => [
 | 
						|
                'required',
 | 
						|
                'string',
 | 
						|
                'min:8',
 | 
						|
                'confirmed',
 | 
						|
                'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/',
 | 
						|
            ],
 | 
						|
            'roles' => ['array'],
 | 
						|
            'roles.*' => ['exists:roles,name'],
 | 
						|
        ]);
 | 
						|
 | 
						|
        $user = User::create([
 | 
						|
            'name' => $validated['name'],
 | 
						|
            'email' => $validated['email'],
 | 
						|
            'username' => $validated['username'],
 | 
						|
            'password' => Hash::make($validated['password']),
 | 
						|
        ]);
 | 
						|
 | 
						|
        if (!empty($validated['roles'])) {
 | 
						|
            $user->assignRole($validated['roles']);
 | 
						|
        }
 | 
						|
 | 
						|
        return redirect()->route('admin.users.index')
 | 
						|
            ->with('success', 'Pengguna berhasil ditambahkan.');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Display the specified user
 | 
						|
     */
 | 
						|
    public function show(User $user)
 | 
						|
    {
 | 
						|
        $user->load('roles', 'permissions');
 | 
						|
 | 
						|
        return view('admin.users.show', compact('user'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Show the form for editing the specified user
 | 
						|
     */
 | 
						|
    public function edit(User $user)
 | 
						|
    {
 | 
						|
        $roles = Role::all();
 | 
						|
        $userRoles = $user->roles->pluck('name')->toArray();
 | 
						|
 | 
						|
        return view('admin.users.edit', compact('user', 'roles', 'userRoles'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Update the specified user
 | 
						|
     */
 | 
						|
    public function update(Request $request, User $user)
 | 
						|
    {
 | 
						|
        $validated = $request->validate([
 | 
						|
            'name' => ['required', 'string', 'max:255'],
 | 
						|
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
 | 
						|
            'username' => ['required', 'string', 'max:255', Rule::unique('users')->ignore($user->id)],
 | 
						|
            'password' => [
 | 
						|
                'nullable',
 | 
						|
                'string',
 | 
						|
                'min:8',
 | 
						|
                'confirmed',
 | 
						|
                'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/',
 | 
						|
            ],
 | 
						|
            'roles' => ['array'],
 | 
						|
            'roles.*' => ['exists:roles,name'],
 | 
						|
        ]);
 | 
						|
 | 
						|
        $user->update([
 | 
						|
            'name' => $validated['name'],
 | 
						|
            'email' => $validated['email'],
 | 
						|
            'username' => $validated['username'],
 | 
						|
        ]);
 | 
						|
 | 
						|
        // Update password only if provided
 | 
						|
        if (!empty($validated['password'])) {
 | 
						|
            $user->update([
 | 
						|
                'password' => Hash::make($validated['password']),
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        // Sync roles
 | 
						|
        if (isset($validated['roles'])) {
 | 
						|
            $user->syncRoles($validated['roles']);
 | 
						|
        } else {
 | 
						|
            $user->syncRoles([]);
 | 
						|
        }
 | 
						|
 | 
						|
        return redirect()->route('admin.users.index')
 | 
						|
            ->with('success', 'Pengguna berhasil diperbarui.');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Remove the specified user
 | 
						|
     */
 | 
						|
    public function destroy(User $user)
 | 
						|
    {
 | 
						|
        // Prevent deleting current user
 | 
						|
        if ($user->id === auth()->id()) {
 | 
						|
            return redirect()->route('admin.users.index')
 | 
						|
                ->with('error', 'Anda tidak dapat menghapus akun sendiri.');
 | 
						|
        }
 | 
						|
 | 
						|
        $user->delete();
 | 
						|
 | 
						|
        return redirect()->route('admin.users.index')
 | 
						|
            ->with('success', 'Pengguna berhasil dihapus.');
 | 
						|
    }
 | 
						|
}
 |