Passed
Pull Request — master (#6243)
by
unknown
13:17
created

AdminController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 0
nc 1
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
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\ResourceLink;
11
use Chamilo\CoreBundle\Entity\ResourceType;
12
use Chamilo\CoreBundle\Repository\ResourceFileRepository;
13
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
14
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
15
use Chamilo\CoreBundle\Settings\SettingsManager;
16
use Doctrine\ORM\EntityManagerInterface;
17
use Symfony\Component\HttpFoundation\Request;
18
use Symfony\Component\HttpFoundation\Response;
19
use Symfony\Component\Routing\Annotation\Route;
20
use Symfony\Component\Security\Http\Attribute\IsGranted;
21
22
#[Route('/admin')]
23
class AdminController extends BaseController
24
{
25
    private const ITEMS_PER_PAGE = 50;
26
27
    public function __construct(
28
        private readonly ResourceNodeRepository $resourceNodeRepository,
29
        private readonly AccessUrlHelper $accessUrlHelper
30
    ) {}
31
32
    #[IsGranted('ROLE_ADMIN')]
33
    #[Route('/register-campus', name: 'admin_register_campus', methods: ['POST'])]
34
    public function registerCampus(Request $request, SettingsManager $settingsManager): Response
35
    {
36
        $requestData = $request->toArray();
37
        $doNotListCampus = (bool) $requestData['donotlistcampus'];
38
39
        $settingsManager->setUrl($this->accessUrlHelper->getCurrent());
40
        $settingsManager->updateSetting('platform.registered', 'true');
41
42
        $settingsManager->updateSetting(
43
            'platform.donotlistcampus',
44
            $doNotListCampus ? 'true' : 'false'
45
        );
46
47
        return new Response('', Response::HTTP_NO_CONTENT);
48
    }
49
50
    #[IsGranted('ROLE_ADMIN')]
51
    #[Route('/files_info', name: 'admin_files_info', methods: ['GET'])]
52
    public function listFilesInfo(Request $request, ResourceFileRepository $resourceFileRepository): Response
53
    {
54
        $page = $request->query->getInt('page', 1);
55
        $search = $request->query->get('search', '');
56
        $offset = ($page - 1) * self::ITEMS_PER_PAGE;
57
58
        $files = $resourceFileRepository->searchFiles($search, $offset, self::ITEMS_PER_PAGE);
59
        $totalItems = $resourceFileRepository->countFiles($search);
60
        $totalPages = $totalItems > 0 ? ceil($totalItems / self::ITEMS_PER_PAGE) : 1;
61
62
        $fileUrls = [];
63
        $filePaths = [];
64
        foreach ($files as $file) {
65
            $resourceNode = $file->getResourceNode();
66
            if ($resourceNode) {
67
                $fileUrls[$file->getId()] = $this->resourceNodeRepository->getResourceFileUrl($resourceNode);
68
                $creator = $resourceNode->getCreator();
69
            } else {
70
                $fileUrls[$file->getId()] = null;
71
                $creator = null;
72
            }
73
            $filePaths[$file->getId()] = '/upload/resource'.$this->resourceNodeRepository->getFilename($file);
74
        }
75
76
        return $this->render('@ChamiloCore/Admin/files_info.html.twig', [
77
            'files' => $files,
78
            'fileUrls' => $fileUrls,
79
            'filePaths' => $filePaths,
80
            'totalPages' => $totalPages,
81
            'currentPage' => $page,
82
            'search' => $search,
83
        ]);
84
    }
85
86
    #[IsGranted('ROLE_ADMIN')]
87
    #[Route('/resources_info', name: 'admin_resources_info', methods: ['GET'])]
88
    public function listResourcesInfo(Request $request, ResourceNodeRepository $resourceNodeRepo, EntityManagerInterface $em): Response
89
    {
90
        $resourceTypeId = $request->query->getInt('type');
91
        $resourceTypes = $em->getRepository(ResourceType::class)->findAll();
92
93
        $courses = [];
94
        if ($resourceTypeId > 0) {
95
            $resourceLinks = $em->getRepository(ResourceLink::class)->createQueryBuilder('rl')
96
                ->join('rl.resourceNode', 'rn')
97
                ->where('rn.resourceType = :type')
98
                ->setParameter('type', $resourceTypeId)
99
                ->getQuery()
100
                ->getResult();
101
102
            $seen = [];
103
            foreach ($resourceLinks as $link) {
104
                $course = $link->getCourse();
105
                $session = $link->getSession();
106
                $node = $link->getResourceNode();
107
108
                if (!$course) {
109
                    continue;
110
                }
111
112
                $key = $session
113
                    ? 's'.$session->getId().'-'.$course->getId()
114
                    : 'c'.$course->getId();
115
116
                if (!isset($seen[$key])) {
117
                    $seen[$key] = [
118
                        'type' => $session ? 'session' : 'course',
119
                        'id' => $session ? $session->getId() : $course->getId(),
120
                        'title' => $session ? $session->getTitle().' - '.$course->getTitle() : $course->getTitle(),
121
                        'url' => $session
122
                            ? '/course/'.$course->getId().'/home?sid='.$session->getId()
123
                            : '/course/'.$course->getId().'/home',
124
                        'count' => 0,
125
                        'items' => [],
126
                        'firstCreatedAt' => $node->getCreatedAt(),
127
                    ];
128
                }
129
130
                $seen[$key]['count']++;
131
                $seen[$key]['items'][] = $node->getTitle();
132
133
                if ($node->getCreatedAt() < $seen[$key]['firstCreatedAt']) {
134
                    $seen[$key]['firstCreatedAt'] = $node->getCreatedAt();
135
                }
136
            }
137
138
            $courses = array_values($seen);
139
            usort($courses, fn($a, $b) => strnatcasecmp($a['title'], $b['title']));
140
        }
141
142
        return $this->render('@ChamiloCore/Admin/resources_info.html.twig', [
143
            'resourceTypes' => $resourceTypes,
144
            'selectedType' => $resourceTypeId,
145
            'courses' => $courses,
146
        ]);
147
    }
148
}
149