Completed
Push — master ( 4c9015...28a52a )
by Julito
09:31
created

AbstractResource::getParentResourceNode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Entity;
6
7
use ApiPlatform\Core\Annotation\ApiProperty;
8
use ApiPlatform\Core\Annotation\ApiSubresource;
9
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
10
use Chamilo\CourseBundle\Entity\CGroup;
11
use Doctrine\Common\Collections\Criteria;
12
use Doctrine\ORM\Mapping as ORM;
13
use Symfony\Component\Serializer\Annotation\Groups;
14
use Symfony\Component\Validator\Constraints as Assert;
15
16
/**
17
 * @ORM\MappedSuperclass
18
 * @ORM\HasLifecycleCallbacks
19
 * @ORM\EntityListeners({"Chamilo\CoreBundle\Entity\Listener\ResourceListener"})
20
 */
21
abstract class AbstractResource
22
{
23
    /**
24
     * @var string|null
25
     *
26
     * @ApiProperty(iri="http://schema.org/contentUrl")
27
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read"})
28
     */
29
    public $contentUrl;
30
31
    /**
32
     * @var string|null
33
     *
34
     * @ApiProperty(iri="http://schema.org/contentUrl")
35
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read"})
36
     */
37
    public $downloadUrl;
38
39
    /**
40
     * @var string|null
41
     *
42
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "document:write", "media_object_read"})
43
     */
44
    public $contentFile;
45
46
    /**
47
     * @Assert\Valid()
48
     * @ApiSubresource()
49
     * @Groups({"resource_node:read", "resource_node:write", "document:write" })
50
     * @ORM\OneToOne(
51
     *     targetEntity="Chamilo\CoreBundle\Entity\ResourceNode",
52
     *     cascade={"persist", "remove"},
53
     *     orphanRemoval=true
54
     * )
55
     * @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="CASCADE")
56
     */
57
    public $resourceNode;
58
59
    /**
60
     * @Groups({"resource_node:read", "resource_node:write", "document:read", "document:write"})
61
     */
62
    public $parentResourceNode;
63
64
    /**
65
     * @ApiProperty(iri="http://schema.org/image")
66
     */
67
    public $uploadFile;
68
69
    /**
70
     * @Groups({"resource_node:read", "document:read"})
71
     */
72
    public $resourceLinkList;
73
74
    /**
75
     * @var ResourceLink[]
76
     */
77
    public $linkEntityList;
78
79
    /** @var AbstractResource */
80
    public $parentResource;
81
82
    abstract public function getResourceName(): string;
83
84
    abstract public function setResourceName(string $name);
85
86
    public function addLink(ResourceLink $link)
87
    {
88
        $this->linkEntityList[] = $link;
89
90
        return $this;
91
    }
92
93
    public function addCourseLink(Course $course, Session $session = null, CGroup $group = null, int $visibility = ResourceLink::VISIBILITY_PUBLISHED)
94
    {
95
        if (null === $this->getParent()) {
96
            throw new \Exception('addCourseLink requires to set the parent.');
97
        }
98
99
        $resourceLink = new ResourceLink();
100
        $resourceLink
101
            ->setVisibility($visibility)
102
            ->setCourse($course)
103
            ->setSession($session)
104
            ->setGroup($group)
105
        ;
106
        $this->addLink($resourceLink);
107
108
        $rights = [];
109
        switch ($visibility) {
110
            case ResourceLink::VISIBILITY_PENDING:
111
            case ResourceLink::VISIBILITY_DRAFT:
112
                $editorMask = ResourceNodeVoter::getEditorMask();
113
                $resourceRight = new ResourceRight();
114
                $resourceRight
115
                    ->setMask($editorMask)
116
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
117
                ;
118
                $rights[] = $resourceRight;
119
120
                break;
121
        }
122
123
        if (!empty($rights)) {
124
            foreach ($rights as $right) {
125
                $resourceLink->addResourceRight($right);
126
            }
127
        }
128
129
        return $this;
130
    }
131
132
    public function addGroupLink(Course $course, Session $session = null, CGroup $group = null)
133
    {
134
        $resourceNode = $this->getResourceNode();
135
        $exists = $resourceNode->getResourceLinks()->exists(
136
            function ($key, $element) use ($group) {
137
                if ($element->getGroup()) {
138
                    return $group->getIid() == $element->getGroup()->getIid();
0 ignored issues
show
Bug introduced by
The method getIid() does not exist on null. ( Ignorable by Annotation )

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

138
                    return $group->/** @scrutinizer ignore-call */ getIid() == $element->getGroup()->getIid();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
139
                }
140
            }
141
        );
142
143
        if (false === $exists) {
144
            $resourceLink = new ResourceLink();
145
            $resourceLink
146
                ->setResourceNode($resourceNode)
147
                ->setCourse($course)
148
                ->setSession($session)
149
                ->setGroup($group)
150
                ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED)
151
            ;
152
            $this->addLink($resourceLink);
153
        }
154
155
        return $this;
156
    }
157
158
    public function addUserLink(User $user, Course $course = null, Session $session = null, CGroup $group = null)
159
    {
160
        $resourceLink = new ResourceLink();
161
        $resourceLink
162
            ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED)
163
            ->setUser($user)
164
            ->setCourse($course)
165
            ->setSession($session)
166
            ->setGroup($group)
167
        ;
168
169
        $this->addLink($resourceLink);
170
171
        return $this;
172
    }
