paginate(10); $availablePermissions = User::getAvailablePermissions(); $userTypes = UserType::getAllForSelect(); return view('admin.users.index', compact('users', 'availablePermissions', 'userTypes')); } public function create() { $availablePermissions = User::getAvailablePermissions(); $userTypes = UserType::getAllForSelect(); return view('admin.users.create', compact('availablePermissions', 'userTypes')); } public function store(Request $request) { $validTypes = UserType::pluck('name')->toArray(); $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8', 'user_type' => 'required|string|in:' . implode(',', $validTypes), 'company' => 'nullable|string|max:255', 'website' => 'nullable|string|max:255|regex:/^https?:\/\/.+\..+$/i', 'whatsapp' => 'nullable|string|max:20', 'permissions' => 'nullable|array', 'permissions.*' => 'string|in:' . implode(',', array_keys(User::getAvailablePermissions())), ], [ 'website.regex' => 'O site deve começar com http:// ou https:// e ter um formato válido.', ]); $data = $request->all(); $data['password'] = \Illuminate\Support\Facades\Hash::make($request->password); $data['email_verified_at'] = now(); // Handle permissions: admin types get null (all access), others get selected permissions $selectedType = UserType::where('name', $data['user_type'])->first(); if ($selectedType && $selectedType->is_admin) { $data['permissions'] = null; } else { $data['permissions'] = $request->has('permissions') ? $request->input('permissions') : []; } User::create($data); return redirect()->route('admin.users.index')->with('success', 'Usuário criado com sucesso.'); } public function edit(User $user) { $availablePermissions = User::getAvailablePermissions(); $userTypes = UserType::getAllForSelect(); return view('admin.users.edit', compact('user', 'availablePermissions', 'userTypes')); } public function update(Request $request, User $user) { $validTypes = UserType::pluck('name')->toArray(); $request->validate([ 'name' => 'required|string|max:255', 'user_type' => 'required|string|in:' . implode(',', $validTypes), 'company' => 'nullable|string|max:255', 'website' => 'nullable|string|max:255|regex:/^https?:\/\/.+\..+$/i', 'whatsapp' => 'nullable|string|max:20', 'password' => 'nullable|string|min:8|confirmed', 'permissions' => 'nullable|array', 'permissions.*' => 'string|in:' . implode(',', array_keys(User::getAvailablePermissions())), ], [ 'website.regex' => 'O site deve começar com http:// ou https:// e ter um formato válido.', ]); $data = $request->except('password'); if ($request->filled('password')) { $data['password'] = \Illuminate\Support\Facades\Hash::make($request->password); } // Handle permissions: admin types get null (all access), others get selected permissions $selectedType = UserType::where('name', $data['user_type'])->first(); if ($selectedType && $selectedType->is_admin) { $data['permissions'] = null; } else { $data['permissions'] = $request->has('permissions') ? $request->input('permissions') : []; } $user->update($data); return redirect()->route('admin.users.index')->with('success', 'Usuário atualizado com sucesso.'); } public function destroy(User $user) { if ($user->id === \Illuminate\Support\Facades\Auth::id()) { return redirect()->route('admin.users.index')->with('error', 'Você não pode excluir sua própria conta.'); } $user->delete(); return redirect()->route('admin.users.index')->with('success', 'Usuário excluído com sucesso.'); } }