createOrUpdateProductUrls()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 26
rs 9.7666
c 0
b 0
f 0
cc 4
nc 3
nop 2
1
<?php
2
3
/**
4
 * This file is part of the Spryker Commerce OS.
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
declare(strict_types = 1);
9
10
namespace Pyz\Zed\DataImport\Business\Model\ProductAbstract\Writer;
11
12
use Generated\Shared\Transfer\SpyProductAbstractEntityTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...tAbstractEntityTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
use Orm\Zed\Product\Persistence\SpyProductAbstract;
14
use Orm\Zed\Product\Persistence\SpyProductAbstractLocalizedAttributesQuery;
15
use Orm\Zed\Product\Persistence\SpyProductAbstractQuery;
16
use Orm\Zed\ProductCategory\Persistence\SpyProductCategoryQuery;
17
use Orm\Zed\Url\Persistence\SpyUrlQuery;
18
use Propel\Runtime\ActiveQuery\Criteria;
19
use Pyz\Zed\DataImport\Business\Model\Product\Repository\ProductRepository;
20
use Pyz\Zed\DataImport\Business\Model\ProductAbstract\ProductAbstractHydratorStep;
21
use Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface;
22
use Spryker\Zed\DataImport\Business\Model\DataSet\DataSetWriterInterface;
23
use Spryker\Zed\DataImport\Business\Model\Publisher\DataImporterPublisher;
24
use Spryker\Zed\Product\Dependency\ProductEvents;
25
use Spryker\Zed\ProductCategory\Dependency\ProductCategoryEvents;
26
use Spryker\Zed\Url\Dependency\UrlEvents;
27
28
class ProductAbstractPropelDataSetWriter implements DataSetWriterInterface
29
{
30
    /**
31
     * @var \Pyz\Zed\DataImport\Business\Model\Product\Repository\ProductRepository
32
     */
33
    protected $productRepository;
34
35
    /**
36
     * @param \Pyz\Zed\DataImport\Business\Model\Product\Repository\ProductRepository $productRepository
37
     */
38
    public function __construct(ProductRepository $productRepository)
39
    {
40
        $this->productRepository = $productRepository;
41
    }
42
43
    /**
44
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
45
     *
46
     * @return void
47
     */
48
    public function write(DataSetInterface $dataSet): void
49
    {
50
        $productAbstractEntity = $this->createOrUpdateProductAbstract($dataSet);
51
52
        $this->productRepository->addProductAbstract($productAbstractEntity);
53
54
        $this->createOrUpdateProductAbstractLocalizedAbstract($dataSet, $productAbstractEntity->getIdProductAbstract());
55
        $this->createOrUpdateProductCategories($dataSet, $productAbstractEntity->getIdProductAbstract());
56
        $this->createOrUpdateProductUrls($dataSet, $productAbstractEntity->getIdProductAbstract());
57
58
        DataImporterPublisher::addEvent(ProductEvents::PRODUCT_ABSTRACT_PUBLISH, $productAbstractEntity->getIdProductAbstract());
59
    }
60
61
    /**
62
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
63
     *
64
     * @return \Orm\Zed\Product\Persistence\SpyProductAbstract
65
     */
66
    protected function createOrUpdateProductAbstract(DataSetInterface $dataSet): SpyProductAbstract
67
    {
68
        $productAbstractEntityTransfer = $this->getProductAbstractTransfer($dataSet);
69
70
        $productAbstractEntity = SpyProductAbstractQuery::create()
71
            ->filterBySku($productAbstractEntityTransfer->getSku())
72
            ->findOneOrCreate();
73
74
        $productAbstractEntity->fromArray($productAbstractEntityTransfer->modifiedToArray());
75
76
        if ($productAbstractEntity->isNew() || $productAbstractEntity->isModified()) {
77
            $productAbstractEntity->save();
78
79
            DataImporterPublisher::addEvent(ProductEvents::PRODUCT_ABSTRACT_PUBLISH, $productAbstractEntity->getIdProductAbstract());
80
        }
81
82
        return $productAbstractEntity;
83
    }
84
85
    /**
86
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
87
     * @param int $idProductAbstract
88
     *
89
     * @return void
90
     */
91
    protected function createOrUpdateProductAbstractLocalizedAbstract(
92
        DataSetInterface $dataSet,
93
        int $idProductAbstract,
94
    ): void {
95
        $productAbstractLocalizedTransfers = $this->getProductAbstractLocalizedTransfers($dataSet);
96
97
        foreach ($productAbstractLocalizedTransfers as $productAbstractLocalizedArray) {
98
            $productAbstractLocalizedTransfer = $productAbstractLocalizedArray[ProductAbstractHydratorStep::KEY_PRODUCT_ABSTRACT_LOCALIZED_TRANSFER];
99
100
            $idLocale = $productAbstractLocalizedTransfer->getFkLocale();
101
102
            $productAbstractLocalizedAttributesEntity = SpyProductAbstractLocalizedAttributesQuery::create()
103
                ->filterByFkProductAbstract($idProductAbstract)
104
                ->filterByFkLocale($idLocale)
105
                ->findOneOrCreate();
106
107
            $productAbstractLocalizedAttributesEntity->fromArray($productAbstractLocalizedTransfer->modifiedToArray());
108
109
            if (!$productAbstractLocalizedAttributesEntity->isNew() && !$productAbstractLocalizedAttributesEntity->isModified()) {
110
                continue;
111
            }
112
113
            $productAbstractLocalizedAttributesEntity->save();
114
        }
115
    }