173
174
    public function setParent(AbstractResource $parent)
175
    {
176
        $this->parentResource = $parent;
177
178
        return $this;
179
    }
180
181
    public function getParent()
182
    {
183
        return $this->parentResource;
184
    }
185
186
    /**
187
     * @param array $userList User id list
188
     */
189
    public function addResourceToUserList(
190
        array $userList,
191
        Course $course = null,
192
        Session $session = null,
193
        CGroup $group = null
194
    ) {
195
        if (!empty($userList)) {
196
            foreach ($userList as $user) {
197
                $this->addUserLink($user, $course, $session, $group);
198
            }
199
        }
200
201
        return $this;
202
    }
203
204
    public function getLinks()
205
    {
206
        return $this->linkEntityList;
207
    }
208
209
    public function addResourceLink($link)
210
    {
211
        $this->resourceLinkList[] = $link;
212
213
        return $this;
214
    }
215
216
    public function setResourceLinkList($links)
217
    {
218
        $this->resourceLinkList = $links;
219
220
        return $this;
221
    }
222
223
    public function getResourceLinkList()
224
    {
225
        return $this->getResourceLinkListFromEntity();
226
        //return $this->resourceLinkList;
227
    }
228
229
    public function getResourceLinkListFromEntity(): array
230
    {
231
        $resourceNode = $this->getResourceNode();
232
        $links = $resourceNode->getResourceLinks();
233
        $resourceLinkList = [];
234
235
        foreach ($links as $link) {
236
            $resourceLinkList[] = [
237
                'id' => $link->getId(),
238
                'session' => $link->getSession(),
239
                'course' => $link->getCourse(),
240
                'visibility' => $link->getVisibility(),
241
                'visibilityName' => $link->getVisibilityName(),
242
                'group' => $link->getGroup(),
243
                'userGroup' => $link->getUserGroup(),
244
            ];
245
        }
246
247
        return $resourceLinkList;
248
    }
249
250
    public function hasParentResourceNode(): bool
251
    {
252
        return null !== $this->parentResourceNode;
253
    }
254
255
    public function setParentResourceNode($resourceNode): self
256
    {
257
        $this->parentResourceNode = $resourceNode;
258
259
        return $this;
260
    }
261
262
    public function getParentResourceNode()
263
    {
264
        return $this->parentResourceNode;
265
    }
266
267
    public function hasUploadFile(): bool
268
    {
269
        return null !== $this->uploadFile;
270
    }
271
272
    public function getUploadFile()
273
    {
274
        return $this->uploadFile;
275
    }
276
277
    public function setUploadFile($file): self
278
    {
279
        $this->uploadFile = $file;
280
281
        return $this;
282
    }
283
284
    public function setResourceNode(ResourceNode $resourceNode): self
285
    {
286
        $this->resourceNode = $resourceNode;
287
288
        return $this;
289
    }
290
291
    public function hasResourceNode(): bool
292
    {
293
        return $this->resourceNode instanceof ResourceNode;
294
    }
295
296
    public function getResourceNode(): ResourceNode
297
    {
298
        return $this->resourceNode;
299
    }
300
301
    public function getCourseSessionResourceLink(Course $course, Session $session = null): ?ResourceLink
302
    {
303
        return $this->getFirstResourceLinkFromCourseSession($course, $session);
304
    }
305
306
    public function getFirstResourceLink(): ?ResourceLink
307
    {
308
        $resourceNode = $this->getResourceNode();
309
310
        if ($resourceNode && $resourceNode->getResourceLinks()->count()) {
311
            $result = $resourceNode->getResourceLinks()->first();
312
            if ($result) {
313
                return $result;
314
            }
315
        }
316
317
        return null;
318
    }
319
320
    /**
321
     * See ResourceLink to see the visibility constants. Example: ResourceLink::VISIBILITY_DELETED.
322
     */
323
    public function getLinkVisibility(Course $course, Session $session = null): ?ResourceLink
324
    {
325
        return $this->getCourseSessionResourceLink($course, $session)->getVisibility();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getCourseS...ssion)->getVisibility() returns the type integer which is incompatible with the type-hinted return Chamilo\CoreBundle\Entity\ResourceLink|null.
Loading history...
326
    }
327
328
    public function isVisible(Course $course, Session $session = null): bool
329
    {
330
        $link = $this->getCourseSessionResourceLink($course, $session);
331
        if (null === $link) {
332
            return false;
333
        }
334
335
        return ResourceLink::VISIBILITY_PUBLISHED === $link->getVisibility();
336
    }
337
338
    public function getFirstResourceLinkFromCourseSession(Course $course, Session $session = null): ?ResourceLink
339
    {
340
        $criteria = Criteria::create();
341
        $criteria
342
            ->where(Criteria::expr()->eq('course', $course))
343
            ->andWhere(
344
                Criteria::expr()->eq('session', $session)
345
            );
346
        $resourceNode = $this->getResourceNode();
347
348
        $result = null;
349
        if ($resourceNode && $resourceNode->getResourceLinks()->count() > 0) {
350
            //var_dump($resourceNode->getResourceLinks()->count());
351
            foreach ($resourceNode->getResourceLinks() as $link) {
352
                //var_dump(get_class($link));
353
            }
354
            $result = $resourceNode->getResourceLinks()->matching($criteria)->first();
355
            //var_dump($result);
356
            if ($result) {
357
                return $result;
358
            }
359
        }
360
361
        return null;
362
    }
363
}
364