Files
dyncoll-dev/backend/app/Http/Traits/ApiResponse.php
Giuseppe Naponiello cc4e174880 auth tests
2026-06-22 14:31:44 +02:00

131 lines
3.9 KiB
PHP

<?php
namespace App\Http\Traits;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* Risposte JSON standardizzate per i controller API.
*
* I messaggi sono presi da config/messages.php. Passando un $prefix si possono
* usare messaggi specifici per risorsa (es. "user_roles.created"); senza prefix
* si usano le chiavi generiche di primo livello.
*/
trait ApiResponse
{
/**
* 200 — Lista paginata: { message, data, meta }.
*/
protected function paginatedCollectionResponse(LengthAwarePaginator $paginator, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.index" : 'messages.index'),
'data' => $paginator->items(),
'meta' => [
'current_page' => $paginator->currentPage(),
'last_page' => $paginator->lastPage(),
'per_page' => $paginator->perPage(),
'total' => $paginator->total(),
],
], 200);
}
/**
* 200 — Collezione di risorse.
*/
protected function collectionResponse(mixed $collection, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.index" : 'messages.index'),
'data' => $collection,
], 200);
}
/**
* 200 — Singola risorsa.
*/
protected function okResponse(mixed $data, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.show" : 'messages.show'),
'data' => $data,
], 200);
}
/**
* 201 — Risorsa creata.
*/
protected function createdResponse(mixed $model, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.created" : 'messages.created'),
'data' => $model,
], 201);
}
/**
* 200 — Risorsa aggiornata.
*/
protected function updatedResponse(mixed $model, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.updated" : 'messages.updated'),
'data' => $model,
], 200);
}
/**
* 200 — Risorsa eliminata.
*/
protected function deletedResponse(?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.deleted" : 'messages.deleted'),
], 200);
}
/**
* 200 — Risorsa ripristinata (soft delete restore).
*/
protected function restoredResponse(mixed $model, ?string $prefix = null): JsonResponse
{
return response()->json([
'message' => config($prefix ? "messages.{$prefix}.restored" : 'messages.restored'),
'data' => $model,
], 200);
}
/**
* 409 — Conflitto: operazione bloccata (es. risorsa in uso).
*/
protected function conflictResponse(string $message): JsonResponse
{
return response()->json([
'message' => $message,
'in_use' => true,
], 409);
}
/**
* Risposta con solo messaggio — chiave config es. "auth.login_success".
*/
protected function messageResponse(string $configKey, int $status = 200): JsonResponse
{
return response()->json([
'message' => config("messages.{$configKey}"),
], $status);
}
/**
* Risposta con messaggio e dati — chiave config es. "auth.login_success".
*/
protected function dataResponse(mixed $data, string $configKey, int $status = 200): JsonResponse
{
return response()->json([
'message' => config("messages.{$configKey}"),
'data' => $data,
], $status);
}
}