*/ final readonly class SearchIncoSheets implements Usecase { public function __construct( private IncoSheetDirectory $directory, private IncoShortSheetDirectory $shortDirectory, ) { } #[\Override] public function execute(BaseInput $input): Output { Assert::isInstanceOf($input, Input::class); $pagination = $input->pagination ?? Pagination::firstPage(); if ($input->short) { $shortPage = $this->shortDirectory->search( $input->query, $pagination, ...$input->brands ); return $this->toShortOutput($shortPage); } $page = $this->directory->search( $input->query, $pagination, ...$input->brands ); return $this->toFullOutput($page); } /** * @param Paginated $resultPage */ private function toFullOutput(Paginated $resultPage): Output { $pagination = $resultPage->getPagination(); $items = array_map( static fn (IncoSheet $sheet) => PaginatedIncoSheet::fromDomain($sheet), $resultPage->getItems() ); return new Output( incoSheets: $items, total: $resultPage->getTotal(), page: $pagination->pageNumber(), perPage: $pagination->pageSize(), ); } /** * @param Paginated $resultPage */ private function toShortOutput(Paginated $resultPage): Output { $pagination = $resultPage->getPagination(); $items = array_map( static fn (IncoShortSheet $sheet) => PaginatedShortIncoSheet::fromDomain($sheet), $resultPage->getItems() ); return new Output( incoSheets: $items, total: $resultPage->getTotal(), page: $pagination->pageNumber(), perPage: $pagination->pageSize(), ); } }