Passed
Push — master ( 3ad0be...6ad90b )
by Julito
07:30
created

AbstractResource::addResourceToUserList()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 13
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 4
c 0
b 0
f 0
nc 2
nop 4
dl 0
loc 13
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Entity;
8
9
use ApiPlatform\Core\Annotation\ApiProperty;
10
use ApiPlatform\Core\Annotation\ApiSubresource;
11
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
12
use Chamilo\CourseBundle\Entity\CGroup;
13
use Doctrine\Common\Collections\Criteria;
14
use Doctrine\ORM\Mapping as ORM;
15
use Exception;
16
use Symfony\Component\Form\FormInterface;
17
use Symfony\Component\HttpFoundation\File\UploadedFile;
18
use Symfony\Component\Serializer\Annotation\Groups;
19
use Symfony\Component\Validator\Constraints as Assert;
20
21
/**
22
 * @ORM\MappedSuperclass
23
 * @ORM\HasLifecycleCallbacks
24
 * @ORM\EntityListeners({"Chamilo\CoreBundle\Entity\Listener\ResourceListener"})
25
 */
26
abstract class AbstractResource
27
{
28
    /**
29
     * @ApiProperty(iri="http://schema.org/contentUrl")
30
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read"})
31
     */
32
    public ?string $contentUrl = null;
33
34
    /**
35
     * @ApiProperty(iri="http://schema.org/contentUrl")
36
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read"})
37
     */
38
    public ?string $downloadUrl = null;
39
40
    /**
41
     * @Groups({"resource_file:read", "resource_node:read", "document:read", "document:write", "media_object_read"})
42
     */
43
    public ?string $contentFile = null;
44
45
    /**
46
     * @Assert\Valid()
47
     * @ApiSubresource()
48
     * @Groups({"resource_node:read", "resource_node:write", "document:write" })
49
     * @ORM\OneToOne(
50
     *     targetEntity="Chamilo\CoreBundle\Entity\ResourceNode",
51
     *     cascade={"persist", "remove"},
52
     *     orphanRemoval=true
53
     * )AbstractResource
54
     * @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="CASCADE")
55
     */
56
    public ?ResourceNode $resourceNode = null;
57
58
    /**
59
     * @Groups({"resource_node:read", "resource_node:write", "document:read", "document:write"})
60
     */
61
    public ?int $parentResourceNode = 0;
62
63
    /**
64
     * @ApiProperty(iri="http://schema.org/image")
65
     */
66
    public ?UploadedFile $uploadFile = null;
67
68
    /**
69
     * @var AbstractResource|ResourceInterface
70
     */
71
    public $parentResource;
72
73
    /**
74
     * @Groups({"resource_node:read", "document:read"})
75
     */
76
    public ?array $resourceLinkListFromEntity = null;
77
78
    /**
79
     * Use when sending a request to Api platform.
80
     * Temporal array that saves the resource link list that will be filled by CreateResourceNodeFileAction.php.
81
     */
82
    public array $resourceLinkList = [];
83
84
    /**
85
     * Use when sending request to Chamilo.
86
     * Temporal array of objects locates the resource link list that will be filled by CreateResourceNodeFileAction.php.
87
     *
88
     * @var ResourceLink[]
89
     */
90
    public array $resourceLinkEntityList = [];
91
92
    abstract public function getResourceName(): string;
93
94
    abstract public function setResourceName(string $name);
95
96
    //abstract public function setResourceProperties(FormInterface $form, $course, $session, $fileType);
97
98
    public function getCreator()
99
    {
100
        return $this->getResourceNode()->getCreator();
101
    }
102
103
    public function getResourceLinkEntityList()
104
    {
105
        return $this->resourceLinkEntityList;
106
    }
107
108
    public function addLink(ResourceLink $link)
109
    {
110
        $this->resourceLinkEntityList[] = $link;
111
112
        return $this;
113
    }
114
115
    public function addCourseLink(Course $course, Session $session = null, CGroup $group = null, int $visibility = ResourceLink::VISIBILITY_PUBLISHED)
116
    {
117
        if (null === $this->getParent()) {
118
            throw new Exception('addCourseLink requires to set the parent first.');
119
        }
120
121
        $resourceLink = new ResourceLink();
122
        $resourceLink
123
            ->setVisibility($visibility)
124
            ->setCourse($course)
125
            ->setSession($session)
126
            ->setGroup($group)
127
        ;
128
129
        $rights = [];
130
        switch ($visibility) {
131
            case ResourceLink::VISIBILITY_PENDING:
132
            case ResourceLink::VISIBILITY_DRAFT:
133
                $editorMask = ResourceNodeVoter::getEditorMask();
134
                $resourceRight = new ResourceRight();
135
                $resourceRight
136
                    ->setMask($editorMask)
137
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
138
                ;
139
                $rights[] = $resourceRight;
140
141
                break;
142
        }
143
144
        if (!empty($rights)) {
145
            foreach ($rights as $right) {
146
                //$resourceLink->addResourceRights($right);
147
                $resourceLink->addResourceRight($right);
148
            }
149
        }
150
151
        if ($this->hasResourceNode()) {
152
            $resourceNode = $this->getResourceNode();
153
            $exists = $resourceNode->getResourceLinks()->exists(
154
                function ($key, $element) use ($course, $session, $group) {
155
                    return
156
                        $course === $element->getCourse() &&
157
                        $session === $element->getSession() &&
158
                        $group === $element->getGroup();
159
                }
160
            );
161
162
            if ($exists) {
163
                return $this;
164
            }
165
            $resourceNode->addResourceLink($resourceLink);
166
        } else {
167
            $this->addLink($resourceLink);
168
        }
169
170
        return $this;
171
    }
172
173
    public function addGroupLink(Course $course, Session $session = null, CGroup $group = null)
174
    {
175
        $resourceLink = new ResourceLink();
176
        $resourceLink
177
            ->setCourse($course)
178
            ->setSession($session)
179
            ->setGroup($group)
180
            ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED)
181
        ;
182
183
        if ($this->hasResourceNode()) {
184
            $resourceNode = $this->getResourceNode();
185
            $exists = $resourceNode->getResourceLinks()->exists(
186
                function ($key, $element) use ($group) {
187
                    if ($element->getGroup()) {
188
                        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

188
                        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...
189
                    }
190
                }
191
            );
192
193
            if ($exists) {
194
                return $this;
195
            }
196
            $resourceNode->addResourceLink($resourceLink);
197
        } else {
198
            $this->addLink($resourceLink);
199
        }
200
201
        return $this;
202
    }
