Passed
Pull Request — master (#6330)
by
unknown
09:50
created

SessionController::getNextSession()   B

Complexity

Conditions 8
Paths 12

Size

Total Lines 55
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 32
c 0
b 0
f 0
nc 12
nop 4
dl 0
loc 55
rs 8.1635

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;
8
9
use BuyCoursesPlugin;
10
use Chamilo\CoreBundle\Entity\ExtraField;
11
use Chamilo\CoreBundle\Entity\SequenceResource;
12
use Chamilo\CoreBundle\Entity\Session;
13
use Chamilo\CoreBundle\Entity\SessionRelCourse;
14
use Chamilo\CoreBundle\Entity\Tag;
15
use Chamilo\CoreBundle\Entity\User;
16
use Chamilo\CoreBundle\Framework\Container;
17
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
18
use Chamilo\CoreBundle\Repository\Node\UserRepository;
19
use Chamilo\CoreBundle\Repository\SequenceRepository;
20
use Chamilo\CoreBundle\Repository\SequenceResourceRepository;
21
use Chamilo\CoreBundle\Repository\TagRepository;
22
use Chamilo\CourseBundle\Entity\CCourseDescription;
23
use CourseDescription;
24
use Doctrine\ORM\EntityManagerInterface;
25
use Doctrine\ORM\EntityRepository;
26
use Essence\Essence;
27
use ExtraFieldValue;
28
use Graphp\GraphViz\GraphViz;
29
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
30
use SessionManager;
31
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
32
use Symfony\Bundle\SecurityBundle\Security;
33
use Symfony\Component\HttpFoundation\JsonResponse;
34
use Symfony\Component\HttpFoundation\Request;
35
use Symfony\Component\HttpFoundation\Response;
36
use Symfony\Component\Routing\Attribute\Route;
37
use UserManager;
38
39
#[Route('/sessions')]
40
class SessionController extends AbstractController
41
{
42
    /**
43
     * @Entity("session", expr="repository.find(sid)")
44
     */
45
    #[Route(path: '/{sid}/about', name: 'chamilo_core_session_about')]
46
    public function about(
47
        Request $request,
48
        Session $session,
49
        IllustrationRepository $illustrationRepo,
50
        UserRepository $userRepo,
51
        EntityManagerInterface $em
52
    ): Response {
53
        $requestSession = $request->getSession();
54
        $htmlHeadXtra[] = api_get_asset('readmore-js/readmore.js');
0 ignored issues
show
Comprehensibility Best Practice introduced by
$htmlHeadXtra was never initialized. Although not strictly required by PHP, it is generally a good practice to add $htmlHeadXtra = array(); before regardless.
Loading history...
55
56
        $sessionId = $session->getId();
57
        $courses = [];
58
        $sessionCourses = $session->getCourses();
59
60
        /** @var EntityRepository $fieldsRepo */
61
        $fieldsRepo = $em->getRepository(ExtraField::class);
62
63
        /** @var TagRepository $tagRepo */
64
        $tagRepo = $em->getRepository(Tag::class);
65
66
        /** @var SequenceRepository $sequenceResourceRepo */
67
        $sequenceResourceRepo = $em->getRepository(SequenceResource::class);
68
69
        /** @var ExtraField $tagField */
70
        $tagField = $fieldsRepo->findOneBy([
71
            'itemType' => ExtraField::COURSE_FIELD_TYPE,
72
            'variable' => 'tags',
73
        ]);
74
75
        $courseValues = new ExtraFieldValue('course');
76
        $userValues = new ExtraFieldValue('user');
77
        $sessionValues = new ExtraFieldValue('session');
78
79
        /** @var SessionRelCourse $sessionRelCourse */
80
        foreach ($sessionCourses as $sessionRelCourse) {
81
            $sessionCourse = $sessionRelCourse->getCourse();
82
            $courseTags = [];
83
84
            if (null !== $tagField) {
85
                $courseTags = $tagRepo->getTagsByItem($tagField, $sessionCourse->getId());
86
            }
87
88
            $courseCoaches = $userRepo->getCoachesForSessionCourse($session, $sessionCourse);
89
            $coachesData = [];
90
91
            /** @var User $courseCoach */
92
            foreach ($courseCoaches as $courseCoach) {
93
                $coachData = [
94
                    'complete_name' => UserManager::formatUserFullName($courseCoach),
95
                    'image' => $illustrationRepo->getIllustrationUrl($courseCoach),
96
                    'diploma' => $courseCoach->getDiplomas(),
97
                    'openarea' => $courseCoach->getOpenarea(),
98
                    'extra_fields' => $userValues->getAllValuesForAnItem(
99
                        $courseCoach->getId(),
100
                        null,
101
                        true
102
                    ),
103
                ];
104
105
                $coachesData[] = $coachData;
106
            }
107
108
            $cd = new CourseDescription();
109
            $cd->set_course_id($sessionCourse->getId());
110
            $cd->set_session_id($session->getId());
111
            $descriptionsData = $cd->get_description_data();
112
113
            $courseDescription = [];
114
            $courseObjectives = [];
115
            $courseTopics = [];
116
            $courseMethodology = [];
117
            $courseMaterial = [];
118
            $courseResources = [];
119
            $courseAssessment = [];
120
            $courseCustom = [];
121
122
            if (!empty($descriptionsData)) {
123
                foreach ($descriptionsData as $descriptionInfo) {
124
                    $type = $descriptionInfo->getDescriptionType();
125
126
                    switch ($type) {
127
                        case CCourseDescription::TYPE_DESCRIPTION:
128
                            $courseDescription[] = $descriptionInfo;
129
130
                            break;
131
132
                        case CCourseDescription::TYPE_OBJECTIVES:
133
                            $courseObjectives[] = $descriptionInfo;
134
135
                            break;
136
137
                        case CCourseDescription::TYPE_TOPICS:
138
                            $courseTopics[] = $descriptionInfo;
139
140
                            break;
141
142
                        case CCourseDescription::TYPE_METHODOLOGY:
143
                            $courseMethodology[] = $descriptionInfo;
144
145
                            break;
146
147
                        case CCourseDescription::TYPE_COURSE_MATERIAL:
148
                            $courseMaterial[] = $descriptionInfo;
149
150
                            break;
151
152
                        case CCourseDescription::TYPE_RESOURCES:
153
                            $courseResources[] = $descriptionInfo;
154
155
                            break;
156
157
                        case CCourseDescription::TYPE_ASSESSMENT:
158
                            $courseAssessment[] = $descriptionInfo;
159
160
                            break;
161
162
                        case CCourseDescription::TYPE_CUSTOM:
163
                            $courseCustom[] = $descriptionInfo;
164
165
                            break;
166
                    }
167
                }
168
            }
169
170
            $courses[] = [
171
                'course' => $sessionCourse,
172
                'description' => $courseDescription,
173
                'image' => Container::getIllustrationRepository()->getIllustrationUrl($sessionCourse),
174
                'tags' => $courseTags,
175
                'objectives' => $courseObjectives,
176
                'topics' => $courseTopics,
177
                'methodology' => $courseMethodology,
178
                'material' => $courseMaterial,
179
                'resources' => $courseResources,
180
                'assessment' => $courseAssessment,
181
                'custom' => array_reverse($courseCustom),
182
                'coaches' => $coachesData,
183
                'extra_fields' => $courseValues->getAllValuesForAnItem(
184
                    $sessionCourse->getId(),
185
                    null,
186
                    true
187
                ),
188
            ];
189
        }
190
191
        $sessionDates = SessionManager::parseSessionDates($session, true);
192
193
        $hasRequirements = false;
194
195
        /*$sessionRequirements = $sequenceResourceRepo->getRequirements(
196
         * $session->getId(),
197
         * SequenceResource::SESSION_TYPE
198
         * );
199
         * foreach ($sessionRequirements as $sequence) {
200
         * if (!empty($sequence['requirements'])) {
201
         * $hasRequirements = true;
202
         * break;
203
         * }
204
         * }*/
205
        $plugin = BuyCoursesPlugin::create();
206
        $checker = $plugin->isEnabled();
207
        $sessionIsPremium = null;
208
        if ($checker) {
209
            $sessionIsPremium = $plugin->getItemByProduct(
210
                $sessionId,
211
                BuyCoursesPlugin::PRODUCT_TYPE_SESSION
212
            );
213
            if ([] !== $sessionIsPremium) {
214
                $requestSession->set('SessionIsPremium', true);
215
                $requestSession->set('sessionId', $sessionId);
216
            }
217
        }
218
219
        $redirectToSession = ('true' === Container::getSettingsManager()->getSetting('session.allow_redirect_to_session_after_inscription_about'));
220
        $redirectToSession = $redirectToSession ? '?s='.$sessionId : false;
221
222
        $coursesInThisSession = SessionManager::get_course_list_by_session_id($sessionId);
223
        $coursesCount = \count($coursesInThisSession);
224
        $redirectToSession = 1 === $coursesCount && $redirectToSession
225
            ? ($redirectToSession.'&cr='.array_values($coursesInThisSession)[0]['directory'])
226
            : $redirectToSession;
227
228
        $essence = new Essence();
229
230
        $params = [
231
            'session' => $session,
232
            'redirect_to_session' => $redirectToSession,
233
            'courses' => $courses,
234
            'essence' => $essence,
235
            'session_extra_fields' => $sessionValues->getAllValuesForAnItem($session->getId(), null, true),
236
            'has_requirements' => $hasRequirements,
237
            // 'sequences' => $sessionRequirements,
238
            'is_premium' => $sessionIsPremium,
239
            'show_tutor' => 'true' === api_get_setting('show_session_coach'),
240
            'page_url' => api_get_path(WEB_PATH).\sprintf('sessions/%s/about/', $session->getId()),
241
            'session_date' => $sessionDates,
242
            'is_subscribed' => SessionManager::isUserSubscribedAsStudent(
243
                $session->getId(),
244
                api_get_user_id()
245
            ),
246
            'user_session_time' => SessionManager::getDayLeftInSession(
247
                [
248
                    'id' => $session->getId(),
249
                    'duration' => $session->getDuration(),
250
                ],
251
                api_get_user_id()
252
            ),
253
            'base_url' => $request->getSchemeAndHttpHost(),
254
        ];
255
256
        return $this->render('@ChamiloCore/Session/about.html.twig', $params);
257
    }
258
259
    #[Route('/{sessionId}/next-session', name: 'chamilo_session_next_session')]
260
    public function getNextSession(
261
        int $sessionId,
262
        Request $request,
263
        SequenceResourceRepository $repo,
264
        Security $security
265
    ): JsonResponse {
266
267
        $requirementAndDependencies = $repo->getRequirementAndDependencies(
268
            $sessionId,
269
            SequenceResource::SESSION_TYPE
270
        );
271
272
        $requirements = [];
273
        $dependencies = [];
274
275
        if (!empty($requirementAndDependencies['requirements'])) {
276
            foreach ($requirementAndDependencies['requirements'] as $requirement) {
277
                $requirements[] = [
278
                    'id' => $requirement['id'],
279
                    'name' => $requirement['name'],
280
                    'admin_link' => $requirement['admin_link'],
281
                ];
282
            }
283
        }
284
285
        if (!empty($requirementAndDependencies['dependencies'])) {
286
            foreach ($requirementAndDependencies['dependencies'] as $dependency) {
287
                $dependencies[] = [
288
                    'id' => $dependency['id'],
289
                    'name' => $dependency['name'],
290
                    'admin_link' => $dependency['admin_link'],
291
                ];
292
            }
293
        }
294
295
        $sequenceResource = $repo->findRequirementForResource(
296
            $sessionId,
297
            SequenceResource::SESSION_TYPE
298
        );
299
300
        $graphImage = null;
301
        if ($sequenceResource && $sequenceResource->hasGraph()) {
302
            $graph = $sequenceResource->getSequence()->getUnSerializeGraph();
303
            if ($graph !== null) {
304
                $graph->setAttribute('graphviz.node.fontname', 'arial');
305
                $graphviz = new GraphViz();
306
                $graphImage = $graphviz->createImageSrc($graph);
307
            }
308
        }
309
310
        return new JsonResponse([
311
            'requirements' => $requirements,
312
            'dependencies' => $dependencies,
313
            'graph' => $graphImage,
314
        ]);
315
    }
316
}
317