Files
marco 38295e7e88 feat(cms): implement complete SysSiteCMS content management system
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
2026-09-07 19:06:53 -03:00

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.');
}
}