Passed
Push — master ( 241d97...92d87b )
by Julito
09:22
created

AbstractResource::isVisible()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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

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