ldc-arcadia-api/src/Presentation/Api/V1/Http/Controllers/Employees/EmployeesIndexController.php

47 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Presentation\Api\V1\Http\Controllers\Employees;
use Application\Arcadia\Usecase\Employees\FindAll\FindAllEmployees;
use Application\Arcadia\Usecase\Employees\FindAll\Input;
use Presentation\Api\V1\Contracts\ApiResponse;
use Presentation\Api\V1\Http\Requests\Employees\EmployeesIndexRequest;
use Presentation\Api\V1\Http\Responses\Employees\EmployeesIndexResponse;
use Presentation\Api\V1\Presenters\Employees\EmployeesIndexPresenter;
use Shared\DDD\Usecase\Builder\UsecaseBuilder;
use Shared\DDD\Usecase\Builder\UsecaseExecutor;
final readonly class EmployeesIndexController
{
/** @param UsecaseExecutor<\Shared\DDD\Usecase\Input, \Shared\DDD\Usecase\Output> $executor */
public function __construct(
private FindAllEmployees $usecase,
private UsecaseExecutor $executor,
private EmployeesIndexPresenter $presenter,
) {
}
public function __invoke(EmployeesIndexRequest $request): ApiResponse
{
$input = $this->inputFrom($request);
$response = UsecaseBuilder::using($this->executor)
->do($this->usecase)
->from($input)
->with($this->presenter)
->run();
return new EmployeesIndexResponse($response, $request->toUri());
}
private function inputFrom(EmployeesIndexRequest $request): Input
{
return new Input(
pagination: $request->pagination(),
sorter: $request->sorter(),
filter: $request->filter(),
);
}
}