Passed
Push — master ( 15dae9...698027 )
by Julito
12:28
created

ResourceController::createAction()   F

Complexity

Conditions 25
Paths 876

Size

Total Lines 190
Code Lines 119

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 25
eloc 119
nc 876
nop 1
dl 0
loc 190
rs 0.1377
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Controller;
5
6
use APY\DataGridBundle\Grid\Export\CSVExport;
7
use APY\DataGridBundle\Grid\Export\ExcelExport;
8
use Chamilo\CoreBundle\Repository\ResourceRepository;
9
use Chamilo\CoreBundle\Entity\Resource\ResourceRights;
10
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
11
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
12
use Chamilo\CourseBundle\Repository\CDocumentRepository;
13
use APY\DataGridBundle\Grid\Action\MassAction;
14
use APY\DataGridBundle\Grid\Action\RowAction;
15
use Symfony\Component\HttpFoundation\Request;
16
use Symfony\Component\HttpFoundation\Response;
17
use Sylius\Bundle\ResourceBundle\Controller\ResourceController as BaseResourceController;
18
use APY\DataGridBundle\Grid\Source\Entity;
19
use FOS\RestBundle\View\View;
20
use Sylius\Component\Resource\ResourceActions;
21
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
22
23
/**
24
 * Class ResourceController.
25
 *
26
 * @author Julio Montoya <[email protected]>.
27
 *
28
 * @package Chamilo\CoreBundle\Controller
29
 */
30
class ResourceController extends BaseResourceController implements CourseControllerInterface
31
{
32
    use CourseControllerTrait;
33
34
    /**
35
     * @param Request $request
36
     *
37
     * @return Response
38
     */
39
    public function indexAction(Request $request): Response
40
    {
41
        $source = new Entity('ChamiloCourseBundle:CDocument');
42
43
        /* @var $grid \APY\DataGridBundle\Grid\Grid */
44
        $grid = $this->get('grid');
45
46
        /*$tableAlias = $source->getTableAlias();
47
        $source->manipulateQuery(function (QueryBuilder $query) use ($tableAlias, $course) {
48
                $query->andWhere($tableAlias . '.cId = '.$course->getId());
49
                //$query->resetDQLPart('orderBy');
50
            }
51
        );*/
52
53
        /** @var CDocumentRepository $repository */
54
        $repository = $this->repository;
55
        $course = $this->getCourse();
56
        $tool = $repository->getTool('document');
57
        $resources = $repository->getResourceByCourse($course, $tool);
58
59
        $source->setData($resources);
60
        $grid->setSource($source);
61
62
        //$grid->hideFilters();
63
        $grid->setLimits(5);
64
        //$grid->isReadyForRedirect();
65
66
        //$grid->setMaxResults(1);
67
        //$grid->setLimits(2);
68
        /*$grid->getColumn('id')->manipulateRenderCell(
69
            function ($value, $row, $router) use ($course) {
70
                //$router = $this->get('router');
71
                return $router->generate(
72
                    'chamilo_notebook_show',
73
                    array('id' => $row->getField('id'), 'course' => $course)
74
                );
75
            }
76
        );*/
77
78
        if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
79
            $deleteMassAction = new MassAction(
80
                'Delete',
81
                'chamilo.controller.notebook:deleteMassAction',
82
                true,
83
                array('course' => $request->get('course'))
84
            );
85
            $grid->addMassAction($deleteMassAction);
86
        }
87
88
        $translation = $this->container->get('translator');
89
90
        $myRowAction = new RowAction(
91
            $translation->trans('View'),
92
            'app_document_show',
93
            false,
94
            '_self',
95
            ['class' => 'btn btn-default']
96
        );
97
        $myRowAction->setRouteParameters(array('course' => $course, 'id'));
98
        $grid->addRowAction($myRowAction);
99
100
        if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
101
            $myRowAction = new RowAction(
102
                $translation->trans('Edit'),
103
                'app_document_update',
104
                false,
105
                '_self',
106
                ['class' => 'btn btn-info']
107
            );
108
            $myRowAction->setRouteParameters(array('course' => $course, 'id'));
109
            $grid->addRowAction($myRowAction);
110
111
            $myRowAction = new RowAction(
112
                $translation->trans('Delete'),
113
                'app_document_delete',
114
                false,
115
                '_self',
116
                ['class' => 'btn btn-danger', 'form_delete' => true]
117
            );
118
            $myRowAction->setRouteParameters(['course' => $course, 'id']);
119
            $grid->addRowAction($myRowAction);
120
        }
