MediaGroupToUpdate::hasChanges()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Backend\Modules\MediaLibraryImporter\Component;
4
5
use Backend\Modules\MediaLibrary\Domain\MediaGroup\MediaGroup;
6
use Backend\Modules\MediaLibrary\Domain\MediaGroupMediaItem\MediaGroupMediaItem;
7
use Backend\Modules\MediaLibrary\Domain\MediaItem\MediaItem;
8
use Backend\Modules\MediaLibraryImporter\Domain\MediaItemImport\MediaItemImport;
9
use Doctrine\Common\Collections\Collection;
10
11
final class MediaGroupToUpdate
12
{
13
    /** @var MediaGroup */
14
    protected $mediaGroup;
15
16
    /** @var array */
17
    protected $connectedItems = [];
18
19
    /** @var bool */
20
    protected $hasChanges = false;
21
22
    public function __construct(MediaGroup $mediaGroup)
23
    {
24
        $this->mediaGroup = $mediaGroup;
25
    }
26
27
    public function addMediaItemImport(MediaItemImport $mediaItemImport): void
28
    {
29
        // Stop here, because no MediaItem found
30
        if ($mediaItemImport->getMediaItem() === null) {
31
            return;
32
        }
33
34
        $this->addConnectedItem($mediaItemImport->getSequence(), $mediaItemImport->getMediaItem());
35
        if ($this->hasChangesInMediaItemImport($mediaItemImport)) {
36
            $this->hasChanges = true;
37
        }
38
    }
39
40
    private function addConnectedItem(int $sequence, MediaItem $mediaItem): void
41
    {
42
        $this->connectedItems[$sequence] = $mediaItem;
43
    }
44
45
    public function getConnectedItems(): array
46
    {
47
        $connectedItems = $this->connectedItems;
48
49
        // We sort the keys, so the sequence is correct
50
        ksort($connectedItems);
51
52
        // We return a new array, so we have a sequence with no gaps in between
53
        return array_values($connectedItems);
54
    }
55
56
    public function getMediaGroup(): MediaGroup
57
    {
58
        return $this->mediaGroup;
59
    }
60
61
    public function hasChanges(): bool
62
    {
63
        return $this->hasChanges;
64
    }
65
66
    private function hasChangesInMediaItemImport(MediaItemImport $mediaItemImport): bool
67
    {
68
        if ($mediaItemImport->getMediaItem() === null) {
69
            return false;
70
        }
71
72
        // When imported, we do have changes
73
        if ($mediaItemImport->getStatus()->isImported()) {
74
            return true;
75
        }
76
77
        // When status == "existing", we must check other other variables
78
        return ($mediaItemImport->getStatus()->isExisting()
79
            && $this->hasChangesInConnectedItems($this->mediaGroup->getConnectedItems(), $mediaItemImport)
80
        );
81
    }
82
83
    /**
84
     * Has changed connected items check for possible changes
85
     *
86
     * @param Collection $connectedItems
87
     * @param MediaItemImport $mediaItemImport
88
     * @return bool
89
     */
90
    private function hasChangesInConnectedItems(
91
        Collection $connectedItems,
92
        MediaItemImport $mediaItemImport
93
    ): bool {
94
        $arrayWithChanges = $connectedItems->filter(function (MediaGroupMediaItem $connectedItem) use ($mediaItemImport) {
95
            // Stop here, because ID is not equal
96
            if ($connectedItem->getItem()->getId() !== $mediaItemImport->getMediaItem()->getId()) {
97
                return false;
98
            }
99
100
            // Stop here, because sequence equals
101
            if ($connectedItem->getSequence() === $mediaItemImport->getSequence()) {
102
                return false;
103
            }
104
105
            return true;
106
        });
107
108
        return !empty($arrayWithChanges);
109
    }
110
}
111