Skip to content
Snippets Groups Projects
NewsMapper.php 4.31 KiB
Newer Older
use App\Model\NewsDetailElement;
use App\Model\NewsFilterVariants;
use App\Model\NewsList;
use App\Model\NewsListingElement;
use App\Model\NewsCategory as NewsCategoryModel;
use App\Model\Pagination;
use App\Requests\CreateNewsRequest;
use App\Requests\EditNewsRequest;
use DateTimeImmutable;
use Symfony\Component\Uid\Uuid;
        Collection $news,
        Collection $newsCategory,
        int $page,
        int $limit,
        int $count
    ): NewsList {
        return new NewsList(
            new Pagination($page, ceil($count / $limit), $limit),
            new Collection(NewsListingElement::class, array_map(
                function (News $newsOne) {
                    return self::mapToListingElement($newsOne);
                }, $news->toArray())
            ),
            new NewsFilterVariants(
                new Collection(NewsCategoryModel::class, array_map(
                    function (NewsCategory $newsCategoryOne) {
                        return self::mapToNewsCategory($newsCategoryOne);
                    }, $newsCategory->toArray())
                )
            )
        );
    }

    public static function mapToListingElement(News $newsOne): NewsListingElement
    {
        return new NewsListingElement(
            $newsOne->getId(),
            $newsOne->getPreviewText(),
            $newsOne->getDetailText(),
            FileMapper::mapToFile($newsOne->getFile()),
            $newsOne->getCreateAt()?->format('d.m.Y'),
            "/{$newsOne->getCode()}/code/"
        );
    }

    public static function mapToDetailElement(News $newsOne): NewsDetailElement
    {
        return new NewsDetailElement(
            $newsOne->getId(),
            $newsOne->getPreviewText(),
            $newsOne->getDetailText(),
            $newsOne->getDetailText(),
            FileMapper::mapToFile($newsOne->getFile()),
            $newsOne->getCreateAt()?->format('d.m.Y'),
            $newsOne->getSeo()?->getTitle(),
            $newsOne->getSeo()?->getDescription(),
            $newsOne->getSeo()?->getKeywords()
    public static function mapToNewsCategory(
        NewsCategory $newsCategory
    ): NewsCategoryModel {
        return new NewsCategoryModel(
            $newsCategory->getId(),
            $newsCategory->getName(),
            $newsCategory->getCode(),
        );
    }

    public static function createNewsEntity(
        CreateNewsRequest|EditNewsRequest $request,
        NewsType $newsType,
        Seo $seo,
        File $file,
        string $id = null
    ): News {
        $news = (new News())
            ->setCode($request->getCode())
            ->setActive($request->isActive())
            ->setCreateAt(new DateTimeImmutable())
            ->setUpdateAt(new DateTimeImmutable())
            ->setSort($request->getSort())
            ->setPreviewImage($request->getPreviewImage())
            ->setDetailImage($request->getDetailImage())
            ->setPreviewText($request->getPreviewText())
            ->setDetailText($request->getDetailText())
            ->setType($newsType)
            ->setMainPageRender($request->isMainPageRender())
            ->setSeo($seo)
            ->setFile($file);

        if ($id !== null) {
            $news->setId(new Uuid($id));
        }

        return $news;
    }

    public static function updateNewsEntity(
        CreateNewsRequest|EditNewsRequest $request,
        NewsType $newsType,
        Seo $seo,
        File $file,
        News $news
    ): News
    {
        $news->setCode($request->getCode());
        $news->setActive($request->isActive());
        $news->setCreateAt($news->getCreateAt());
        $news->setUpdateAt(new DateTimeImmutable());
        $news->setSort($request->getSort());
        $news->setPreviewText($request->getPreviewText());
        $news->setDetailText($request->getDetailText());
        $news->setPreviewImage($request->getPreviewImage());
        $news->setDetailImage($request->getDetailImage());
        $news->setType($newsType);
        $news->setMainPageRender($request->isMainPageRender());
        $news->setSeo($seo);
        $news->setFile($file);

        return $news;
    }