Passed
Push — master ( 401a66...0a87d5 )
by Julito
12:18
created

AbstractResource::getCreator()   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
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", "ctool:read"})
49
     * @ORM\OneToOne(
50
     *     targetEntity="Chamilo\CoreBundle\Entity\ResourceNode",
51
     *     cascade={"persist", "remove"},
52
     *     orphanRemoval=true
53
     * )
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
    /**
93
     * @Assert\NotNull
94
     */
95
    public ?User $resourceNodeCreator = null;
96
97
    abstract public function getResourceName(): string;
98
99
    abstract public function setResourceName(string $name);
100
101
    //abstract public function setResourceProperties(FormInterface $form, $course, $session, $fileType);
102
103
    public function getCreator()
104
    {
105
        return $this->getResourceNode()->getCreator();
106
    }
107
108
    public function setCreator(User $user): self
109
    {
110
        $this->resourceNodeCreator = $user;
111
112
        return $this;
113
    }
114
115
    public function getResourceNodeCreator()
116
    {
117
        return $this->resourceNodeCreator;
118
    }
119
120
    public function getResourceLinkEntityList()
121
    {
122
        return $this->resourceLinkEntityList;
123
    }
124
125
    public function addLink(ResourceLink $link)
126
    {
127
        $this->resourceLinkEntityList[] = $link;
128
129
        return $this;
130
    }
131
132
    public function addCourseLink(Course $course, Session $session = null, CGroup $group = null, int $visibility = ResourceLink::VISIBILITY_PUBLISHED)
133
    {
134
        if (null === $this->getParent()) {
135
            throw new Exception('addCourseLink requires to set the parent first.');
136
        }
137
138
        $resourceLink = new ResourceLink();
139
        $resourceLink
140
            ->setVisibility($visibility)
141
            ->setCourse($course)
142
            ->setSession($session)
143
            ->setGroup($group)
144
        ;
145
146
        $rights = [];
147
        switch ($visibility) {
148
            case ResourceLink::VISIBILITY_PENDING:
149
            case ResourceLink::VISIBILITY_DRAFT:
150
                $editorMask = ResourceNodeVoter::getEditorMask();
151
                $resourceRight = new ResourceRight();
152
                $resourceRight
153
                    ->setMask($editorMask)
154
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
155
                ;
156
                $rights[] = $resourceRight;
157
158
                break;
159
        }
160
161
        if (!empty($rights)) {
162
            foreach ($rights as $right) {
163
                //$resourceLink->addResourceRights($right);
164
                $resourceLink->addResourceRight($right);
165
            }
166
        }
167
168
        if ($this->hasResourceNode()) {
169
            $resourceNode = $this->getResourceNode();
170
            $exists = $resourceNode->getResourceLinks()->exists(
171
                function ($key, $element) use ($course, $session, $group) {
172
                    return $course === $element->getCourse() &&
173
                        $session === $element->getSession() &&
174
                        $group === $element->getGroup();
175
                }
176
            );
177
178
            if ($exists) {
179
                return $this;
180
            }
181
            $resourceNode->addResourceLink($resourceLink);
182
        } else {
183
            $this->addLink($resourceLink);
184
        }
185
186
        return $this;
187
    }
188
189
    public function addGroupLink(Course $course, Session $session = null, CGroup $group = null)
190
    {
191
        $resourceLink = new ResourceLink();
192
        $resourceLink
193
            ->setCourse($course)
194
            ->setSession($session)
195
            ->setGroup($group)
196
            ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED)
197
        ;
198
199
        if ($this->hasResourceNode()) {
200
            $resourceNode = $this->getResourceNode();
201
            $exists = $resourceNode->getResourceLinks()->exists(
202
                function ($key, $element) use ($group) {
203
                    if ($element->getGroup()) {
204
                        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

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