Issues (3)

src/Enrich.php (1 issue)

Labels
Severity
1
<?php
2
3
namespace GetStream\Doctrine;
4
5
use Doctrine\Common\Collections\Criteria;
6
use Doctrine\Common\Collections\Expr\Comparison;
7
use Doctrine\ORM\EntityManagerInterface;
8
9
class Enrich implements EnrichInterface
10
{
11
    /**
12
     * @var array
13
     */
14
    private $enrichingFields = ['actor', 'object'];
15
16
    /**
17
     * @var EntityManagerInterface
18
     */
19
    private $entityManager;
20
21
    /**
22
     * @param EntityManagerInterface $entityManager
23
     */
24 8
    public function __construct(EntityManagerInterface $entityManager)
25
    {
26 8
        $this->entityManager = $entityManager;
27 8
    }
28
29
    /**
30
     * @param array $fields
31
     *
32
     * @return $this
33
     */
34 1
    public function setEnrichingFields(array $fields)
35
    {
36 1
        $this->enrichingFields = $fields;
37
38 1
        return $this;
39
    }
40
41
    /**
42
     * @param array $activities
43
     *
44
     * @return EnrichedActivity[]
45
     */
46 5
    public function enrichActivities(array $activities)
47
    {
48 5
        if (empty($activities)) {
49 1
            return [];
50
        }
51
52 4
        $activities = $this->wrapActivities($activities);
53 4
        $references = $this->collectReferences($activities);
54 4
        $objects = $this->retrieveObjects($references);
55
56 4
        return $this->injectObjects($activities, $objects);
57
    }
58
59
    /**
60
     * @param array $aggregatedActivities
61
     *
62
     * @return EnrichedActivity[]
63
     */
64 2
    public function enrichAggregatedActivities(array $aggregatedActivities)
65
    {
66 2
        if (empty($aggregatedActivities)) {
67 1
            return [];
68
        }
69
70 1
        $allActivities = [];
71
72 1
        foreach ($aggregatedActivities as &$aggregated) {
73 1
            $activities = $this->wrapActivities($aggregated['activities']);
74 1
            $allActivities = array_merge($allActivities, $activities);
75
76 1
            $aggregated['activities'] = $activities;
77
        }
78
79 1
        $references = $this->collectReferences($allActivities);
80 1
        $objects = $this->retrieveObjects($references);
81 1
        $this->injectObjects($allActivities, $objects);
82
83 1
        return $aggregatedActivities;
84
    }
85
86
    /**
87
     * @param array $activities
88
     *
89
     * @return EnrichedActivity[]
90
     */
91
    private function wrapActivities(array $activities)
92
    {
93 5
        return array_map(function (array $activity) {
94 5
            return new EnrichedActivity($activity);
95 5
        }, $activities);
96
    }
97
98
    /**
99
     * @param EnrichedActivity[] $activities
100
     *
101
     * @return array
102
     */
103 5
    private function collectReferences(array $activities)
104
    {
105 5
        $references = [];
106
107 5
        foreach ($activities as $activity) {
108 5
            foreach ($activity as $field => $value) {
109 5
                if ($value === null) {
110 1
                    continue;
111
                }
112
113 5
                if (!in_array($field, $this->enrichingFields)) {
114 3
                    continue;
115
                }
116
117 2
                list($type, $identifier) = explode(':', $value);
118 5
                $references[$type][] = $identifier;
119
            }
120
        }
121
122 5
        return $references;
123
    }
124
125
    /**
126
     * @param array $references
127
     *
128
     * @return array
129
     */
130 5
    private function retrieveObjects(array $references)
131
    {
132 5
        $objects = [];
133
134 5
        foreach (array_keys($references) as $type) {
135 2
            $identifiers = array_unique($references[$type]);
136
137 2
            $result = $this->entityManager
138 2
                ->getRepository($type)
139 2
                ->matching(
140 2
                    Criteria::create()
141 2
                    ->where(new Comparison('id', Comparison::IN, $identifiers))
142
                )->getValues();
143 2
144 1
            $keys = array_map(function ($item) {
145 2
                return $item->id();
146
            }, $result);
147 2
148
            $objects[$type] = array_combine($keys, $result);
149
        }
150 5
151
        return $objects;
152
    }
153
154
    /**
155
     * @param EnrichedActivity[] $activities
156
     * @param array $objects
157
     *
158
     * @return EnrichedActivity[]
159 5
     */
160
    public function injectObjects($activities, $objects)
161 5
    {
162 5
        foreach ($activities as &$activity) {
163 4
            foreach ($this->enrichingFields as $field) {
164 4
                if (!isset($activity[$field])) {
165
                    continue;
166
                }
167 2
168 2
                $value = $activity[$field];
169
                list($type, $identifier) = explode(':', $value);
0 ignored issues
show
It seems like $value can also be of type null; however, parameter $string of explode() 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

169
                list($type, $identifier) = explode(':', /** @scrutinizer ignore-type */ $value);
Loading history...
170 2
171 1
                if (!isset($objects[$type], $objects[$type][$identifier])) {
172 1
                    $activity->trackNotEnrichedField($type, $identifier);
173
                    continue;
174
                }
175 5
176
                $activity[$field] = $objects[$type][$identifier];
177
            }
178
        }
179 5
180
        return $activities;
181
    }
182
}
183