Files
BUT2/mini-crm/mini-crm_TP9_TP10/app/Http/Controllers/Api/ClientController.php
T

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);
}
}