47 lines
1.5 KiB
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(),
|
|
);
|
|
}
|
|
}
|