diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php new file mode 100644 index 0000000..f096528 --- /dev/null +++ b/app/Http/Controllers/ExportController.php @@ -0,0 +1,76 @@ +findOrFail($userId); + + $lines = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//VotreApp//FR', + ]; + + $now = Carbon::now()->utc()->format('Ymd\THis\Z'); + + foreach ($user->tasks as $task) { + + // On ignore les tâches sans dates + if (!$task->start || !$task->end) { + continue; + } + + $uid = $task->id . '-' . $user->id . '@votreapp.local'; + + $dtstart = Carbon::parse($task->start)->utc()->format('Ymd\THis\Z'); + $dtend = Carbon::parse($task->end)->utc()->format('Ymd\THis\Z'); + + $summary = $this->escapeText($task->name); + + $description = $this->escapeText( + trim( + ($task->description ?? '') . + ($task->event ? "\nÉvénement: {$task->event->name}" : '') + ) + ); + + $location = $this->escapeText($task->location ?? ''); + + $lines[] = 'BEGIN:VEVENT'; + $lines[] = 'UID:' . $uid; + $lines[] = 'DTSTAMP:' . $now; + $lines[] = 'DTSTART:' . $dtstart; + $lines[] = 'DTEND:' . $dtend; + $lines[] = 'SUMMARY:' . $summary; + $lines[] = 'DESCRIPTION:' . $description; + $lines[] = 'LOCATION:' . $location; + $lines[] = 'END:VEVENT'; + } + + $lines[] = 'END:VCALENDAR'; + + $content = implode("\r\n", $lines) . "\r\n"; + + return response($content, 200, [ + 'Content-Type' => 'text/calendar; charset=utf-8', + 'Content-Disposition' => 'attachment; filename="agenda_user_' . $user->id . '.ics"', + ]); + } + + protected function escapeText($text) + { + $text = (string) $text; + + return str_replace( + ["\\", "\r\n", "\n", "\r", ";", ","], + ["\\\\", "\\n", "\\n", "\\n", "\\;", "\\,"], + $text + ); + } +} diff --git a/routes/api.php b/routes/api.php index 81cb83c..704c8b3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,7 +2,9 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\ExportController; +Route::get('/export/ics/{userId}', [ExportController::class, 'exportIcs']); Route::get("/hello", function (Request $request) { return "Hello"; }); diff --git a/routes/users.php b/routes/users.php index e5a4f84..eeb2ac0 100644 --- a/routes/users.php +++ b/routes/users.php @@ -5,7 +5,6 @@ use App\Http\Controllers\UserController; use Illuminate\Support\Facades\Route; - Route::middleware(['web', 'auth:sanctum'])->get('/users/me', [UserController::class, "me"]); Route::middleware(['web', 'auth:sanctum'])->delete('/users', [UserController::class, "delete"]);