Passed
Pull Request — master (#6357)
by
unknown
09:27
created

SessionController   A

Complexity

Total Complexity 28

Size/Duplication

Total Lines 316
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 186
dl 0
loc 316
rs 10
c 0
b 0
f 0
wmc 28

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
F about() 0 212 19
B sendCourseNotification() 0 92 8
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\SessionRelUser;
15
use Chamilo\CoreBundle\Entity\Tag;
16
use Chamilo\CoreBundle\Entity\User;
17
use Chamilo\CoreBundle\Framework\Container;
18
use Chamilo\CoreBundle\Helpers\MessageHelper;
19
use Chamilo\CoreBundle\Helpers\UserHelper;
20
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
21
use Chamilo\CoreBundle\Repository\Node\UserRepository;
22
use Chamilo\CoreBundle\Repository\SequenceRepository;
23
use Chamilo\CoreBundle\Repository\TagRepository;
24
use Chamilo\CourseBundle\Entity\CCourseDescription;
25
use CourseDescription;
26
use Doctrine\ORM\EntityManagerInterface;
27
use Doctrine\ORM\EntityRepository;
28
use Essence\Essence;
29
use ExtraFieldValue;
30
use SessionManager;
31
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
32
use Symfony\Component\HttpFoundation\Request;
33
use Symfony\Component\HttpFoundation\RequestStack;
34
use Symfony\Component\HttpFoundation\Response;
35
use Symfony\Component\Routing\Attribute\Route;
36
use Symfony\Contracts\Translation\TranslatorInterface;
37
use UserManager;
38
39
#[Route('/sessions')]
40
class SessionController extends AbstractController
41
{
42
43
    public function __construct(
44
        private readonly UserHelper $userHelper,
45
        private readonly TranslatorInterface $translator,
46
        private readonly RequestStack $requestStack
47
    ) {}
48
49
    #[Route(path: '/{sid}/about', name: 'chamilo_core_session_about')]
50
    public function about(
51
        Request $request,
52
        Session $session,
53
        IllustrationRepository $illustrationRepo,
54
        UserRepository $userRepo,
55
        EntityManagerInterface $em
56
    ): Response {
57
        $requestSession = $request->getSession();
58
        $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...
59
60
        $sessionId = $session->getId();
61
        $courses = [];
62
        $sessionCourses = $session->getCourses();
63
64
        /** @var EntityRepository $fieldsRepo */
65
        $fieldsRepo = $em->getRepository(ExtraField::class);
66
67
        /** @var TagRepository $tagRepo */
68
        $tagRepo = $em->getRepository(Tag::class);
69
70
        /** @var SequenceRepository $sequenceResourceRepo */
71
        $sequenceResourceRepo = $em->getRepository(SequenceResource::class);
72
73
        /** @var ExtraField $tagField */
74
        $tagField = $fieldsRepo->findOneBy([
75
            'itemType' => ExtraField::COURSE_FIELD_TYPE,
76
            'variable' => 'tags',
77
        ]);
78
79
        $courseValues = new ExtraFieldValue('course');
80
        $userValues = new ExtraFieldValue('user');
81
        $sessionValues = new ExtraFieldValue('session');
82
83
        /** @var SessionRelCourse $sessionRelCourse */
84
        foreach ($sessionCourses as $sessionRelCourse) {
85
            $sessionCourse = $sessionRelCourse->getCourse();
86
            $courseTags = [];
87
88
            if (null !== $tagField) {
89
                $courseTags = $tagRepo->getTagsByItem($tagField, $sessionCourse->getId());
90
            }
91
92
            $courseCoaches = $userRepo->getCoachesForSessionCourse($session, $sessionCourse);
93
            $coachesData = [];
94
95
            /** @var User $courseCoach */
96
            foreach ($courseCoaches as $courseCoach) {
97
                $coachData = [
98
                    'complete_name' => UserManager::formatUserFullName($courseCoach),
99
                    'image' => $illustrationRepo->getIllustrationUrl($courseCoach),
100
                    'diploma' => $courseCoach->getDiplomas(),
101
                    'openarea' => $courseCoach->getOpenarea(),
102
                    'extra_fields' => $userValues->getAllValuesForAnItem(
103
                        $courseCoach->getId(),
104
                        null,
105
                        true
106
                    ),
107
                ];
108
109
                $coachesData[] = $coachData;
110
            }
111
112
            $cd = new CourseDescription();
113
            $cd->set_course_id($sessionCourse->getId());
114
            $cd->set_session_id($session->getId());
115
            $descriptionsData = $cd->get_description_data();
116
117
            $courseDescription = [];
118
            $courseObjectives = [];
119
            $courseTopics = [];
120
            $courseMethodology = [];
121
            $courseMaterial = [];
122
            $courseResources = [];
123
            $courseAssessment = [];
124
            $courseCustom = [];
125
126
            if (!empty($descriptionsData)) {
127
                foreach ($descriptionsData as $descriptionInfo) {
128
                    $type = $descriptionInfo->getDescriptionType();
129
130
                    switch ($type) {
131
                        case CCourseDescription::TYPE_DESCRIPTION:
132
                            $courseDescription[] = $descriptionInfo;
133
134
                            break;
135
136
                        case CCourseDescription::TYPE_OBJECTIVES:
137
                            $courseObjectives[] = $descriptionInfo;
138
139
                            break;
140
141
                        case CCourseDescription::TYPE_TOPICS:
142
                            $courseTopics[] = $descriptionInfo;
143
144
                            break;
145
146
                        case CCourseDescription::TYPE_METHODOLOGY:
147
                            $courseMethodology[] = $descriptionInfo;
148
149
                            break;
150
151
                        case CCourseDescription::TYPE_COURSE_MATERIAL:
152
                            $courseMaterial[] = $descriptionInfo;
153
154
                            break;
155
156
                        case CCourseDescription::TYPE_RESOURCES:
157
                            $courseResources[] = $descriptionInfo;
158
159
                            break;
160
161
                        case CCourseDescription::TYPE_ASSESSMENT:
162
                            $courseAssessment[] = $descriptionInfo;
163
164
                            break;
165
166
                        case CCourseDescription::TYPE_CUSTOM:
167
                            $courseCustom[] = $descriptionInfo;
168
169
                            break;
170
                    }
171
                }
172
            }
173
174
            $courses[] = [
175
                'course' => $sessionCourse,
176
                'description' => $courseDescription,
177
                'image' => Container::getIllustrationRepository()->getIllustrationUrl($sessionCourse),
178
                'tags' => $courseTags,
179
                'objectives' => $courseObjectives,
180
                'topics' => $courseTopics,
181
                'methodology' => $courseMethodology,
182
                'material' => $courseMaterial,
183
                'resources' => $courseResources,
184
                'assessment' => $courseAssessment,
185
                'custom' => array_reverse($courseCustom),
186
                'coaches' => $coachesData,
187
                'extra_fields' => $courseValues->getAllValuesForAnItem(
188
                    $sessionCourse->getId(),
189
                    null,
190
                    true
191
                ),
192
            ];
193
        }
194
195
        $sessionDates = SessionManager::parseSessionDates($session, true);
196
197
        $hasRequirements = false;
198
199
        /*$sessionRequirements = $sequenceResourceRepo->getRequirements(
200
         * $session->getId(),
201
         * SequenceResource::SESSION_TYPE
202
         * );
203
         * foreach ($sessionRequirements as $sequence) {
204
         * if (!empty($sequence['requirements'])) {
205
         * $hasRequirements = true;
206
         * break;
207
         * }
208
         * }*/
209
        $plugin = BuyCoursesPlugin::create();
210
        $checker = $plugin->isEnabled();
211
        $sessionIsPremium = null;
212
        if ($checker) {
213
            $sessionIsPremium = $plugin->getItemByProduct(
214
                $sessionId,
215
                BuyCoursesPlugin::PRODUCT_TYPE_SESSION
216
            );
217
            if ([] !== $sessionIsPremium) {
218
                $requestSession->set('SessionIsPremium', true);
219
                $requestSession->set('sessionId', $sessionId);
220
            }
221
        }
222
223
        $redirectToSession = ('true' === Container::getSettingsManager()->getSetting('session.allow_redirect_to_session_after_inscription_about'));
224
        $redirectToSession = $redirectToSession ? '?s='.$sessionId : false;
225
226
        $coursesInThisSession = SessionManager::get_course_list_by_session_id($sessionId);
227
        $coursesCount = \count($coursesInThisSession);
228
        $redirectToSession = 1 === $coursesCount && $redirectToSession
229
            ? ($redirectToSession.'&cr='.array_values($coursesInThisSession)[0]['directory'])
230
            : $redirectToSession;
231
232
        $essence = new Essence();
233
234
        $params = [
235
            'session' => $session,
236
            'redirect_to_session' => $redirectToSession,
237
            'courses' => $courses,
238
            'essence' => $essence,
239
            'session_extra_fields' => $sessionValues->getAllValuesForAnItem($session->getId(), null, true),
240
            'has_requirements' => $hasRequirements,
241
            // 'sequences' => $sessionRequirements,
242
            'is_premium' => $sessionIsPremium,
243
            'show_tutor' => 'true' === api_get_setting('show_session_coach'),
244
            'page_url' => api_get_path(WEB_PATH).\sprintf('sessions/%s/about/', $session->getId()),
245
            'session_date' => $sessionDates,
246
            'is_subscribed' => SessionManager::isUserSubscribedAsStudent(
247
                $session->getId(),
248
                api_get_user_id()
249
            ),
250
            'user_session_time' => SessionManager::getDayLeftInSession(
251
                [
252
                    'id' => $session->getId(),
253
                    'duration' => $session->getDuration(),
254
                ],
255
                api_get_user_id()
256
            ),
257
            'base_url' => $request->getSchemeAndHttpHost(),
258
        ];
259
260
        return $this->render('@ChamiloCore/Session/about.html.twig', $params);
261
    }
262
263
    #[Route('/{id}/send-course-notification', name: 'chamilo_core_session_send_course_notification', methods: ['POST'])]
264
    public function sendCourseNotification(
265
        int $id,
266
        Request $request,
267
        UserRepository $userRepo,
268
        EntityManagerInterface $em,
269
        MessageHelper $messageHelper
270
    ): Response {
271
        $session = $em->getRepository(Session::class)->find($id);
272
        $currentUser = $this->userHelper->getCurrent();
273
274
        if (!$session) {
275
            return $this->json(['error' => 'Session not found'], Response::HTTP_NOT_FOUND);
276
        }
277
278
        $studentId = $request->request->get('studentId');
279
        if (!$studentId) {
280
            return $this->json(['error' => 'Missing studentId'], Response::HTTP_BAD_REQUEST);
281
        }
282
283
        $user = $userRepo->find($studentId);
284
        if (!$user) {
285
            return $this->json(['error' => 'User not found'], Response::HTTP_NOT_FOUND);
286
        }
287
288
        $email = $user->getEmail();
289
        if (empty($email)) {
290
            return $this->json(['error' => 'User has no email address.'], Response::HTTP_BAD_REQUEST);
291
        }
292
293
        if (!$user->isActive()) {
294
            $user->setActive(1);
295
            $em->persist($user);
296
            $em->flush();
297
        }
298
299
        $now = new \DateTime();
300
        $relSessions = $em->getRepository(SessionRelUser::class)->findBy([
301
            'user' => $user,
302
            'relationType' => Session::STUDENT,
303
        ]);
304
305
        $activeSessions = array_filter($relSessions, function (SessionRelUser $rel) use ($now) {
306
            $s = $rel->getSession();
307
            return $s->getAccessStartDate() <= $now && $s->getAccessEndDate() >= $now;
308
        });
309
310
        $sessionListHtml = '';
311
        foreach ($activeSessions as $rel) {
312
            $session = $rel->getSession();
313
            $sessionListHtml .= '<li>' . htmlspecialchars($session->getTitle()) . '</li>';
314
        }
315
316
        $request = $this->requestStack->getCurrentRequest();
317
        $baseUrl = $request->getSchemeAndHttpHost().$request->getBasePath();
318
        $sessionUrl = $baseUrl.'/sessions';
319
320
        $subject = $this->translator->trans('You have been enrolled in a new course');
321
322
        $body = $this->translator->trans(
323
            'Hello %s,<br><br>'.
324
            'You have been enrolled in a new session: <strong>%s</strong>.<br>'.
325
            'You can access your courses from <a href="%s">here</a>.<br><br>'.
326
            'Your current active sessions are:<br><ul>%s</ul><br>'.
327
            'Best regards,<br>'.
328
            'Chamilo'
329
        );
330
331
        $body = sprintf(
332
            $body,
333
            $user->getFullName(),
334
            $session->getTitle(),
335
            $sessionUrl,
336
            $sessionListHtml
337
        );
338
339
        $messageHelper->sendMessage(
340
            $user->getId(),
341
            $subject,
342
            $body,
343
            [],
344
            [],
345
            0,
346
            0,
347
            0,
348
            $currentUser->getId(),
349
            0,
350
            false,
351
            true
352
        );
353
354
        return $this->json(['success' => true]);
355
    }
356
357
}
358