namespace App\Http\Controller\Pet;
use apivalk\apivalk\Http\Controller\AbstractApivalkController;
use apivalk\apivalk\Http\Request\ApivalkRequestInterface;
use apivalk\apivalk\Http\Response\AbstractApivalkResponse;
use apivalk\apivalk\Router\Route\Route;
use apivalk\apivalk\Http\Method\GetMethod;
use App\Http\Request\Pet\GetPetRequest;
use App\Http\Response\Pet\GetPetResponse;
use App\Http\Response\Common\NotFoundResponse;
class GetPetController extends AbstractApivalkController
{
public static function getRoute(): Route
{
return new Route('/pet/{id}', new GetMethod());
}
public static function getRequestClass(): string
{
return GetPetRequest::class;
}
public static function getResponseClasses(): array
{
return [
GetPetResponse::class,
NotFoundResponse::class,
];
}
public function __invoke(ApivalkRequestInterface $request): AbstractApivalkResponse
{
// $request is already populated and validated!
$id = $request->path()->id;
// Access populated sorting. SortBag is iterable — iterate directly.
// The bag is always populated: if the user does not provide order_by,
// it contains the default sorting from the route. Iteration order is
// user-requested sorts first (in submission order), then route defaults
// as tiebreakers — perfect for building an ORDER BY clause.
foreach ($request->sorting() as $field => $sort) {
$direction = $sort->isAsc() ? 'ASC' : 'DESC';
}
// Or directly access a specific field via the magic getter. If the user
// did not pass order_by for status, this returns the route's default Sort.
// Use $sort->isRequested() to discriminate user intent from defaults.
$isAsc = $request->sorting()->status->isAsc();
$pet = $this->petRepository->find($id);
if (!$pet) {
return new NotFoundResponse('Pet not found');
}
return new GetPetResponse($pet);
}
}