139 lines
5.4 KiB
PHP
139 lines
5.4 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace App\Http\Controllers;
|
||
|
|
|
||
|
|
use App\Models\CalendarioConnessione;
|
||
|
|
use App\Services\CalDavService;
|
||
|
|
use App\Services\GoogleCalendarSyncService;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\RedirectResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
|
||
|
|
class CalendarioConnessioneController extends Controller
|
||
|
|
{
|
||
|
|
public function store(Request $request): RedirectResponse
|
||
|
|
{
|
||
|
|
$this->authorizeWrite('settings');
|
||
|
|
|
||
|
|
$data = $request->validate([
|
||
|
|
'nome' => 'required|string|max:255',
|
||
|
|
'tipo' => 'required|in:google_calendar,caldav',
|
||
|
|
'sync_direction' => 'nullable|in:import,export,bidirectional',
|
||
|
|
'sync_interval_minutes' => 'nullable|integer|min:5|max:1440',
|
||
|
|
'is_active' => 'boolean',
|
||
|
|
'config' => 'nullable|array',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$maxOrdine = CalendarioConnessione::max('ordine') ?? 0;
|
||
|
|
|
||
|
|
$connessione = new CalendarioConnessione();
|
||
|
|
$connessione->nome = $data['nome'];
|
||
|
|
$connessione->tipo = $data['tipo'];
|
||
|
|
$connessione->sync_direction = $data['sync_direction'] ?? 'bidirectional';
|
||
|
|
$connessione->sync_interval_minutes = $data['sync_interval_minutes'] ?? 60;
|
||
|
|
$connessione->is_active = $request->boolean('is_active', true);
|
||
|
|
$connessione->stato = 'disconnesso';
|
||
|
|
$connessione->ordine = $maxOrdine + 1;
|
||
|
|
$connessione->encryptAndSetConfig($data['config'] ?? []);
|
||
|
|
$connessione->save();
|
||
|
|
|
||
|
|
return redirect('/impostazioni#calendario')->with('success', 'Connessione calendario "' . $connessione->nome . '" creata.');
|
||
|
|
}
|
||
|
|
|
||
|
|
public function update(Request $request, int $id): RedirectResponse
|
||
|
|
{
|
||
|
|
$this->authorizeWrite('settings');
|
||
|
|
|
||
|
|
$connessione = CalendarioConnessione::findOrFail($id);
|
||
|
|
|
||
|
|
$data = $request->validate([
|
||
|
|
'nome' => 'required|string|max:255',
|
||
|
|
'tipo' => 'required|in:google_calendar,caldav',
|
||
|
|
'sync_direction' => 'nullable|in:import,export,bidirectional',
|
||
|
|
'sync_interval_minutes' => 'nullable|integer|min:5|max:1440',
|
||
|
|
'is_active' => 'boolean',
|
||
|
|
'config' => 'nullable|array',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$connessione->nome = $data['nome'];
|
||
|
|
$connessione->tipo = $data['tipo'];
|
||
|
|
$connessione->sync_direction = $data['sync_direction'] ?? 'bidirectional';
|
||
|
|
$connessione->sync_interval_minutes = $data['sync_interval_minutes'] ?? 60;
|
||
|
|
$connessione->is_active = $request->boolean('is_active', true);
|
||
|
|
|
||
|
|
if (!empty($data['config'])) {
|
||
|
|
$connessione->encryptAndSetConfig($data['config']);
|
||
|
|
}
|
||
|
|
|
||
|
|
$connessione->save();
|
||
|
|
|
||
|
|
return redirect('/impostazioni#calendario')->with('success', 'Connessione calendario "' . $connessione->nome . '" aggiornata.');
|
||
|
|
}
|
||
|
|
|
||
|
|
public function destroy(int $id): JsonResponse
|
||
|
|
{
|
||
|
|
$this->authorizeDelete('settings');
|
||
|
|
$connessione = CalendarioConnessione::findOrFail($id);
|
||
|
|
$connessione->delete();
|
||
|
|
|
||
|
|
return response()->json(['success' => true, 'message' => 'Connessione calendario eliminata.']);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function test(int $id): JsonResponse
|
||
|
|
{
|
||
|
|
$this->authorizeWrite('settings');
|
||
|
|
$connessione = CalendarioConnessione::findOrFail($id);
|
||
|
|
|
||
|
|
$result = match ($connessione->tipo) {
|
||
|
|
'caldav' => app(CalDavService::class)->testConnection($connessione),
|
||
|
|
'google_calendar' => app(GoogleCalendarSyncService::class)->testConnection($connessione),
|
||
|
|
default => ['success' => false, 'message' => 'Tipo sconosciuto'],
|
||
|
|
};
|
||
|
|
|
||
|
|
if ($result['success']) {
|
||
|
|
$connessione->update(['stato' => 'connesso', 'last_error_at' => null, 'last_error_message' => null]);
|
||
|
|
} else {
|
||
|
|
$connessione->update(['stato' => 'errore', 'last_error_at' => now(), 'last_error_message' => $result['message'] ?? 'Errore sconosciuto']);
|
||
|
|
}
|
||
|
|
|
||
|
|
return response()->json($result);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function sync(int $id): RedirectResponse
|
||
|
|
{
|
||
|
|
$this->authorizeWrite('settings');
|
||
|
|
$connessione = CalendarioConnessione::findOrFail($id);
|
||
|
|
|
||
|
|
$result = match ($connessione->tipo) {
|
||
|
|
'caldav' => app(CalDavService::class)->syncEvents($connessione),
|
||
|
|
'google_calendar' => app(GoogleCalendarSyncService::class)->syncEvents($connessione),
|
||
|
|
default => ['success' => false, 'imported' => 0, 'exported' => 0, 'errors' => ['Tipo sconosciuto']],
|
||
|
|
};
|
||
|
|
|
||
|
|
$connessione->update(['last_sync_at' => now()]);
|
||
|
|
|
||
|
|
if ($result['success']) {
|
||
|
|
$msg = 'Sincronizzazione completata: ' . $result['imported'] . ' importati, ' . $result['exported'] . ' esportati.';
|
||
|
|
$connessione->update(['stato' => 'connesso']);
|
||
|
|
return redirect('/impostazioni#calendario')->with('success', $msg);
|
||
|
|
}
|
||
|
|
|
||
|
|
$errorMsg = implode('; ', $result['errors']);
|
||
|
|
$connessione->update(['stato' => 'errore', 'last_error_at' => now(), 'last_error_message' => $errorMsg]);
|
||
|
|
|
||
|
|
return redirect('/impostazioni#calendario')->with('error', 'Errore sync: ' . $errorMsg);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function reorder(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$this->authorizeWrite('settings');
|
||
|
|
$order = $request->input('order', []);
|
||
|
|
foreach ($order as $index => $id) {
|
||
|
|
CalendarioConnessione::where('id', $id)->update(['ordine' => $index]);
|
||
|
|
}
|
||
|
|
return response()->json(['success' => true]);
|
||
|
|
}
|
||
|
|
}
|