Ajout du tp 9 et 10 pour l'actualisation du mini-crm

This commit is contained in:
2026-10-21 15:57:28 +02:00
parent ffe85d5f0d
commit 6c0056944c
7 changed files with 342 additions and 0 deletions
@@ -0,0 +1,108 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\ClientResource;
use App\Models\Client;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class ClientController extends Controller
{
/**
* TP10 - Je liste les clients avec une pagination de 10 éléments.
* J'utilise ClientResource pour contrôler les champs exposés par l'API.
*/
public function index()
{
return ClientResource::collection(Client::paginate(10));
}
/**
* TP9/TP10 - Je crée un client après avoir validé les données reçues.
* L'email est unique dans la migration du projet, donc je vérifie aussi
* cette contrainte ici afin d'obtenir une erreur HTTP 422 propre.
*/
public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'max:255', 'unique:clients,email'],
'phone' => ['nullable', 'string', 'max:20'],
'city' => ['nullable', 'string', 'max:100'],
]);
$client = Client::create($validated);
// 201 = Created : la ressource vient d'être créée.
return (new ClientResource($client))
->response()
->setStatusCode(201);
}
/**
* TP9/TP10 - Grâce au route model binding, Laravel recherche
* automatiquement le Client correspondant à {client}.
* Si l'identifiant n'existe pas, Laravel renvoie une erreur 404.
*/
public function show(Client $client)
{
return new ClientResource($client);
}
/**
* TP10 - PATCH permet de modifier seulement les champs envoyés.
* "sometimes" évite d'obliger l'utilisateur à renvoyer tout le client.
*/
public function update(Request $request, Client $client)
{
$validated = $request->validate([
'name' => ['sometimes', 'required', 'string', 'max:255'],
'email' => [
'sometimes',
'required',
'email',
'max:255',
Rule::unique('clients', 'email')->ignore($client->id),
],
'phone' => ['sometimes', 'nullable', 'string', 'max:20'],
'city' => ['sometimes', 'nullable', 'string', 'max:100'],
]);
$client->update($validated);
return new ClientResource($client);
}
/**
* TP10 - Je supprime le client avec Eloquent.
* Une suppression réussie renvoie 204 No Content.
*/
public function destroy(Client $client)
{
$client->delete();
return response()->noContent();
}
/**
* TP9 - Défi autonome : rechercher un client grâce à son email.
*/
public function search(Request $request)
{
$validated = $request->validate([
'email' => ['required', 'email'],
]);
$client = Client::where('email', $validated['email'])->first();
if (! $client) {
return response()->json([
'message' => 'Aucun client ne correspond à cette adresse email.',
], 404);
}
return new ClientResource($client);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientResource extends JsonResource
{
/**
* TP10 - J'ai créé une Resource pour choisir précisément les données
* du modèle Client que je souhaite exposer dans les réponses JSON.
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'phone' => $this->phone,
'city' => $this->city,
];
}
}