116
117
    /**
118
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
119
     * @param int $idProductAbstract
120
     *
121
     * @return void
122
     */
123
    protected function createOrUpdateProductCategories(DataSetInterface $dataSet, int $idProductAbstract): void
124
    {
125
        $productCategoryTransfers = $this->getProductCategoryTransfers($dataSet);
126
127
        foreach ($productCategoryTransfers as $productCategoryArray) {
128
            $productCategoryTransfer = $productCategoryArray[ProductAbstractHydratorStep::KEY_PRODUCT_CATEGORY_TRANSFER];
129
130
            $productCategoryEntity = SpyProductCategoryQuery::create()
131
                ->filterByFkProductAbstract($idProductAbstract)
132
                ->filterByFkCategory($productCategoryTransfer->getFkCategory())
133
                ->findOneOrCreate();
134
135
            $productCategoryEntity->fromArray($productCategoryTransfer->modifiedToArray());
136
137
            if (!$productCategoryEntity->isNew() && !$productCategoryEntity->isModified()) {
138
                continue;
139
            }
140
141
            $productCategoryEntity->save();
142
143
            DataImporterPublisher::addEvent(ProductCategoryEvents::PRODUCT_CATEGORY_PUBLISH, $idProductAbstract);
144
            DataImporterPublisher::addEvent(ProductEvents::PRODUCT_ABSTRACT_PUBLISH, $idProductAbstract);
145
        }
146
    }
147
148
    /**
149
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
150
     * @param int $idProductAbstract
151
     *
152
     * @return void
153
     */
154
    protected function createOrUpdateProductUrls(DataSetInterface $dataSet, int $idProductAbstract): void
155
    {
156
        $productUrlTransfers = $this->getProductUrlTransfers($dataSet);
157
158
        foreach ($productUrlTransfers as $productUrlArray) {
159
            $productUrlTransfer = $productUrlArray[ProductAbstractHydratorStep::KEY_PRODUCT_URL_TRASNFER];
160
161
            $productUrl = $productUrlTransfer->getUrl();
162
            $idLocale = $productUrlTransfer->getFkLocale();
163
164
            $this->cleanupRedirectUrls($productUrl);
165
166
            $urlEntity = SpyUrlQuery::create()
167
                ->filterByFkLocale($idLocale)
168
                ->filterByFkResourceProductAbstract($idProductAbstract)
169
                ->findOneOrCreate();
170
171
            $urlEntity->fromArray($productUrlTransfer->modifiedToArray());
172
173
            if (!$urlEntity->isNew() && !$urlEntity->isModified()) {
174
                continue;
175
            }
176
177
            $urlEntity->save();
178
179
            DataImporterPublisher::addEvent(UrlEvents::URL_PUBLISH, $urlEntity->getIdUrl());
180
        }
181
    }
182
183
    /**
184
     * @param string $abstractProductUrl
185
     *
186
     * @return void
187
     */
188
    protected function cleanupRedirectUrls(string $abstractProductUrl): void
189
    {
190
        SpyUrlQuery::create()
191
            ->filterByUrl($abstractProductUrl)
192
            ->filterByFkResourceRedirect(null, Criteria::ISNOTNULL)
193
            ->delete();
194
    }
195
196
    /**
197
     * @return void
198
     */
199
    public function flush(): void
200
    {
201
        DataImporterPublisher::triggerEvents();
202
    }
203
204
    /**
205
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
206
     *
207
     * @return \Generated\Shared\Transfer\SpyProductAbstractEntityTransfer
208
     */
209
    protected function getProductAbstractTransfer(DataSetInterface $dataSet): SpyProductAbstractEntityTransfer
210
    {
211
        return $dataSet[ProductAbstractHydratorStep::DATA_PRODUCT_ABSTRACT_TRANSFER];
212
    }
213
214
    /**
215
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
216
     *
217
     * @return array<string, mixed>
218
     */
219
    protected function getProductAbstractLocalizedTransfers(DataSetInterface $dataSet): array
220
    {
221
        return $dataSet[ProductAbstractHydratorStep::DATA_PRODUCT_ABSTRACT_LOCALIZED_TRANSFER];
222
    }
223
224
    /**
225
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
226
     *
227
     * @return array<string, mixed>
228
     */
229
    protected function getProductCategoryTransfers(DataSetInterface $dataSet): array
230
    {
231
        return $dataSet[ProductAbstractHydratorStep::DATA_PRODUCT_CATEGORY_TRANSFER];
232
    }
233
234
    /**
235
     * @param \Spryker\Zed\DataImport\Business\Model\DataSet\DataSetInterface $dataSet
236
     *
237
     * @return array<string, mixed>
238
     */
239
    protected function getProductUrlTransfers(DataSetInterface $dataSet): array
240
    {
241
        return $dataSet[ProductAbstractHydratorStep::DATA_PRODUCT_URL_TRANSFER];
242
    }
243
}
244