121
122
        $grid->addExport(
123
            new CSVExport(
124
                $translation->trans('CSV Export'), 'export', ['course' => $course]
125
            )
126
        );
127
128
        $grid->addExport(
129
            new ExcelExport(
130
                $translation->trans('Excel Export'),
131
                'export',
132
                ['course' => $course]
133
            )
134
        );
135
136
        return $grid->getGridResponse('ChamiloCoreBundle:Document:index.html.twig');
137
    }
138
139
    /**
140
     * @param Request $request
141
     *
142
     * @return RedirectResponse|Response
143
     */
144
    public function createAction(Request $request): Response
145
    {
146
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
147
148
        $this->isGrantedOr403($configuration, ResourceActions::CREATE);
149
        $newResource = $this->newResourceFactory->create($configuration, $this->factory);
150
        $form = $this->resourceFormFactory->create($configuration, $newResource);
151
152
        $course = $this->getCourse();
153
        $session = $this->getSession();
154
        $newResource->setCId($course->getId());
155
        $form->setData($newResource);
156
157
        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
158
            /** @var \Chamilo\CourseBundle\Entity\CDocument $newResource */
159
            $newResource = $form->getData();
160
            $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource);
161
162
            if ($event->isStopped() && !$configuration->isHtmlRequest()) {
163
                throw new HttpException($event->getErrorCode(), $event->getMessage());
0 ignored issues
show
Bug introduced by
The type Chamilo\CoreBundle\Controller\HttpException was not found. Did you mean HttpException? If so, make sure to prefix the type with \.
Loading history...
164
            }
165
            if ($event->isStopped()) {
166
                $this->flashHelper->addFlashFromEvent($configuration, $event);
167
168
                if ($event->hasResponse()) {
169
                    return $event->getResponse();
170
                }
171
172
                return $this->redirectHandler->redirectToIndex($configuration, $newResource);
173
            }
174
175
            if ($configuration->hasStateMachine()) {
176
                $this->stateMachine->apply($configuration, $newResource);
177
            }
178
179
            //$newResource->setCId($request->get('c_id'));
180
            $sharedType = $form->get('shared')->getData();
181
            $shareList = array();
182
183
            switch ($sharedType) {
184
                case 'this_course':
185
                    if (empty($course)) {
186
                        break;
187
                    }
188
                    // Default Chamilo behaviour:
189
                    // Teachers can edit and students can see
190
                    $shareList = array(
191
                        array(
192
                            'sharing' => 'course',
193
                            'mask' => ResourceNodeVoter::getReaderMask(),
194
                            'role' => ResourceNodeVoter::ROLE_CURRENT_COURSE_STUDENT,
195
                            'search' => $course->getId(),
196
                        ),
197
                        array(
198
                            'sharing' => 'course',
199
                            'mask' => ResourceNodeVoter::getEditorMask(),
200
                            'role' => ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER,
201
                            'search' => $course->getId(),
202
                        ),
203
                    );
204
                    break;
205
                case 'shared':
206
                    $shareList = $form->get('rights')->getData();
207
                    break;
208
                case 'only_me':
209
                    $shareList = array(
210
                        array(
211
                            'sharing' => 'user',
212
                            'only_me' => true,
213
                        ),
214
                    );
215
                    break;
216
            }
