Passed
Push — master ( d88203...94a809 )
by Julito
07:42
created

IllustrationRepository::setResourceProperties()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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