109 lines
3.2 KiB
PHP
109 lines
3.2 KiB
PHP
<?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);
|
|
}
|
|
}
|