203
204
    public function addUserLink(User $user, Course $course = null, Session $session = null, CGroup $group = null)
205
    {
206
        $resourceLink = new ResourceLink();
207
        $resourceLink
208
            ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED)
209
            ->setUser($user)
210
            ->setCourse($course)
211
            ->setSession($session)
212
            ->setGroup($group)
213
        ;
214
215
        if ($this->hasResourceNode()) {
216
            $resourceNode = $this->getResourceNode();
217
            $exists = $resourceNode->getResourceLinks()->exists(
218
                function ($key, $element) use ($user) {
219
                    if ($element->hasUser()) {
220
                        return $user->getId() === $element->getUser()->getId();
221
                    }
222
                }
223
            );
224
225
            if ($exists) {
226
                error_log('Link already exist for user: '.$user->getUsername().', skipping');
227
228
                return $this;
229
            }
230
231
            error_log('New link can be added for user: '.$user->getUsername());
232
            $resourceNode->addResourceLink($resourceLink);
233
        } else {
234
            $this->addLink($resourceLink);
235
        }
236
237
        return $this;
238
    }
239
240
    public function setParent(ResourceInterface $parent)
241
    {
242
        $this->parentResource = $parent;
243
244
        return $this;
245
    }
246
247
    public function getParent()
248
    {
249
        return $this->parentResource;
250
    }
251
252
    /**
253
     * @param array $userList User id list
254
     */
255
    public function addResourceToUserList(
256
        array $userList,
257
        Course $course = null,
258
        Session $session = null,
259
        CGroup $group = null
260
    ) {
261
        if (!empty($userList)) {
262
            foreach ($userList as $user) {
263
                $this->addUserLink($user, $course, $session, $group);
264
            }
265
        }
266
267
        return $this;
268
    }
269
270
    public function setResourceLinkArray(array $links)
271
    {
272
        $this->resourceLinkList = $links;
273
274
        return $this;
275
    }
276
277
    public function getResourceLinkArray()
278
    {
279
        return $this->resourceLinkList;
280
    }
281
282
    public function getResourceLinkListFromEntity()
283
    {
284
        return $this->resourceLinkListFromEntity;
285
    }
286
287
    public function setResourceLinkListFromEntity(): void
