Total Complexity | 48 |
Total Lines | 873 |
Duplicated Lines | 0 % |
Changes | 2 | ||
Bugs | 0 | Features | 0 |
Complex classes like ResourceController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use ResourceController, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
45 | class ResourceController extends AbstractResourceController implements CourseControllerInterface |
||
46 | { |
||
47 | use CourseControllerTrait; |
||
48 | use ResourceControllerTrait; |
||
49 | use ControllerTrait; |
||
50 | |||
51 | private string $fileContentName = 'file_content'; |
||
52 | |||
53 | /** |
||
54 | * @deprecated Use Vue |
||
55 | * |
||
56 | * @Route("/{tool}/{type}", name="chamilo_core_resource_index") |
||
57 | * |
||
58 | * Example: /document/files (See the 'tool' and the 'resource_type' DB tables.) |
||
59 | * For the tool value check the Tool entity. |
||
60 | * For the type value check the ResourceType entity. |
||
61 | */ |
||
62 | /*public function indexAction(Request $request): Response |
||
63 | { |
||
64 | $tool = $request->get('tool'); |
||
65 | $type = $request->get('type'); |
||
66 | |||
67 | $parentResourceNode = $this->getParentResourceNode($request); |
||
68 | $repository = $this->getRepositoryFromRequest($request); |
||
69 | $settings = $repository->getResourceSettings(); |
||
70 | |||
71 | // The base resource node is the course. |
||
72 | $id = $parentResourceNode->getId(); |
||
73 | |||
74 | //return $grid->getGridResponse( |
||
75 | return $this->render( |
||
76 | $repository->getTemplates()->getFromAction(__FUNCTION__), |
||
77 | [ |
||
78 | 'tool' => $tool, |
||
79 | 'type' => $type, |
||
80 | 'id' => $id, |
||
81 | 'parent_resource_node' => $parentResourceNode, |
||
82 | 'resource_settings' => $settings, |
||
83 | ] |
||
84 | ); |
||
85 | }*/ |
||
86 | |||
87 | /** |
||
88 | * @deprecated Use Vue |
||
89 | * |
||
90 | * @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list") |
||
91 | * |
||
92 | * If node has children show it |
||
93 | */ |
||
94 | /*public function listAction(Request $request): void |
||
95 | { |
||
96 | $tool = $request->get('tool'); |
||
97 | $type = $request->get('type'); |
||
98 | $resourceNodeId = $request->get('id'); |
||
99 | |||
100 | $repository = $this->getRepositoryFromRequest($request); |
||
101 | $settings = $repository->getResourceSettings();*/ |
||
102 | |||
103 | /*$grid = $this->getGrid($request, $repository, $grid, $resourceNodeId, 'chamilo_core_resource_list'); |
||
104 | $parentResourceNode = $this->getParentResourceNode($request); |
||
105 | $this->setBreadCrumb($request, $parentResourceNode);*/ |
||
106 | |||
107 | //return $grid->getGridResponse( |
||
108 | /*return $this->render( |
||
109 | $repository->getTemplates()->getFromAction(__FUNCTION__), |
||
110 | [ |
||
111 | 'parent_id' => $resourceNodeId, |
||
112 | 'tool' => $tool, |
||
113 | 'type' => $type, |
||
114 | 'id' => $resourceNodeId, |
||
115 | 'parent_resource_node' => $parentResourceNode, |
||
116 | 'resource_settings' => $settings, |
||
117 | ] |
||
118 | ); |
||
119 | }*/ |
||
120 | |||
121 | /** |
||
122 | * @deprecated Use Vue |
||
123 | * |
||
124 | * @Route("/{tool}/{type}/{id}/new_folder", methods={"GET", "POST"}, name="chamilo_core_resource_new_folder") |
||
125 | */ |
||
126 | /*public function newFolderAction(Request $request): Response |
||
127 | { |
||
128 | return $this->createResource($request, 'folder'); |
||
129 | }*/ |
||
130 | |||
131 | /** |
||
132 | * @deprecated Use Vue |
||
133 | * |
||
134 | * @Route("/{tool}/{type}/{id}/new", methods={"GET", "POST"}, name="chamilo_core_resource_new") |
||
135 | */ |
||
136 | /*public function newAction(Request $request): Response |
||
137 | { |
||
138 | return $this->createResource($request, 'file'); |
||
139 | }*/ |
||
140 | |||
141 | /** |
||
142 | * @Route("/{tool}/{type}/{id}/disk_space", methods={"GET", "POST"}, name="chamilo_core_resource_disk_space") |
||
143 | */ |
||
144 | public function diskSpaceAction(Request $request): Response |
||
212 | ] |
||
213 | ); |
||
214 | } |
||
215 | |||
216 | /** |
||
217 | * @deprecated Use Vue |
||
218 | * |
||
219 | * @Route("/{tool}/{type}/{id}/edit", methods={"GET", "POST"}) |
||
220 | */ |
||
221 | public function editAction(Request $request, IllustrationRepository $illustrationRepo): Response |
||
293 | ] |
||
294 | ); |
||
295 | } |
||
296 | |||
297 | /** |
||
298 | * @deprecated use Vue |
||
299 | * |
||
300 | * Shows a resource information |
||
301 | * |
||
302 | * @Route("/{tool}/{type}/{id}/info", methods={"GET", "POST"}, name="chamilo_core_resource_info") |
||
303 | */ |
||
304 | /*public function infoAction(Request $request): Response |
||
305 | { |
||
306 | $nodeId = $request->get('id'); |
||
307 | $repository = $this->getRepositoryFromRequest($request); |
||
308 | |||
309 | $resource = $repository->getResourceFromResourceNode($nodeId); |
||
310 | $this->denyAccessUnlessValidResource($resource); |
||
311 | $resourceNode = $resource->getResourceNode(); |
||
312 | |||
313 | $this->denyAccessUnlessGranted( |
||
314 | ResourceNodeVoter::VIEW, |
||
315 | $resourceNode, |
||
316 | $this->trans(sprintf('Unauthorised access to resource #%s', $nodeId)) |
||
317 | ); |
||
318 | |||
319 | $this->setBreadCrumb($request, $resourceNode); |
||
320 | |||
321 | $tool = $request->get('tool'); |
||
322 | $type = $request->get('type'); |
||
323 | |||
324 | $form = $this->createForm(ResourceCommentType::class, null); |
||
325 | |||
326 | $params = [ |
||
327 | 'resource' => $resource, |
||
328 | 'course' => $this->getCourse(), |
||
329 | // 'illustration' => $illustration, |
||
330 | 'tool' => $tool, |
||
331 | 'type' => $type, |
||
332 | 'comment_form' => $form->createView(), |
||
333 | ]; |
||
334 | |||
335 | return $this->render( |
||
336 | $repository->getTemplates()->getFromAction(__FUNCTION__, $request->isXmlHttpRequest()), |
||
337 | $params |
||
338 | ); |
||
339 | }*/ |
||
340 | |||
341 | /** |
||
342 | * Preview a file. Mostly used when using a modal. |
||
343 | * |
||
344 | * @Route("/{tool}/{type}/{id}/preview", methods={"GET"}, name="chamilo_core_resource_preview") |
||
345 | */ |
||
346 | /*public function previewAction(Request $request): Response |
||
347 | { |
||
348 | $nodeId = $request->get('id'); |
||
349 | $repository = $this->getRepositoryFromRequest($request); |
||
350 | |||
351 | $resource = $repository->getResourceFromResourceNode($nodeId); |
||
352 | $this->denyAccessUnlessValidResource($resource); |
||
353 | |||
354 | $resourceNode = $resource->getResourceNode(); |
||
355 | $this->denyAccessUnlessGranted( |
||
356 | ResourceNodeVoter::VIEW, |
||
357 | $resourceNode, |
||
358 | $this->trans('Unauthorised access to resource') |
||
359 | ); |
||
360 | |||
361 | $this->setBreadCrumb($request, $resourceNode); |
||
362 | |||
363 | $tool = $request->get('tool'); |
||
364 | $type = $request->get('type'); |
||
365 | |||
366 | $params = [ |
||
367 | 'resource' => $resource, |
||
368 | 'tool' => $tool, |
||
369 | 'type' => $type, |
||
370 | ]; |
||
371 | |||
372 | return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $params); |
||
373 | }*/ |
||
374 | |||
375 | /** |
||
376 | * @deprecated use vue |
||
377 | * |
||
378 | * @Route("/{tool}/{type}/{id}/change_visibility", name="chamilo_core_resource_change_visibility") |
||
379 | */ |
||
380 | public function changeVisibilityAction(Request $request): Response |
||
381 | { |
||
382 | $id = (int) $request->get('id'); |
||
383 | |||
384 | $repository = $this->getRepositoryFromRequest($request); |
||
385 | |||
386 | $resource = $repository->getResourceFromResourceNode($id); |
||
387 | $this->denyAccessUnlessValidResource($resource); |
||
388 | /** @var AbstractResource $resource */ |
||
389 | $resourceNode = $resource->getResourceNode(); |
||
390 | |||
391 | $this->denyAccessUnlessGranted( |
||
392 | ResourceNodeVoter::EDIT, |
||
393 | $resourceNode, |
||
394 | $this->trans('Unauthorised access to resource') |
||
395 | ); |
||
396 | |||
397 | if ($this->hasCourse()) { |
||
398 | $link = $resource->getFirstResourceLinkFromCourseSession($this->getCourse(), $this->getSession()); |
||
399 | } else { |
||
400 | $link = $resource->getFirstResourceLink(); |
||
401 | } |
||
402 | |||
403 | // Use repository to change settings easily. |
||
404 | if ($link && ResourceLink::VISIBILITY_PUBLISHED === $link->getVisibility()) { |
||
405 | $repository->setVisibilityDraft($resource); |
||
406 | } else { |
||
407 | $repository->setVisibilityPublished($resource); |
||
408 | } |
||
409 | |||
410 | $result = [ |
||
411 | 'visibility' => $link->getVisibility(), |
||
412 | 'ok' => true, |
||
413 | ]; |
||
414 | |||
415 | return new JsonResponse($result); |
||
416 | } |
||
417 | |||
418 | /** |
||
419 | * @deprecated Use Vue + api platform |
||
420 | * |
||
421 | * @Route("/{tool}/{type}/{id}/delete", name="chamilo_core_resource_delete") |
||
422 | */ |
||
423 | public function deleteAction(Request $request): Response |
||
454 | } |
||
455 | |||
456 | /** |
||
457 | * @deprecated Use Vue + api platform |
||
458 | * |
||
459 | * @Route("/{tool}/{type}/{id}/delete_mass", methods={"DELETE"}, name="chamilo_core_resource_delete_mass") |
||
460 | */ |
||
461 | public function deleteMassAction($primaryKeys, $allPrimaryKeys, Request $request): Response |
||
492 | } |
||
493 | |||
494 | /** |
||
495 | * Shows the associated resource file. |
||
496 | * |
||
497 | * @deprecated use vue |
||
498 | * |
||
499 | * @Route("/{tool}/{type}/{id}/view_resource", methods={"GET"}, name="chamilo_core_resource_view_resource") |
||
500 | */ |
||
501 | /*public function viewResourceAction(Request $request, RouterInterface $router): Response |
||
502 | { |
||
503 | $id = $request->get('id'); |
||
504 | |||
505 | $resourceNode = $this->getResourceNodeRepository()->find($id); |
||
506 | |||
507 | if (null === $resourceNode) { |
||
508 | throw new FileNotFoundException('Resource not found'); |
||
509 | } |
||
510 | |||
511 | $this->denyAccessUnlessGranted( |
||
512 | ResourceNodeVoter::VIEW, |
||
513 | $resourceNode, |
||
514 | $this->trans('Unauthorised access to resource') |
||
515 | ); |
||
516 | |||
517 | $repository = $this->getRepositoryFromRequest($request); |
||
518 | |||
519 | $resource = $repository->getResourceFromResourceNode($id); |
||
520 | |||
521 | $tool = $request->get('tool'); |
||
522 | $type = $request->get('type'); |
||
523 | $this->setBreadCrumb($request, $resourceNode); |
||
524 | |||
525 | $params = [ |
||
526 | 'resource' => $resource, |
||
527 | 'tool' => $tool, |
||
528 | 'type' => $type, |
||
529 | ]; |
||
530 | |||
531 | return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $params); |
||
532 | }*/ |
||
533 | |||
534 | /** |
||
535 | * View file of a resource node. |
||
536 | * |
||
537 | * @Route("/{tool}/{type}/{id}/view", methods={"GET"}, name="chamilo_core_resource_view") |
||
538 | */ |
||
539 | public function viewAction(Request $request): Response |
||
550 | } |
||
551 | |||
552 | /** |
||
553 | * Redirect resource to link. |
||
554 | * |
||
555 | * @Route("/{tool}/{type}/{id}/link", methods={"GET"}, name="chamilo_core_resource_link") |
||
556 | */ |
||
557 | public function linkAction(Request $request, RouterInterface $router) |
||
558 | { |
||
559 | $id = $request->get('id'); |
||
560 | $resourceNode = $this->getResourceNodeRepository()->find($id); |
||
561 | |||
562 | if (null === $resourceNode) { |
||
563 | throw new FileNotFoundException('Resource not found'); |
||
564 | } |
||
565 | |||
566 | $repo = $this->getRepositoryFromRequest($request); |
||
567 | if ($repo instanceof ResourceWithLinkInterface) { |
||
568 | $resource = $repo->getResourceFromResourceNode($resourceNode->getId()); |
||
569 | $url = $repo->getLink($resource, $router, $this->getCourseUrlQueryToArray()); |
||
570 | |||
571 | return $this->redirect($url); |
||
572 | } |
||
573 | |||
574 | $this->abort('No redirect'); |
||
575 | } |
||
576 | |||
577 | /** |
||
578 | * Download file of a resource node. |
||
579 | * |
||
580 | * @Route("/{tool}/{type}/{id}/download", methods={"GET"}, name="chamilo_core_resource_download") |
||
581 | */ |
||
582 | public function downloadAction(Request $request) |
||
658 | } |
||
659 | |||
660 | /** |
||
661 | * Upload form. |
||
662 | * |
||
663 | * @deprecated use vue + api platform |
||
664 | * |
||
665 | * @Route("/{tool}/{type}/{id}/upload", name="chamilo_core_resource_upload", methods={"GET", "POST"}, |
||
666 | * options={"expose"=true}) |
||
667 | */ |
||
668 | /*public function uploadAction(Request $request, $tool, $type, $id): Response |
||
669 | { |
||
670 | $repository = $this->getRepositoryFromRequest($request); |
||
671 | $resourceNode = $repository->getResourceNodeRepository()->find($id); |
||
672 | |||
673 | $this->denyAccessUnlessGranted( |
||
674 | ResourceNodeVoter::EDIT, |
||
675 | $resourceNode, |
||
676 | $this->trans('Unauthorised access to resource') |
||
677 | ); |
||
678 | |||
679 | $this->setBreadCrumb($request, $resourceNode); |
||
680 | |||
681 | $routeParams = $this->getResourceParams($request); |
||
682 | $routeParams['tool'] = $tool; |
||
683 | $routeParams['type'] = $type; |
||
684 | $routeParams['id'] = $id; |
||
685 | |||
686 | return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $routeParams); |
||
687 | }*/ |
||
688 | |||
689 | /** |
||
690 | * @return mixed|StreamedResponse |
||
691 | */ |
||
692 | private function processFile(Request $request, ResourceNode $resourceNode, $mode = 'show', $filter = '') |
||
760 | } |
||
761 | |||
762 | /** |
||
763 | * @return RedirectResponse|Response |
||
764 | */ |
||
765 | private function createResource(Request $request, string $fileType = 'file') |
||
920 |