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 syncAll(): JsonResponse { $this->authorizeWrite('settings'); $connections = CalendarioConnessione::where('is_active', true)->get(); $results = []; foreach ($connections as $connessione) { $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']) { $connessione->update(['stato' => 'connesso']); } else { $errorMsg = implode('; ', $result['errors']); $connessione->update(['stato' => 'errore', 'last_error_at' => now(), 'last_error_message' => $errorMsg]); } $results[] = [ 'id' => $connessione->id, 'nome' => $connessione->nome, 'success' => $result['success'], 'imported' => $result['imported'], 'exported' => $result['exported'], 'errors' => $result['errors'], ]; } $totalImported = array_sum(array_column($results, 'imported')); $totalExported = array_sum(array_column($results, 'exported')); $hasErrors = in_array(false, array_column($results, 'success'), true); return response()->json([ 'success' => !$hasErrors, 'results' => $results, 'total_imported' => $totalImported, 'total_exported' => $totalExported, 'connections' => count($results), ]); } 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]); } }