PageImporter::import()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 39
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 25
nc 3
nop 1
dl 0
loc 39
rs 9.52
c 0
b 0
f 0
1
<?php
2
3
/*
4
 * This file was created by developers working at BitBag
5
 * Do you need more information about us and what we do? Visit our https://bitbag.io website!
6
 * We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
7
*/
8
9
declare(strict_types=1);
10
11
namespace BitBag\SyliusCmsPlugin\Importer;
12
13
use BitBag\SyliusCmsPlugin\Downloader\ImageDownloaderInterface;
14
use BitBag\SyliusCmsPlugin\Entity\MediaInterface;
15
use BitBag\SyliusCmsPlugin\Entity\PageInterface;
16
use BitBag\SyliusCmsPlugin\Entity\PageTranslationInterface;
17
use BitBag\SyliusCmsPlugin\Resolver\ImporterChannelsResolverInterface;
18
use BitBag\SyliusCmsPlugin\Resolver\ImporterProductsResolverInterface;
19
use BitBag\SyliusCmsPlugin\Resolver\ImporterSectionsResolverInterface;
20
use BitBag\SyliusCmsPlugin\Resolver\MediaProviderResolverInterface;
21
use BitBag\SyliusCmsPlugin\Resolver\ResourceResolverInterface;
22
use Doctrine\ORM\EntityManagerInterface;
23
use Sylius\Component\Locale\Context\LocaleContextInterface;
24
use Sylius\Component\Resource\Factory\FactoryInterface;
25
use Symfony\Component\HttpFoundation\File\File;
26
use Symfony\Component\Validator\Validator\ValidatorInterface;
27
use Webmozart\Assert\Assert;
28
29
final class PageImporter extends AbstractImporter implements PageImporterInterface
30
{
31
    /** @var ResourceResolverInterface */
32
    private $pageResourceResolver;
33
34
    /** @var ResourceResolverInterface */
35
    private $sectionResolver;
36
37
    /** @var LocaleContextInterface */
38
    private $localeContext;
39
40
    /** @var ImageDownloaderInterface */
41
    private $imageDownloader;
42
43
    /** @var FactoryInterface */
44
    private $mediaFactory;
45
46
    /** @var MediaProviderResolverInterface */
47
    private $mediaProviderResolver;
48
49
    /** @var ImporterSectionsResolverInterface */
50
    private $importerSectionsResolver;
51
52
    /** @var ImporterChannelsResolverInterface */
53
    private $importerChannelsResolver;
54
55
    /** @var ImporterProductsResolverInterface */
56
    private $importerProductsResolver;
57
58
    /** @var EntityManagerInterface */
59
    private $entityManager;
60
61
    public function __construct(
62
        ResourceResolverInterface $pageResourceResolver,
63
        ResourceResolverInterface $sectionResolver,
64
        LocaleContextInterface $localeContext,
65
        ImageDownloaderInterface $imageDownloader,
66
        FactoryInterface $mediaFactory,
67
        MediaProviderResolverInterface $mediaProviderResolver,
68
        ImporterSectionsResolverInterface $importerSectionsResolver,
69
        ImporterChannelsResolverInterface $importerChannelsResolver,
70
        ImporterProductsResolverInterface $importerProductsResolver,
71
        ValidatorInterface $validator,
72
        EntityManagerInterface $entityManager
73
    ) {
74
        parent::__construct($validator);
75
76
        $this->pageResourceResolver = $pageResourceResolver;
77
        $this->sectionResolver = $sectionResolver;
78
        $this->localeContext = $localeContext;
79
        $this->imageDownloader = $imageDownloader;
80
        $this->mediaFactory = $mediaFactory;
81
        $this->mediaProviderResolver = $mediaProviderResolver;
82
        $this->importerSectionsResolver = $importerSectionsResolver;
83
        $this->importerChannelsResolver = $importerChannelsResolver;
84
        $this->importerProductsResolver = $importerProductsResolver;
85
        $this->entityManager = $entityManager;
86
    }
87
88
    public function import(array $row): void
89
    {
90
        /** @var string|null $code */
91
        $code = $this->getColumnValue(self::CODE_COLUMN, $row);
92
        Assert::notNull($code);
93
94
        /** @var PageInterface $page */
95
        $page = $this->pageResourceResolver->getResource($code);
0 ignored issues
show
Bug introduced by
It seems like $code can also be of type null; however, parameter $identifier of BitBag\SyliusCmsPlugin\R...nterface::getResource() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

95
        $page = $this->pageResourceResolver->getResource(/** @scrutinizer ignore-type */ $code);
Loading history...
96
97
        $page->setCode($code);
98
        $page->setFallbackLocale($this->localeContext->getLocaleCode());
99
100
        foreach ($this->getAvailableLocales($this->getTranslatableColumns(), array_keys($row)) as $locale) {
101
            $page->setCurrentLocale($locale);
102
            $page->setSlug($this->getTranslatableColumnValue(self::SLUG_COLUMN, $locale, $row));
103
            $page->setName($this->getTranslatableColumnValue(self::NAME_COLUMN, $locale, $row));
104
            $page->setMetaKeywords($this->getTranslatableColumnValue(self::META_KEYWORDS_COLUMN, $locale, $row));
105
            $page->setMetaDescription($this->getTranslatableColumnValue(self::META_DESCRIPTION_COLUMN, $locale, $row));
106
            $page->setContent($this->getTranslatableColumnValue(self::CONTENT_COLUMN, $locale, $row));
107
            $page->setBreadcrumb($this->getTranslatableColumnValue(self::BREADCRUMB_COLUMN, $locale, $row));
108
            $page->setNameWhenLinked($this->getTranslatableColumnValue(self::NAME_WHEN_LINKED_COLUMN, $locale, $row));
109
            $page->setDescriptionWhenLinked($this->getTranslatableColumnValue(self::DESCRIPTION_WHEN_LINKED_COLUMN, $locale, $row));
110
111
            $url = $this->getTranslatableColumnValue(self::IMAGE_COLUMN, $locale, $row);
112
            $imageCode = $this->getTranslatableColumnValue(self::IMAGE_CODE_COLUMN, $locale, $row);
113
114
            if (null !== $url) {
115
                $this->resolveImage($page, $url ?? '', $locale, $imageCode);
0 ignored issues
show
Bug introduced by
It seems like $imageCode can also be of type null; however, parameter $imageCode of BitBag\SyliusCmsPlugin\I...mporter::resolveImage() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

115
                $this->resolveImage($page, $url ?? '', $locale, /** @scrutinizer ignore-type */ $imageCode);
Loading history...
116
            }
117
        }
118
119
        $this->importerSectionsResolver->resolve($page, $this->getColumnValue(self::SECTIONS_COLUMN, $row));
120
        $this->importerChannelsResolver->resolve($page, $this->getColumnValue(self::CHANNELS_COLUMN, $row));
121
        $this->importerProductsResolver->resolve($page, $this->getColumnValue(self::PRODUCTS_COLUMN, $row));
122
123
        $this->validateResource($page, ['bitbag']);
124
125
        $this->entityManager->persist($page);
126
        $this->entityManager->flush();
127
    }
128
129
    public function getResourceCode(): string
130
    {
131
        return 'page';
132
    }
133
134
    private function resolveImage(
135
        PageInterface $page,
136
        string $url,
137
        string $locale,
138
        string $imageCode
139
    ): void {
140
        $downloadedImage = $this->imageDownloader->download($url);
141
142
        /** @var MediaInterface $image */
143
        $image = $this->mediaFactory->createNew();
144
        $image->setFile($downloadedImage);
145
        $image->setType($this->getFileType($downloadedImage));
146
        $image->setCode($imageCode);
147
148
        /** @var PageTranslationInterface $pageTranslation */
149
        $pageTranslation = $page->getTranslation($locale);
150
        $pageTranslation->setImage($image);
151
152
        $this->mediaProviderResolver->resolveProvider($image)->upload($image);
153
        $this->entityManager->persist($image);
154
    }
155
156
    private function getFileType(File $file): string
157
    {
158
        switch ($file->getExtension()) {
159
            case 'png':
160
            case 'jpg':
161
            case 'jpeg':
162
            case 'gif':
163
                return MediaInterface::IMAGE_TYPE;
164
            case 'mp4':
165
                return MediaInterface::VIDEO_TYPE;
166
        }
167
168
        return MediaInterface::FILE_TYPE;
169
    }
170
171
    private function getTranslatableColumns(): array
172
    {
173
        return [
174
            self::SLUG_COLUMN,
175
            self::NAME_COLUMN,
176
            self::IMAGE_COLUMN,
177
            self::IMAGE_CODE_COLUMN,
178
            self::META_KEYWORDS_COLUMN,
179
            self::META_DESCRIPTION_COLUMN,
180
            self::CONTENT_COLUMN,
181
            self::BREADCRUMB_COLUMN,
182
            self::NAME_WHEN_LINKED_COLUMN,
183
            self::DESCRIPTION_WHEN_LINKED_COLUMN,
184
        ];
185
    }
186
}
187