102 lines
2.5 KiB
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']);
|
|
}
|
|
}
|