glastree_on_gitea
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ActivityLogController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = ActivityLog::with('user');
|
||||
|
||||
if ($request->filled('user_id')) {
|
||||
$query->where('user_id', $request->user_id);
|
||||
}
|
||||
|
||||
if ($request->filled('module')) {
|
||||
$query->where('module', $request->module);
|
||||
}
|
||||
|
||||
if ($request->filled('action')) {
|
||||
$query->where('action', $request->action);
|
||||
}
|
||||
|
||||
if ($request->filled('from')) {
|
||||
$query->whereDate('created_at', '>=', $request->from);
|
||||
}
|
||||
|
||||
if ($request->filled('to')) {
|
||||
$query->whereDate('created_at', '<=', $request->to);
|
||||
}
|
||||
|
||||
$logs = $query->orderByDesc('created_at')->paginate(50);
|
||||
$users = User::orderBy('name')->get();
|
||||
$modules = ActivityLog::select('module')->distinct()->pluck('module');
|
||||
|
||||
return view('admin.activity-logs.index', compact('logs', 'users', 'modules'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\EmailSetting;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
class EmailSettingsController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$settings = EmailSetting::first() ?? new EmailSetting();
|
||||
return view('admin.email-settings.index', compact('settings'));
|
||||
}
|
||||
|
||||
public function save(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'imap_host' => 'required|string|max:255',
|
||||
'imap_port' => 'required|integer|min:1|max:65535',
|
||||
'imap_encryption' => 'nullable|in:ssl,tls,none',
|
||||
'imap_username' => 'required|string|max:255',
|
||||
'imap_password' => 'nullable|string',
|
||||
'smtp_host' => 'nullable|string|max:255',
|
||||
'smtp_port' => 'nullable|integer|min:1|max:65535',
|
||||
'smtp_encryption' => 'nullable|in:ssl,tls,none',
|
||||
'email_address' => 'required|email',
|
||||
'email_name' => 'nullable|string|max:255',
|
||||
'reply_to' => 'nullable|email',
|
||||
'sync_interval_minutes' => 'nullable|integer|min:1|max:60',
|
||||
'is_active' => 'boolean',
|
||||
]);
|
||||
|
||||
if (!empty($validated['imap_password'])) {
|
||||
$validated['imap_password'] = Crypt::encryptString($validated['imap_password']);
|
||||
} else {
|
||||
unset($validated['imap_password']);
|
||||
}
|
||||
if (!empty($validated['smtp_password'])) {
|
||||
$validated['smtp_password'] = Crypt::encryptString($validated['smtp_password']);
|
||||
} else {
|
||||
unset($validated['smtp_password']);
|
||||
}
|
||||
|
||||
$saved = EmailSetting::updateOrCreate(
|
||||
['id' => $request->id ?? 1],
|
||||
$validated
|
||||
);
|
||||
|
||||
// Verifica che i dati siano stati salvati
|
||||
$verify = EmailSetting::find($saved->id);
|
||||
if ($verify &&
|
||||
$verify->imap_host === $validated['imap_host'] &&
|
||||
$verify->email_address === $validated['email_address']) {
|
||||
return back()->with('success', 'Impostazioni email salvate e verificate nel database.');
|
||||
} else {
|
||||
return back()->with('error', 'Errore nel salvataggio: i dati non sono stati salvati correttamente.');
|
||||
}
|
||||
}
|
||||
|
||||
public function testConnection(Request $request)
|
||||
{
|
||||
$settings = EmailSetting::first();
|
||||
|
||||
if (!$settings) {
|
||||
return response()->json(['success' => false, 'message' => 'Configurazione non trovata.']);
|
||||
}
|
||||
|
||||
// Verifica che i dati siano salvati
|
||||
if (empty($settings->imap_host) || empty($settings->email_address)) {
|
||||
return response()->json(['success' => false, 'message' => 'Prima salva le impostazioni.']);
|
||||
}
|
||||
|
||||
try {
|
||||
$result = $settings->testConnection();
|
||||
return response()->json($result);
|
||||
} catch (\Exception $e) {
|
||||
$msg = $e->getMessage();
|
||||
if (strpos($msg, 'Undefined property') !== false) {
|
||||
$msg = 'Impossibile connettersi al server IMAP. Verifica host, porta, encryption e credenziali.';
|
||||
}
|
||||
return response()->json(['success' => false, 'message' => 'Errore: ' . $msg]);
|
||||
}
|
||||
}
|
||||
|
||||
public function testSmtp(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
]);
|
||||
|
||||
$settings = EmailSetting::first();
|
||||
|
||||
if (!$settings) {
|
||||
return response()->json(['success' => false, 'message' => 'Configurazione non trovata.']);
|
||||
}
|
||||
|
||||
if (empty($settings->smtp_host)) {
|
||||
$settings->smtp_host = 'smtp.gmail.com';
|
||||
$settings->smtp_port = 587;
|
||||
$settings->smtp_encryption = 'tls';
|
||||
}
|
||||
|
||||
try {
|
||||
$smtpUsername = $settings->smtp_username;
|
||||
$smtpPassword = $settings->smtp_password;
|
||||
|
||||
if (empty($smtpUsername)) {
|
||||
$smtpUsername = $settings->email_address;
|
||||
}
|
||||
if (empty($smtpPassword)) {
|
||||
$smtpPassword = $settings->getDecryptedPassword();
|
||||
} else {
|
||||
$smtpPassword = Crypt::decryptString($smtpPassword);
|
||||
}
|
||||
|
||||
$encryption = $settings->smtp_encryption ?? 'tls';
|
||||
$scheme = ($encryption === 'ssl') ? 'smtps' : 'smtp';
|
||||
|
||||
$dsn = sprintf(
|
||||
'%s://%s:%s@%s:%d?encryption=%s',
|
||||
$scheme,
|
||||
rawurlencode($smtpUsername),
|
||||
rawurlencode($smtpPassword),
|
||||
$settings->smtp_host,
|
||||
$settings->smtp_port ?? 587,
|
||||
$encryption
|
||||
);
|
||||
|
||||
$transport = \Symfony\Component\Mailer\Transport::fromDsn($dsn);
|
||||
$mailer = new \Symfony\Component\Mailer\Mailer($transport);
|
||||
|
||||
$fromName = $settings->email_name ?? '';
|
||||
if (filter_var($fromName, FILTER_VALIDATE_EMAIL)) {
|
||||
$fromName = 'Glastree';
|
||||
} else {
|
||||
$fromName = preg_replace('/[^\p{L}\p{N}\s]/u', '', $fromName);
|
||||
$fromName = trim($fromName);
|
||||
if (empty($fromName) || strlen($fromName) > 50) {
|
||||
$fromName = 'Glastree';
|
||||
}
|
||||
}
|
||||
|
||||
$fromAddress = \Symfony\Component\Mime\Address::create($settings->email_address, $fromName);
|
||||
|
||||
$email = (new \Symfony\Component\Mime\Email())
|
||||
->from($fromAddress)
|
||||
->to($request->email)
|
||||
->subject('Test Configurazione SMTP - Glastree')
|
||||
->text('Test email da Glastree - Configurazione SMTP funziona!');
|
||||
|
||||
$mailer->send($email);
|
||||
|
||||
\Illuminate\Support\Facades\Log::info('Test SMTP ok', ['to' => $request->email, 'from' => $settings->email_address]);
|
||||
|
||||
return response()->json(['success' => true, 'message' => 'Email di test inviata a ' . $request->email]);
|
||||
} catch (\Exception $e) {
|
||||
\Illuminate\Support\Facades\Log::error('Test SMTP failed', ['error' => $e->getMessage()]);
|
||||
return response()->json(['success' => false, 'message' => 'Errore invio: ' . $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
public function syncNow()
|
||||
{
|
||||
$settings = EmailSetting::getActive();
|
||||
|
||||
if (!$settings) {
|
||||
return back()->with('error', 'Nessuna configurazione email attiva.');
|
||||
}
|
||||
|
||||
try {
|
||||
app(\App\Http\Controllers\EmailController::class)->syncEmails();
|
||||
$settings->update(['last_sync_at' => now()]);
|
||||
return back()->with('success', 'Sincronizzazione completata.');
|
||||
} catch (\Exception $e) {
|
||||
return back()->with('error', 'Errore sync: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\RolePreset;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class RuoloController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$ruoli = RolePreset::withCount('users')->get();
|
||||
return view('admin.ruoli.index', compact('ruoli'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.ruoli.create');
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:50|unique:role_presets,name',
|
||||
'description' => 'nullable|string|max:255',
|
||||
'permissions' => 'required|array',
|
||||
'permissions.*' => 'in:0,1,2',
|
||||
]);
|
||||
|
||||
$ruolo = RolePreset::create([
|
||||
'name' => $validated['name'],
|
||||
'description' => $validated['description'] ?? null,
|
||||
'permissions' => $validated['permissions'],
|
||||
]);
|
||||
|
||||
ActivityLog::log('create', 'ruoli', 'Creato ruolo: ' . $ruolo->name, [
|
||||
'role_id' => $ruolo->id,
|
||||
'permissions' => $validated['permissions'],
|
||||
]);
|
||||
|
||||
return redirect('/admin/ruoli')->with('success', 'Ruolo creato.');
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$ruolo = RolePreset::findOrFail($id);
|
||||
$usersCount = $ruolo->users()->count();
|
||||
return view('admin.ruoli.edit', compact('ruolo', 'usersCount'));
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$ruolo = RolePreset::findOrFail($id);
|
||||
|
||||
$validated = $request->validate([
|
||||
'description' => 'nullable|string|max:255',
|
||||
'permissions' => 'required|array',
|
||||
'permissions.*' => 'in:0,1,2',
|
||||
]);
|
||||
|
||||
$old = $ruolo->permissions;
|
||||
|
||||
$ruolo->description = $validated['description'];
|
||||
$ruolo->permissions = $validated['permissions'];
|
||||
$ruolo->save();
|
||||
|
||||
ActivityLog::log('update', 'ruoli', 'Modificato ruolo: ' . $ruolo->name, [
|
||||
'role_id' => $ruolo->id,
|
||||
'old_permissions' => $old,
|
||||
'new_permissions' => $validated['permissions'],
|
||||
]);
|
||||
|
||||
if ($request->input('update_users') === '1') {
|
||||
foreach ($ruolo->users as $user) {
|
||||
$user->permissions = $ruolo->permissions;
|
||||
$user->save();
|
||||
}
|
||||
return redirect('/admin/ruoli')->with('success', 'Ruolo aggiornato e permessi propagati a ' . $ruolo->users()->count() . ' utenti.');
|
||||
}
|
||||
|
||||
return redirect('/admin/ruoli')->with('success', 'Ruolo aggiornato.');
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$ruolo = RolePreset::findOrFail($id);
|
||||
|
||||
if ($ruolo->users()->count() > 0) {
|
||||
return redirect('/admin/ruoli')->with('error', 'Impossibile eliminare: ci sono ' . $ruolo->users()->count() . ' utenti con questo ruolo.');
|
||||
}
|
||||
|
||||
$name = $ruolo->name;
|
||||
|
||||
ActivityLog::log('delete', 'ruoli', 'Eliminato ruolo: ' . $name, [
|
||||
'role_id' => $id,
|
||||
'permissions' => $ruolo->permissions,
|
||||
]);
|
||||
|
||||
$ruolo->delete();
|
||||
|
||||
return redirect('/admin/ruoli')->with('success', 'Ruolo eliminato.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\RolePreset;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class UtenteController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$query = User::query();
|
||||
|
||||
if ($request->filled('search')) {
|
||||
$query->where('name', 'like', '%' . $request->search . '%')
|
||||
->orWhere('email', 'like', '%' . $request->search . '%');
|
||||
}
|
||||
|
||||
if ($request->filled('status')) {
|
||||
$query->where('status', $request->status);
|
||||
}
|
||||
|
||||
$utenti = $query->orderBy('name')->paginate(20);
|
||||
$rolePresets = RolePreset::all();
|
||||
|
||||
return view('admin.utenti.index', compact('utenti', 'rolePresets'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$rolePresets = RolePreset::all();
|
||||
return view('admin.utenti.create', compact('rolePresets'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'password' => 'required|min:8|confirmed',
|
||||
'role_preset_id' => 'nullable|exists:role_presets,id',
|
||||
'is_admin' => 'boolean',
|
||||
'permissions' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$user = new User();
|
||||
$user->name = $validated['name'];
|
||||
$user->email = $validated['email'];
|
||||
$user->password = Hash::make($validated['password']);
|
||||
$user->is_admin = $validated['is_admin'] ?? false;
|
||||
$user->status = User::STATUS_ACTIVE;
|
||||
|
||||
if (!empty($validated['role_preset_id'])) {
|
||||
$preset = RolePreset::find($validated['role_preset_id']);
|
||||
$user->applyRolePreset($preset);
|
||||
} elseif (!empty($validated['permissions'])) {
|
||||
$user->setPermissions($validated['permissions']);
|
||||
}
|
||||
|
||||
$user->save();
|
||||
|
||||
ActivityLog::log('create', 'utenti', 'Creato utente: ' . $user->name, [
|
||||
'user_id' => $user->id,
|
||||
'email' => $user->email,
|
||||
]);
|
||||
|
||||
return redirect('/admin/utenti')->with('success', 'Utente creato.');
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$user = User::findOrFail($id);
|
||||
$rolePresets = RolePreset::all();
|
||||
return view('admin.utenti.edit', compact('user', 'rolePresets'));
|
||||
}
|
||||
|
||||
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,
|
||||
'password' => 'nullable|min:8|confirmed',
|
||||
'role_preset_id' => 'nullable|exists:role_presets,id',
|
||||
'is_admin' => 'boolean',
|
||||
'status' => 'required|in:active,suspended,pending',
|
||||
'permissions' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$old = $user->toArray();
|
||||
|
||||
$user->name = $validated['name'];
|
||||
$user->email = $validated['email'];
|
||||
$user->is_admin = $validated['is_admin'] ?? false;
|
||||
$user->status = $validated['status'];
|
||||
|
||||
if (!empty($validated['password'])) {
|
||||
$user->password = Hash::make($validated['password']);
|
||||
}
|
||||
|
||||
if (!empty($validated['role_preset_id'])) {
|
||||
$preset = RolePreset::find($validated['role_preset_id']);
|
||||
$user->applyRolePreset($preset);
|
||||
} elseif (isset($validated['permissions'])) {
|
||||
$user->setPermissions($validated['permissions']);
|
||||
}
|
||||
|
||||
$user->save();
|
||||
|
||||
ActivityLog::log('update', 'utenti', 'Modificato utente: ' . $user->name, [
|
||||
'user_id' => $user->id,
|
||||
'old' => $old,
|
||||
'new' => $user->toArray(),
|
||||
]);
|
||||
|
||||
return redirect('/admin/utenti')->with('success', 'Utente aggiornato.');
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$user = User::findOrFail($id);
|
||||
|
||||
if ($user->id === auth()->id()) {
|
||||
return redirect('/admin/utenti')->with('error', 'Non puoi eliminare te stesso.');
|
||||
}
|
||||
|
||||
if ($user->isSuperAdmin()) {
|
||||
$adminCount = User::where('is_admin', true)->count();
|
||||
if ($adminCount <= 1) {
|
||||
return redirect('/admin/utenti')->with('error', 'Impossibile eliminare l\'ultimo amministratore.');
|
||||
}
|
||||
}
|
||||
|
||||
$userName = $user->name;
|
||||
|
||||
ActivityLog::log('delete', 'utenti', 'Eliminato utente: ' . $userName, [
|
||||
'user_id' => $id,
|
||||
'deleted' => $user->toArray(),
|
||||
]);
|
||||
|
||||
$user->delete();
|
||||
|
||||
return redirect('/admin/utenti')->with('success', 'Utente eliminato.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user