query('per_page', 15); $perPage = max(1, min($perPage, 100)); $todos = $request->user() ->todos() ->latest() ->paginate($perPage) ->withQueryString(); return todoResource::collection($todos); } /** * Création d'un nouveau todo avec image optionnelle. */ public function store(TodoRequest $request) { $data = $request->validated(); if ($request->hasFile('image')) { // On stocke dans le dossier 'todos' du disque 'public' // $path contiendra par ex: "todos/nom_du_fichier.jpg" $path = $request->file('image')->store('todos', 'public'); $data['image_url'] = $path; } $todo = $request->user()->todos()->create($data); return new todoResource($todo); } /** * Mise à jour du todo (texte, statut ou image). */ public function update(TodoRequest $request, Todo $todo) { Gate::authorize('update', $todo); $data = $request->validated(); if ($request->hasFile('image')) { // 1. Supprimer l'ancienne image si elle existe if ($todo->image_url) { Storage::disk('public')->delete($todo->image_url); } // 2. Stocker la nouvelle image $path = $request->file('image')->store('todos', 'public'); $data['image_url'] = $path; } $todo->update($data); return new todoResource($todo); } /** * Affichage d'un todo précis. */ public function show(Todo $todo) { Gate::authorize('view', $todo); return new todoResource($todo); } /** * Suppression d'un todo et de son image associée. */ public function destroy(Todo $todo) { Gate::authorize('delete', $todo); // Nettoyage : supprimer l'image du serveur avant de supprimer le record if ($todo->image_url) { Storage::disk('public')->delete($todo->image_url); } $todo->delete(); return response()->json(['message' => 'Todo supprimé avec succès']); } }