Completed
Push — master ( 67834e...72c918 )
by Julito
08:46 queued 11s
created

CDocumentRepository::getDocumentUrl()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 13
nc 3
nop 1
dl 0
loc 22
rs 9.8333
c 1
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CourseBundle\Repository;
6
7
use APY\DataGridBundle\Grid\Column\Column;
8
use APY\DataGridBundle\Grid\Grid;
9
use Chamilo\CoreBundle\Component\Resource\Settings;
10
use Chamilo\CoreBundle\Entity\Course;
11
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
12
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
13
use Chamilo\CoreBundle\Entity\Session;
14
use Chamilo\CoreBundle\Form\Resource\CDocumentType;
15
use Chamilo\CoreBundle\Repository\GridInterface;
16
use Chamilo\CoreBundle\Repository\ResourceRepository;
17
use Chamilo\CoreBundle\Repository\UploadInterface;
18
use Chamilo\CourseBundle\Entity\CDocument;
19
use Chamilo\CourseBundle\Entity\CGroupInfo;
20
use Chamilo\UserBundle\Entity\User;
21
use Doctrine\ORM\QueryBuilder;
22
use Symfony\Component\Form\FormInterface;
23
use Symfony\Component\HttpFoundation\File\UploadedFile;
24
25
/**
26
 * Class CDocumentRepository.
27
 */
28
final class CDocumentRepository extends ResourceRepository implements GridInterface, UploadInterface
29
{
30
    public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroupInfo $group = null): QueryBuilder
31
    {
32
        return $this->getResourcesByCourse($course, $session, $group, $parentNode);
0 ignored issues
show
Bug introduced by
It seems like $course can also be of type null; however, parameter $course of Chamilo\CoreBundle\Repos...:getResourcesByCourse() does only seem to accept Chamilo\CoreBundle\Entity\Course, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

32
        return $this->getResourcesByCourse(/** @scrutinizer ignore-type */ $course, $session, $group, $parentNode);
Loading history...
33
    }
34
35
    public function getResourceSettings(): Settings
36
    {
37
        $settings = parent::getResourceSettings();
38
39
        $settings
40
            ->setAllowNodeCreation(true)
41
            ->setAllowResourceCreation(true)
42
            ->setAllowResourceUpload(true)
43
            ->setAllowDownloadAll(true)
44
            ->setAllowDiskSpace(true)
45
            ->setAllowToSaveEditorToResourceFile(true)
46
        ;
47
48
        return $settings;
49
    }
50
51
    public function saveUpload(UploadedFile $file)
52
    {
53
        $resource = new CDocument();
54
        $resource
55
            ->setFiletype('file')
56
            ->setSize($file->getSize())
57
            ->setTitle($file->getClientOriginalName())
58
        ;
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
            ->setReadonly(false)
72
        ;
73
74
        return $newResource;
75
    }
76
77
    /**
78
     * @return string
79
     */
80
    public function getDocumentUrl(CDocument $document)
81
    {
82
        // There are no URL for folders.
83
        if ('folder' === $document->getFiletype()) {
84
            return '';
85
        }
86
        $file = $document->getResourceNode()->getResourceFile();
87
88
        if (null === $file) {
89
            return '';
90
        }
91
92
        $params = [
93
            'course' => $document->getCourse()->getCode(),
94
            'id' => ltrim($document->getPath(), '/'),
95
            'tool' => 'document',
96
            'type' => $document->getResourceNode()->getResourceType()->getName(),
97
        ];
98
99
        return $this->getRouter()->generate(
100
            'chamilo_core_resource_view_file',
101
            $params
102
        );
103
    }
104
105
    /**
106
     * @return CDocument|null
107
     */
108
    public function getParent(CDocument $document)
109
    {
110
        $resourceParent = $document->getResourceNode()->getParent();
111
112
        if (null !== $resourceParent) {
113
            $resourceParentId = $resourceParent->getId();
114
            $criteria = [
115
                'resourceNode' => $resourceParentId,
116
            ];
117
118
            return $this->findOneBy($criteria);
119
        }
120
121
        return null;
122
    }
123
124
    /**
125
     * @param int    $courseId
126
     * @param string $path
127
     *
128
     * @throws \Doctrine\ORM\NonUniqueResultException
129
     */
130
    public function getFolderSize($courseId, $path)
131
    {
132
        $path = str_replace('_', '\_', $path);
133
        $addedSlash = '/' === $path ? '' : '/';
134
135
        $repo = $this->getRepository();
136
        $qb = $repo->createQueryBuilder('d');
137
        $query = $qb
138
            ->select('SUM(d.size)')
139
            ->innerJoin('d.resourceNode', 'r')
140
            ->innerJoin('r.resourceLinks', 'l')
141
            ->where('d.path LIKE :path')
142
            ->andWhere('d.path NOT LIKE :deleted')
143
            ->andWhere('d.path NOT LIKE :extra_path ')
144
            ->andWhere('l.visibility <> :visibility')
145
            ->andWhere('d.course = :course')
146
            ->setParameters([
147
                'path' => $path.$addedSlash.'%',
148
                'extra_path' => $path.$addedSlash.'%/%',
149
                'course' => $courseId,
150
                'deleted' => '%_DELETED_%',
151
                'visibility' => ResourceLink::VISIBILITY_DELETED,
152
            ])
153
            ->getQuery();
154
155
        return $query->getSingleScalarResult();
156
    }
157
158
    /**
159
     * @param int $courseId
160
     * @param int $groupId
161
     * @param int $sessionId
162
     *
163
     * @throws \Doctrine\ORM\NonUniqueResultException
164
     */
165
    public function getTotalSpace($courseId, $groupId = null, $sessionId = null)
166
    {
167
        $repo = $this->getRepository();
168
        $groupId = empty($groupId) ? null : $groupId;
169
        $sessionId = empty($sessionId) ? null : $sessionId;
170
171
        $qb = $repo->createQueryBuilder('d');
172
        $query = $qb
173
            ->select('SUM(d.size)')
174
            ->innerJoin('d.resourceNode', 'r')
175
            ->innerJoin('r.resourceLinks', 'l')
176
            ->where('l.course = :course')
177
            ->andWhere('l.group = :group')
178
            ->andWhere('l.session = :session')
179
            ->andWhere('l.visibility <> :visibility')
180
            ->setParameters([
181
                'course' => $courseId,
182
                'group' => $groupId,
183
                'session' => $sessionId,
184
                'visibility' => ResourceLink::VISIBILITY_DELETED,
185
            ])
186
            ->getQuery();
187
188
        return $query->getSingleScalarResult();
189
    }
190
191
    /**
192
     * @param int $userId
193
     *
194
     * @return array
195
     */
196
    public function getAllDocumentsByAuthor($userId)
197
    {
198
        $repo = $this->repository;
199
200
        $qb = $repo->createQueryBuilder('d');
201
        $query = $qb
202
            ->innerJoin('d.resourceNode', 'r')
203
            ->innerJoin('r.resourceLinks', 'l')
204
            ->where('l.user = :user')
205
            ->andWhere('l.visibility <> :visibility')
206
            ->setParameters([
207
                'user' => $userId,
208
                'visibility' => ResourceLink::VISIBILITY_DELETED,
209
            ])
210
            ->getQuery();
211
212
        return $query->getResult();
213
    }
214
215
    public function getTitleColumn(Grid $grid): Column
216
    {
217
        return $grid->getColumn('title');
218
    }
219
220
    public function getResourceFormType(): string
221
    {
222
        return CDocumentType::class;
223
    }
224
}
225