Passed
Pull Request — master (#5672)
by
unknown
08:53 queued 01:32
created

AdminController::listFilesInfo()   B

Complexity

Conditions 5
Paths 12

Size

Total Lines 71
Code Lines 56

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 56
nc 12
nop 1
dl 0
loc 71
rs 8.6488
c 0
b 0
f 0

How to fix   Long Method   

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
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Controller\Admin;
8
9
use Chamilo\CoreBundle\Controller\BaseController;
10
use Chamilo\CoreBundle\Entity\ResourceFile;
11
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
12
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
13
use Chamilo\CoreBundle\Settings\SettingsManager;
14
use Doctrine\ORM\EntityManagerInterface;
15
use Symfony\Component\HttpFoundation\Request;
16
use Symfony\Component\HttpFoundation\Response;
17
use Symfony\Component\Routing\Annotation\Route;
18
use Symfony\Component\Security\Http\Attribute\IsGranted;
19
use Vich\UploaderBundle\Storage\StorageInterface;
20
21
#[Route('/admin')]
22
class AdminController extends BaseController
23
{
24
    private const ITEMS_PER_PAGE = 50;
25
26
    public function __construct(
27
        private EntityManagerInterface $entityManager,
28
        private ResourceNodeRepository $resourceNodeRepository,
29
        private StorageInterface $storage,
30
        private AccessUrlHelper $accessUrlHelper
31
    ) {}
32
33
    #[IsGranted('ROLE_ADMIN')]
34
    #[Route('/register-campus', name: 'admin_register_campus', methods: ['POST'])]
35
    public function registerCampus(Request $request, SettingsManager $settingsManager): Response
36
    {
37
        $requestData = $request->toArray();
38
        $doNotListCampus = (bool) $requestData['donotlistcampus'];
39
40
        $settingsManager->setUrl($this->accessUrlHelper->getCurrent());
41
        $settingsManager->updateSetting('platform.registered', 'true');
42
43
        $settingsManager->updateSetting(
44
            'platform.donotlistcampus',
45
            $doNotListCampus ? 'true' : 'false'
46
        );
47
48
        return new Response('', Response::HTTP_NO_CONTENT);
49
    }
50
51
    #[IsGranted('ROLE_ADMIN')]
52
    #[Route('/files_info', name: 'admin_files_info', methods: ['GET'])]
53
    public function listFilesInfo(Request $request): Response
54
    {
55
        $page = $request->query->getInt('page', 1);
56
        $search = $request->query->get('search', '');
57
        $offset = ($page - 1) * self::ITEMS_PER_PAGE;
58
59
        $queryBuilder = $this->entityManager->getRepository(ResourceFile::class)->createQueryBuilder('rf')
60
            ->leftJoin('rf.resourceNode', 'rn')
61
            ->leftJoin('rn.resourceLinks', 'rl')
62
            ->leftJoin('rl.course', 'c')
63
            ->leftJoin('rl.user', 'u')
64
            ->addSelect('rn', 'rl', 'c', 'u');
65
66
        if ($search) {
67
            $queryBuilder->where('rf.title LIKE :search')
68
                ->orWhere('rf.originalName LIKE :search')
69
                ->orWhere('c.title LIKE :search')
70
                ->orWhere('u.username LIKE :search')
71
                ->orWhere('rn.uuid LIKE :search')
72
                ->setParameter('search', '%' . $search . '%');
73
        }
74
75
        $queryBuilder->orderBy('rf.id', 'DESC')
76
            ->setFirstResult($offset)
77
            ->setMaxResults(self::ITEMS_PER_PAGE);
78
79
        $files = $queryBuilder->getQuery()->getResult();
80
81
        $totalItemsQuery = $this->entityManager->getRepository(ResourceFile::class)
82
            ->createQueryBuilder('rf')
83
            ->leftJoin('rf.resourceNode', 'rn')
84
            ->leftJoin('rn.resourceLinks', 'rl')
85
            ->leftJoin('rl.course', 'c')
86
            ->leftJoin('rl.user', 'u')
87
            ->select('COUNT(rf.id)');
88
89
        if ($search) {
90
            $totalItemsQuery->where('rf.title LIKE :search')
91
                ->orWhere('rf.originalName LIKE :search')
92
                ->orWhere('c.title LIKE :search')
93
                ->orWhere('u.username LIKE :search')
94
                ->orWhere('rn.uuid LIKE :search')
95
                ->setParameter('search', '%' . $search . '%');
96
        }
97
98
        $totalItems = $totalItemsQuery->getQuery()->getSingleScalarResult();
99
        $totalPages = ceil($totalItems / self::ITEMS_PER_PAGE);
100
101
        $fileUrls = [];
102
        $filePaths = [];
103
        foreach ($files as $file) {
104
            $resourceNode = $file->getResourceNode();
105
            if ($resourceNode) {
106
                $fileUrls[$file->getId()] = $this->resourceNodeRepository->getResourceFileUrl($resourceNode);
107
                $creator = $resourceNode->getCreator();
108
            } else {
109
                $fileUrls[$file->getId()] = null;
110
                $creator = null;
111
            }
112
            $filePaths[$file->getId()] = $this->resourceNodeRepository->getFilename($file);
113
        }
114
115
        return $this->render('@ChamiloCore/Admin/files_info.html.twig', [
116
            'files' => $files,
117
            'fileUrls' => $fileUrls,
118
            'filePaths' => $filePaths,
119
            'totalPages' => $totalPages,
120
            'currentPage' => $page,
121
            'search' => $search,
122
        ]);
123
    }
124
}
125