Passed
Push — master ( ad5dd8...3078de )
by Julito
08:55
created

IllustrationRepository   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 62
dl 0
loc 141
rs 10
c 1
b 0
f 0
wmc 17

10 Methods

Rating   Name   Duplication   Size   Complexity  
A getResources() 0 15 1
A saveUpload() 0 6 1
A setResourceProperties() 0 3 1
A __construct() 0 3 1
A getIllustrationUrl() 0 12 2
A getIllustrationUrlFromNode() 0 19 3
A getIllustrationNodeFromParent() 0 17 1
A deleteIllustration() 0 7 2
A addIllustration() 0 27 4
A getResourceFormType() 0 3 1
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Repository\Node;
6
7
use Chamilo\CoreBundle\Entity\AbstractResource;
8
use Chamilo\CoreBundle\Entity\Course;
9
use Chamilo\CoreBundle\Entity\Illustration;
10
use Chamilo\CoreBundle\Entity\ResourceFile;
11
use Chamilo\CoreBundle\Entity\ResourceIllustrationInterface;
12
use Chamilo\CoreBundle\Entity\ResourceInterface;
13
use Chamilo\CoreBundle\Entity\ResourceNode;
14
use Chamilo\CoreBundle\Entity\Session;
15
use Chamilo\CoreBundle\Entity\User;
16
use Chamilo\CoreBundle\Form\Resource\IllustrationType;
17
use Chamilo\CoreBundle\Repository\GridInterface;
18
use Chamilo\CoreBundle\Repository\ResourceRepository;
19
use Chamilo\CoreBundle\Repository\UploadInterface;
20
use Chamilo\CourseBundle\Entity\CGroup;
21
use Doctrine\ORM\QueryBuilder;
22
use Doctrine\Persistence\ManagerRegistry;
23
use Symfony\Component\Form\FormInterface;
24
use Symfony\Component\HttpFoundation\File\UploadedFile;
25
26
/**
27
 * Class IllustrationRepository.
28
 */
29
final class IllustrationRepository extends ResourceRepository implements GridInterface, UploadInterface
30
{
31
    public function __construct(ManagerRegistry $registry)
32
    {
33
        parent::__construct($registry, Illustration::class);
34
    }
35
36
    public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroup $group = null): QueryBuilder
37
    {
38
        $qb = $this->createQueryBuilder('resource')
39
            ->select('resource')
40
            //->from($className, 'resource')
41
            ->innerJoin(
42
                'resource.resourceNode',
43
                'node'
44
            )
45
        ;
46
47
        $qb->andWhere('node.creator = :creator');
48
        $qb->setParameter('creator', $user);
49
50
        return $qb;
51
    }
52
53
    public function saveUpload(UploadedFile $file)
54
    {
55
        $resource = new Illustration();
56
        $resource->setName($file->getClientOriginalName());
57
58
        return $resource;
59
    }
60
61
    public function setResourceProperties(FormInterface $form, $course, $session, $fileType)
62
    {
63
        return $form->getData();
64
65
        //->setCourse($course)
66
            //->setSession($session)
67
            //->setFiletype($fileType)
68
            //->setTitle($title) // already added in $form->getData()
69
    }
70
71
    public function addIllustration(ResourceInterface $resource, User $user, UploadedFile $uploadFile = null, $crop = ''): ?ResourceFile
72
    {
73
        if (null === $uploadFile) {
74
            return null;
75
        }
76
77
        $illustrationNode = $this->getIllustrationNodeFromParent($resource->getResourceNode());
78
        $em = $this->getEntityManager();
79
80
        if (null === $illustrationNode) {
81
            $illustration = new Illustration();
82
            $illustration->setParentResourceNode($user->getResourceNode());
83
            $em->persist($illustration);
84
            $this->addResourceNode($illustration, $user, $resource);
85
        } else {
86
            $illustration = $this->findOneBy(['resourceNode' => $illustrationNode]);
87
        }
88
89
        $file = $this->addFile($illustration, $uploadFile);
90
        if (!empty($crop)) {
91
            $file->setCrop($crop);
92
        }
93
94
        $em->persist($file);
95
        $em->flush();
96
97
        return $file;
98
    }
99
100
    public function getIllustrationNodeFromParent(ResourceNode $resourceNode): ?ResourceNode
101
    {
102
        $nodeRepo = $this->getResourceNodeRepository();
103
        $name = $this->getResourceTypeName();
104
105
        $qb = $nodeRepo->createQueryBuilder('n')
106
            ->select('node')
107
            ->from(ResourceNode::class, 'node')
108
            ->innerJoin('node.resourceType', 'type')
109
            ->innerJoin('node.resourceFile', 'file')
110
            ->where('node.parent = :parent')
111
            ->andWhere('type.name = :name')
112
            ->setParameters(['parent' => $resourceNode->getId(), 'name' => $name])
113
            ->setMaxResults(1)
114
        ;
115
116
        return $qb->getQuery()->getOneOrNullResult();
117
    }
118
119
    public function deleteIllustration(ResourceInterface $resource): void
120
    {
121
        $node = $this->getIllustrationNodeFromParent($resource->getResourceNode());
122
123
        if (null !== $node) {
124
            $this->getEntityManager()->remove($node);
125
            $this->getEntityManager()->flush();
126
        }
127
    }
128
129
    /**
130
     * @param string $filter See: services.yaml parameter "glide_media_filters" to see the list of filters.
131
     */
132
    public function getIllustrationUrl(
133
        ResourceIllustrationInterface $resource,
134
        string $filter = '',
135
        $size = null
136
    ): string {
137
        $illustration = $this->getIllustrationUrlFromNode($resource->getResourceNode(), $filter);
138
139
        if (empty($illustration)) {
140
            $illustration = $resource->getDefaultIllustration($size);
141
        }
142
143
        return $illustration;
144
    }
145
146
    public function getResourceFormType(): string
147
    {
148
        return IllustrationType::class;
149
    }
150
151
    private function getIllustrationUrlFromNode(ResourceNode $node, string $filter = ''): string
152
    {
153
        $node = $this->getIllustrationNodeFromParent($node);
154
155
        if (null !== $node) {
156
            $params = [
157
                'id' => $node->getId(),
158
                'tool' => $node->getResourceType()->getTool(),
159
                'type' => $node->getResourceType()->getName(),
160
            ];
161
162
            if (!empty($filter)) {
163
                $params['filter'] = $filter;
164
            }
165
166
            return $this->getRouter()->generate('chamilo_core_resource_view', $params);
167
        }
168
169
        return '';
170
    }
171
}
172