Initial implementation of the HomeSysPanel CMS built with Laravel 13.0. Includes complete admin panel, content management, user authentication, modular architecture for products/services/chatbot, and marketing tools. Key features: - User authentication with email verification and password reset - Role-based access control (Admin/User with granular permissions) - Content management (pages, news, FAQ, downloads, galleries, banners) - Contact management system with subjects and responses - Marketing tools (email campaigns, visitor analytics, social sharing) - Modular architecture (Products, Services, Chatbot modules) - AI Chatbot integration with OpenRouter.ai and LlamaCpp support - Visitor tracking with geolocation - SEO optimization with meta tags and Open Graph - Responsive design with Bootstrap 5 - Dark mode support - Maintenance mode - Feature request system
114 lines
4.4 KiB
PHP
Executable File
114 lines
4.4 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use App\Models\UserType;
|
|
use Illuminate\Http\Request;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$users = User::latest()->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.');
|
|
}
|
|
}
|