Ajout du tp 9 et 10 pour l'actualisation du mini-crm
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user