217
218
219
            error_log(print_r($shareList, 1));
220
221
222
            /** @var ResourceRepository $repository */
223
            $repository = $this->repository;
224
            $resourceNode = $repository->addResourceNode($newResource, $this->getUser());
225
226
            // Loops all sharing options
227
            foreach ($shareList as $share) {
228
                $idList = array();
229
                if (isset($share['search'])) {
230
                    $idList = explode(',', $share['search']);
231
                }
232
233
                $resourceRight = null;
234
                if (isset($share['mask'])) {
235
                    $resourceRight = new ResourceRights();
236
                    $resourceRight
237
                        ->setMask($share['mask'])
238
                        ->setRole($share['role'])
239
                    ;
240
                }
241
242
                // Build links
243
                switch ($share['sharing']) {
244
                    case 'everyone':
245
                        $repository->addResourceToEveryone(
246
                            $resourceNode,
247
                            $resourceRight
248
                        );
249
                        break;
250
                    case 'course':
251
                        $repository->addResourceToCourse(
252
                            $resourceNode,
253
                            $course,
254
                            $resourceRight
255
                        );
256
                        break;
257
                    case 'session':
258
                        $repository->addResourceToSession(
259
                            $resourceNode,
260
                            $course,
261
                            $session,
262
                            $resourceRight
263
                        );
264
                        break;
265
                    case 'user':
266
                        // Only for me
267
                        if (isset($share['only_me'])) {
268
                            error_log('only_me');
269
                            $repository->addResourceOnlyToMe($resourceNode);
270
                        } else {
271
                            error_log('others');
272
                            // To other users
273
                            $repository->addResourceToUserList($resourceNode, $idList);
274
                        }
275
                        break;
276
                    case 'group':
277
                        // @todo
278
                        break;
279
                }
280
            }
281
282
            $newResource
283
                ->setCId($course->getId())
284
                ->setPath('/a')
285
                ->setFiletype('file')
286
                ->setSize('12')
287
                //->setTitle($title)
288
                //->setComment($comment)
289
                ->setReadonly(false)
290
                ->setSessionId(0)
291
                ->setResourceNode($resourceNode)
292
            ;
293
294
            $this->repository->add($newResource);
295
296
            $postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource);
297
298
            if (!$configuration->isHtmlRequest()) {
299
                return $this->viewHandler->handle($configuration, View::create($newResource, Response::HTTP_CREATED));
300
            }
301
302
            $this->addFlash('success', 'saved');
303
304
            //$this->flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource);
305
306
            if ($postEvent->hasResponse()) {
307
                return $postEvent->getResponse();
308
            }
309
310
            return $this->redirectHandler->redirectToResource($configuration, $newResource);
311
        }
312
313
        if (!$configuration->isHtmlRequest()) {
314
            return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
315
        }
316
317
        $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource);
318
        if ($initializeEvent->hasResponse()) {
319
            return $initializeEvent->getResponse();
320
        }
321
322
        $view = View::create()
323
            ->setData([
324
                'configuration' => $configuration,
325
                'metadata' => $this->metadata,
326
                'resource' => $newResource,
327
                $this->metadata->getName() => $newResource,
328
                'form' => $form->createView(),
329
            ])
330
            ->setTemplate($configuration->getTemplate(ResourceActions::CREATE . '.html'))
331
        ;
332
333
        return $this->viewHandler->handle($configuration, $view);
334
    }
335
336
    /**
337
     * @param Request $request
338
     *
339
     * @return Response
340
     */
341
    public function showAction(Request $request): Response