288
    {
289
        $resourceLinkList = [];
290
        if ($this->hasResourceNode()) {
291
            $resourceNode = $this->getResourceNode();
292
            $links = $resourceNode->getResourceLinks();
293
            foreach ($links as $link) {
294
                $resourceLinkList[] = [
295
                    'id' => $link->getId(),
296
                    'session' => $link->getSession(),
297
                    'course' => $link->getCourse(),
298
                    'visibility' => $link->getVisibility(),
299
                    'visibilityName' => $link->getVisibilityName(),
300
                    'group' => $link->getGroup(),
301
                    'userGroup' => $link->getUserGroup(),
302
                ];
303
            }
304
        }
305
        $this->resourceLinkListFromEntity = $resourceLinkList;
306
    }
307
308
    public function hasParentResourceNode(): bool
309
    {
310
        return null !== $this->parentResourceNode && 0 !== $this->parentResourceNode;
311
    }
312
313
    public function setParentResourceNode(?int $resourceNode): self
314
    {
315
        $this->parentResourceNode = $resourceNode;
316
317
        return $this;
318
    }
319
320
    public function getParentResourceNode()
321
    {
322
        return $this->parentResourceNode;
323
    }
324
325
    public function hasUploadFile(): bool
326
    {
327
        return null !== $this->uploadFile;
328
    }
329
330
    public function getUploadFile()
331
    {
332
        return $this->uploadFile;
333
    }
334
335
    public function setUploadFile(?UploadedFile $file): self
336
    {
337
        $this->uploadFile = $file;
338
339
        return $this;
340
    }
341
342
    public function setResourceNode(ResourceNode $resourceNode): self
343
    {
344
        $this->resourceNode = $resourceNode;
345
346
        return $this;
347
    }
348
349
    public function hasResourceNode(): bool
350
    {
351
        return $this->resourceNode instanceof ResourceNode;
352
    }
353
354
    public function getResourceNode(): ?ResourceNode
355
    {
356
        return $this->resourceNode;
357
    }
358
359
    public function getFirstResourceLink(): ?ResourceLink
360
    {
361
        $resourceNode = $this->getResourceNode();
362
363
        if ($resourceNode && $resourceNode->getResourceLinks()->count()) {
364
            $result = $resourceNode->getResourceLinks()->first();
365
            if ($result) {
366
                return $result;
367
            }
368
        }
369
370
        return null;
371
    }
372
373
    /**
374
     * See ResourceLink to see the visibility constants. Example: ResourceLink::VISIBILITY_DELETED.
375
     */
376
    /*public function getLinkVisibility(Course $course, Session $session = null): ?ResourceLink
377
    {
378
        return $this->getFirstResourceLinkFromCourseSession($course, $session)->getVisibility();
379
    }*/
380
381
    public function isVisible(Course $course, Session $session = null): bool
382
    {
383
        $link = $this->getFirstResourceLinkFromCourseSession($course, $session);
384
        if (null === $link) {
385
            return false;
386
        }
387
388
        return ResourceLink::VISIBILITY_PUBLISHED === $link->getVisibility();
389
    }
390
391
    public function getFirstResourceLinkFromCourseSession(Course $course, Session $session = null): ?ResourceLink
392
    {
393
        /*$criteria = Criteria::create();
394
        $criteria
395
            ->where(Criteria::expr()->eq('course', $course->getId()))
396
            ->andWhere(
397
                Criteria::expr()->eq('session', $session)
398
            )
399
            ->setFirstResult(0)
400
            ->setMaxResults(1)
401
        ;*/
402
        $resourceNode = $this->getResourceNode();
403
        $result = null;
404
        if ($resourceNode && $resourceNode->getResourceLinks()->count() > 0) {
405
            $links = $resourceNode->getResourceLinks();
406
            $found = false;
407
            $link = null;
408
            foreach ($links as $link) {
409
                if ($link->getCourse() === $course && $link->getSession() === $session) {
410
                    $found = true;
411
412
                    break;
413
                }
414
            }
415
            //$result = $links->matching($criteria)->count();
416
            //var_dump($result);
417
            if ($found) {
418
                return $link;
419
            }
420
        }
421
422
        return null;
423
    }
424
425
    public function getUsersAndGroupSubscribedToResource(): array
426
    {
427
        $users = [];
428
        $groups = [];
429
        $everyone = false;
430
        $links = $this->getResourceNode()->getResourceLinks();
431
        foreach ($links as $link) {
432
            if ($link->hasUser()) {
433
                $users[] = $link->getUser()->getId();
434
435
                continue;
436
            }
437
            if ($link->hasGroup()) {
438
                $groups[] = $link->getGroup()->getIid();
439
            }
440
        }
441
442
        if (empty($users) && empty($groups)) {
443
            $everyone = true;
444
        }
445
446
        return [
447
            'everyone' => $everyone,
448
            'users' => $users,
449
            'groups' => $groups,
450
        ];
451
    }
452
}
453