. */ namespace SP\Domain\Account\Services; use SP\Core\Application; use SP\Domain\Account\Dtos\FileDto; use SP\Domain\Account\Models\File as FileModel; use SP\Domain\Account\Ports\AccountFileRepository; use SP\Domain\Account\Ports\AccountFileService; use SP\Domain\Common\Services\Service; use SP\Domain\Common\Services\ServiceException; use SP\Domain\Core\Dtos\ItemSearchDto; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\InvalidImageException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Core\Exceptions\SPException; use SP\Domain\Image\Ports\ImageService; use SP\Infrastructure\Common\Repositories\NoSuchItemException; use SP\Infrastructure\Database\QueryResult; use SP\Infrastructure\File\FileSystem; use function SP\__u; /** * Class AccountFile */ final class AccountFile extends Service implements AccountFileService { public function __construct( Application $application, private readonly AccountFileRepository $accountFileRepository, private readonly ImageService $imageUtil ) { parent::__construct($application); } /** * Creates an item * * @param FileModel $file * * @return int * @throws ConstraintException * @throws InvalidImageException * @throws QueryException */ public function create(FileModel $file): int { if (FileSystem::isImage($file->getType())) { $file->setThumb($this->imageUtil->createThumbnail($file->getContent())); } else { $file->setThumb('no_thumb'); } return $this->accountFileRepository->create($file); } /** * @inheritDoc * @throws NoSuchItemException * @throws SPException */ public function getById(int $id): FileDto { $data = $this->accountFileRepository->getById($id); if ($data->getNumRows() === 0) { throw new NoSuchItemException(__u('File not found')); } return FileDto::fromResult($data, FileModel::class); } /** * Deletes all the items for given ids * * @param int[] $ids * * @return int * @throws ConstraintException * @throws QueryException * @throws ServiceException */ public function deleteByIdBatch(array $ids): int { $count = $this->accountFileRepository->deleteByIdBatch($ids); if ($count !== count($ids)) { throw new ServiceException( __u('Error while deleting the files'), SPException::WARNING ); } return $count; } /** * Deletes an item * * @param int $id * * @return AccountFileService * @throws ConstraintException * @throws QueryException * @throws NoSuchItemException */ public function delete(int $id): AccountFileService { if (!$this->accountFileRepository->delete($id)) { throw new NoSuchItemException(__u('File not found')); } return $this; } /** * Searches for items by a given filter * * @param ItemSearchDto $searchData * * @return QueryResult */ public function search(ItemSearchDto $searchData): QueryResult { return $this->accountFileRepository->search($searchData); } /** * Returns the item for given id * * @param int $id * @return FileModel[] * @throws ConstraintException * @throws QueryException * @throws SPException */ public function getByAccountId(int $id): array { return $this->accountFileRepository->getByAccountId($id)->getDataAsArray(); } }