laravel-starter/app/Http/Controllers/todoController.php

102 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\TodoRequest;
use App\Http\Resources\todoResource;
use App\Models\Todo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
class todoController extends Controller
{
/**
* Liste des todos de l'utilisateur connecté.
*/
public function index(Request $request)
{
$perPage = (int) $request->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']);
}
}