Passed
Push — master ( 4bad79...63fb8a )
by Jeroen
03:20
created

MediaGroupToUpdate::addMediaItemImport()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
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
    /**
23
     * @param MediaGroup $mediaGroup
24
     */
25
    public function __construct(MediaGroup $mediaGroup)
26
    {
27
        $this->mediaGroup = $mediaGroup;
28
    }
29
30
    /**
31
     * @param MediaItemImport $mediaItemImport
32
     */
33
    public function addMediaItemImport(MediaItemImport $mediaItemImport)
34
    {
35
        $this->addConnectedItem($mediaItemImport->getSequence(), $mediaItemImport->getMediaItem());
0 ignored issues
show
Bug introduced by
It seems like $mediaItemImport->getMediaItem() can be null; however, addConnectedItem() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
36
        $this->checkForChanges($mediaItemImport);
37
    }
38
39
    /**
40
     * @param int $sequence
41
     * @param MediaItem $mediaItem
42
     */
43
    private function addConnectedItem(int $sequence, MediaItem $mediaItem)
44
    {
45
        $this->connectedItems[$sequence] = $mediaItem;
46
    }
47
48
    /**
49
     * @param MediaItemImport $mediaItemImport
50
     */
51
    private function checkForChanges(MediaItemImport $mediaItemImport)
52
    {
53
        if ($mediaItemImport->getMediaItem() === null) {
54
            return;
55
        }
56
57
        // When imported, we do have changes
58
        if ($mediaItemImport->getStatus()->isImported()) {
59
            $this->hasChanges = true;
60
61
            return;
62
        }
63
64
        // When status == "existing", we must check other other variables
65
        if ($mediaItemImport->getStatus()->isExisting()
66
            && $this->hasChangedConnectedItems($this->mediaGroup->getConnectedItems(), $mediaItemImport)
67
        ) {
68
            $this->hasChanges = true;
69
        }
70
    }
71
72
    /**
73
     * @return array
74
     */
75
    public function getConnectedItems(): array
76
    {
77
        $connectedItems = $this->connectedItems;
78
79
        // We sort the keys, so the sequence is correct
80
        ksort($connectedItems);
81
82
        // We return a new array, so we have a sequence with no gaps in between
83
        return array_values($connectedItems);
84
    }
85
86
    /**
87
     * @return MediaGroup
88
     */
89
    public function getMediaGroup(): MediaGroup
90
    {
91
        return $this->mediaGroup;
92
    }
93
94
    /**
95
     * @return bool
96
     */
97
    public function hasChanges(): bool
98
    {
99
        return $this->hasChanges;
100
    }
101
102
    /**
103
     * Has changed connected items check for possible changes
104
     *
105
     * @param Collection $connectedItems
106
     * @param MediaItemImport $mediaItemImport
107
     * @return bool
108
     */
109
    private function hasChangedConnectedItems(
110
        Collection $connectedItems,
111
        MediaItemImport $mediaItemImport
112
    ): bool {
113
        $arrayWithChanges = $connectedItems->filter(function (MediaGroupMediaItem $connectedItem) use ($mediaItemImport) {
114
            // Stop here, because ID is not equal
115
            if ($connectedItem->getItem()->getId() !== $mediaItemImport->getMediaItem()->getId()) {
116
                return false;
117
            }
118
119
            // Stop here, because sequence equals
120
            if ($connectedItem->getSequence() === $mediaItemImport->getSequence()) {
121
                return false;
122
            }
123
124
            return true;
125
        });
126
127
        return !empty($arrayWithChanges);
128
    }
129
}
130