131 lines
3.9 KiB
PHP
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);
|
|
}
|
|
}
|