342
    {
343
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
344
        $this->isGrantedOr403($configuration, ResourceActions::SHOW);
345
346
        /** @var AbstractResource $resource */
347
        $resource = $this->findOr404($configuration);
348
        $resourceNode = $resource->getResourceNode();
349
350
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
351
352
        $this->denyAccessUnlessGranted(
353
            ResourceNodeVoter::VIEW,
354
            $resourceNode,
355
            'Unauthorised access to resource'
356
        );
357
358
        $view = View::create($resource);
359
360
        if ($configuration->isHtmlRequest()) {
361
            $view
362
                ->setTemplate($configuration->getTemplate(ResourceActions::SHOW . '.html'))
363
                ->setTemplateVar($this->metadata->getName())
364
                ->setData([
365
                    'configuration' => $configuration,
366
                    'metadata' => $this->metadata,
367
                    'resource' => $resource,
368
                    $this->metadata->getName() => $resource,
369
                ])
370
            ;
371
        }
372
373
        return $this->viewHandler->handle($configuration, $view);
374
    }
375
376
    /**
377
     * @param Request $request
378
     *
379
     * @return Response
380
     */
381
    public function updateAction(Request $request): Response
382
    {
383
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
384
385
        $this->isGrantedOr403($configuration, ResourceActions::UPDATE);
386
        $resource = $this->findOr404($configuration);
387
        $resourceNode = $resource->getResourceNode();
388
389
        $this->denyAccessUnlessGranted(
390
            ResourceNodeVoter::EDIT,
391
            $resourceNode,
392
            'Unauthorised access to resource'
393
        );
394
395
        $form = $this->resourceFormFactory->create($configuration, $resource);
396
397
        if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && $form->handleRequest($request)->isValid()) {
398
            $resource = $form->getData();
399
400
            /** @var ResourceControllerEvent $event */
401
            $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource);
402
403
            if ($event->isStopped() && !$configuration->isHtmlRequest()) {
404
                throw new HttpException($event->getErrorCode(), $event->getMessage());
405
            }
406
            if ($event->isStopped()) {
407
                $this->flashHelper->addFlashFromEvent($configuration, $event);
408
409
                if ($event->hasResponse()) {
410
                    return $event->getResponse();
411
                }
412
413
                return $this->redirectHandler->redirectToResource($configuration, $resource);
414
            }
415
416
            try {
417
                $this->resourceUpdateHandler->handle($resource, $configuration, $this->manager);
418
            } catch (UpdateHandlingException $exception) {
419
                if (!$configuration->isHtmlRequest()) {
420
                    return $this->viewHandler->handle(
421
                        $configuration,
422
                        View::create($form, $exception->getApiResponseCode())
423
                    );
424
                }
425
426
                $this->flashHelper->addErrorFlash($configuration, $exception->getFlash());
427
428
                return $this->redirectHandler->redirectToReferer($configuration);
429
            }
430
431
            $postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource);
432
433
            if (!$configuration->isHtmlRequest()) {
434
                $view = $configuration->getParameters()->get('return_content', false) ? View::create($resource, Response::HTTP_OK) : View::create(null, Response::HTTP_NO_CONTENT);
435
436
                return $this->viewHandler->handle($configuration, $view);
437
            }
438
439
            $this->flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource);
440
441
            if ($postEvent->hasResponse()) {
442
                return $postEvent->getResponse();
443
            }
444
445
            return $this->redirectHandler->redirectToResource($configuration, $resource);
446
        }
447
448
        if (!$configuration->isHtmlRequest()) {
449
            return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
450
        }
451
452
        $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource);
453
        if ($initializeEvent->hasResponse()) {
454
            return $initializeEvent->getResponse();
455
        }
456
457
        $view = View::create()
458
            ->setData([
459
                'configuration' => $configuration,
460
                'metadata' => $this->metadata,
461
                'resource' => $resource,
462
                $this->metadata->getName() => $resource,
463
                'form' => $form->createView(),
464
            ])
465
            ->setTemplate($configuration->getTemplate(ResourceActions::UPDATE . '.html'))
466
        ;
467
468
        return $this->viewHandler->handle($configuration, $view);
469
    }
470
}
471