Passed
Push — dependabot/github_actions/code... ( 154cc6...3e3012 )
by
unknown
26:36 queued 15:59
created

UserToJsonNormalizer::serializeUserData()   F

Complexity

Conditions 25

Size

Total Lines 230
Code Lines 140

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 25
eloc 140
nop 1
dl 0
loc 230
rs 3.3333
c 0
b 0
f 0

How to fix   Long Method    Complexity   

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
namespace Chamilo\CoreBundle\Serializer;
6
7
use Chamilo\CoreBundle\Entity\GradebookCertificate;
8
use Chamilo\CoreBundle\Entity\GradebookResult;
9
use Chamilo\CoreBundle\Entity\Message;
10
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
11
use Chamilo\CoreBundle\Entity\Ticket;
12
use Chamilo\CoreBundle\Entity\TicketMessage;
13
use Chamilo\CoreBundle\Entity\TrackEAccess;
14
use Chamilo\CoreBundle\Entity\TrackEAttempt;
15
use Chamilo\CoreBundle\Entity\TrackECourseAccess;
16
use Chamilo\CoreBundle\Entity\TrackEDefault;
17
use Chamilo\CoreBundle\Entity\TrackEDownloads;
18
use Chamilo\CoreBundle\Entity\TrackEExercise;
19
use Chamilo\CoreBundle\Entity\TrackELastaccess;
20
use Chamilo\CoreBundle\Entity\TrackELogin;
21
use Chamilo\CoreBundle\Entity\TrackEOnline;
22
use Chamilo\CoreBundle\Entity\TrackEUploads;
23
use Chamilo\CoreBundle\Entity\User;
24
use Chamilo\CoreBundle\Entity\UserCourseCategory;
25
use Chamilo\CoreBundle\Entity\UserRelCourseVote;
26
use Chamilo\CoreBundle\Repository\Node\UserRepository;
27
use Chamilo\CourseBundle\Entity\CAttendanceResult;
28
use Chamilo\CourseBundle\Entity\CAttendanceSheet;
29
use Chamilo\CourseBundle\Entity\CDropboxFeedback;
30
use Chamilo\CourseBundle\Entity\CDropboxFile;
31
use Chamilo\CourseBundle\Entity\CDropboxPerson;
32
use Chamilo\CourseBundle\Entity\CForumPost;
33
use Chamilo\CourseBundle\Entity\CForumThread;
34
use Chamilo\CourseBundle\Entity\CGroupRelUser;
35
use Chamilo\CourseBundle\Entity\CLpView;
36
use Chamilo\CourseBundle\Entity\CNotebook;
37
use Chamilo\CourseBundle\Entity\CStudentPublication;
38
use Chamilo\CourseBundle\Entity\CStudentPublicationComment;
39
use Chamilo\CourseBundle\Entity\CSurveyAnswer;
40
use Chamilo\CourseBundle\Entity\CWiki;
41
use DateTimeInterface;
42
use Doctrine\ORM\EntityManager;
43
use Doctrine\ORM\Exception\NotSupported;
44
use Doctrine\ORM\NonUniqueResultException;
45
use Doctrine\ORM\NoResultException;
46
use Exception;
47
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
48
use Symfony\Component\Serializer\SerializerInterface;
49
50
final class UserToJsonNormalizer
51
{
52
    private EntityManager $em;
53
    private UserRepository $userRepository;
54
    private SerializerInterface $serializer;
55
56
    public function __construct(EntityManager $em, UserRepository $userRepository, SerializerInterface $serializer)
57
    {
58
        $this->em = $em;
59
        $this->userRepository = $userRepository;
60
        $this->serializer = $serializer;
61
    }
62
63
    /**
64
     * Serialize the whole entity to an array.
65
     *
66
     * @param array $substitutionTerms Substitute terms for some elements
67
     *
68
     * @throws NotSupported
69
     * @throws NoResultException
70
     * @throws NonUniqueResultException
71
     */
72
    public function getPersonalDataToJson(int $userId, array $substitutionTerms): string
73
    {
74
        $em = $this->em;
75
        $dateFormat = DateTimeInterface::ATOM;
76
77
        /** @var User $user */
78
        $user = $this->userRepository->find($userId);
79
80
        $user->setPassword($substitutionTerms['password'] ?? '');
81
        $user->setSalt($substitutionTerms['salt'] ?? '');
82
83
        $noDataLabel = $substitutionTerms['empty'] ?? '';
84
85
        // Dummy content
86
        $user->setDateOfBirth(null);
87
        $user->setLocale($noDataLabel);
88
        $user->setTimezone($noDataLabel);
89
        $user->setWebsite($noDataLabel);
90
91
        // GradebookCertificate
92
        $result = $em->getRepository(GradebookCertificate::class)->findBy([
93
            'user' => $userId,
94
        ]);
95
        $gradebookCertificate = [];
96
97
        /** @var GradebookCertificate $item */
98
        foreach ($result as $item) {
99
            $createdAt = $item->getCreatedAt()->format($dateFormat);
100
            $list = [
101
                'Score: '.$item->getScoreCertificate(),
102
                'Path: '.$item->getPathCertificate(),
103
                'Created at: '.$createdAt,
104
            ];
105
            $gradebookCertificate[] = implode(', ', $list);
106
        }
107
108
        // TrackEExercises
109
        $result = $em->getRepository(TrackEExercise::class)->findBy([
110
            'user' => $userId,
111
        ]);
112
        $trackEExercises = [];
113
114
        /** @var TrackEExercise $item */
115
        foreach ($result as $item) {
116
            $date = $item->getExeDate()->format($dateFormat);
117
            $list = [
118
                'IP: '.$item->getUserIp(),
119
                'Start: '.$date,
120
                'Status: '.$item->getStatus(),
121
            ];
122
            $trackEExercises[] = implode(', ', $list);
123
        }
124
125
        // TrackEAttempt
126
        $result = $em->getRepository(TrackEAttempt::class)->findBy([
127
            'user' => $userId,
128
        ]);
129
        $trackEAttempt = [];
130
131
        /** @var TrackEAttempt $item */
132
        foreach ($result as $item) {
133
            $date = $item->getTms()->format($dateFormat);
134
            $list = [
135
                'Attempt #'.$item->getTrackEExercise()->getExeId(),
136
                // 'Answer: '.$item->getAnswer(),
137
                // 'Marks: '.$item->getMarks(),
138
                'Position: '.$item->getPosition(),
139
                'Date: '.$date,
140
            ];
141
            $trackEAttempt[] = implode(', ', $list);
142
        }
143
144
        // TrackECourseAccess
145
        $result = $em->getRepository(TrackECourseAccess::class)->findBy([
146
            'user' => $userId,
147
        ]);
148
        $trackECourseAccessList = [];
149
150
        /** @var TrackECourseAccess $item */
151
        foreach ($result as $item) {
152
            $startDate = $item->getLoginCourseDate()->format($dateFormat);
153
            $endDate = null !== $item->getLogoutCourseDate() ? $item->getLogoutCourseDate()->format($dateFormat) : '';
154
            $list = [
155
                'IP: '.$item->getUserIp(),
156
                'Start: '.$startDate,
157
                'End: '.$endDate,
158
            ];
159
            $trackECourseAccessList[] = implode(', ', $list);
160
        }
161
162
        $checkEntities = [
163
            TrackELogin::class => 'user',
164
            TrackEAccess::class => 'accessUserId',
165
            TrackEOnline::class => 'loginUserId',
166
            TrackEDefault::class => 'defaultUserId',
167
            TrackELastaccess::class => 'accessUserId',
168
            TrackEUploads::class => 'uploadUserId',
169
            GradebookResult::class => 'user',
170
            TrackEDownloads::class => 'downUserId',
171
        ];
172
173
        $maxResults = 1000;
174
        $trackResults = [];
175
        foreach ($checkEntities as $entity => $field) {
176
            $qb = $em->createQueryBuilder();
177
            $qb->select($qb->expr()->count('l'))
178
                ->from($entity, 'l')
179
                ->where("l.$field = :login")
180
                ->setParameter('login', $userId)
181
            ;
182
            $query = $qb->getQuery();
183
            $count = $query->getSingleScalarResult();
184
185
            if ($count > $maxResults) {
186
                $qb = $em->getRepository($entity)->createQueryBuilder('l');
187
                $qb
188
                    ->select('l')
189
                    ->where("l.$field = :login")
190
                    ->setParameter('login', $userId)
191
                ;
192
                $qb
193
                    ->setFirstResult(0)
194
                    ->setMaxResults($maxResults)
195
                ;
196
                $result = $qb->getQuery()->getResult();
197
            } else {
198
                $criteria = [
199
                    $field => $userId,
200
                ];
201
                $result = $em->getRepository($entity)->findBy($criteria);
202
            }
203
            $trackResults[$entity] = $result;
204
        }
205
206
        $trackELoginList = [];
207
208
        /** @var TrackELogin $item */
209
        foreach ($trackResults[TrackELogin::class] as $item) {
210
            $startDate = $item->getLoginDate()->format($dateFormat);
211
            $endDate = null !== $item->getLogoutDate() ? $item->getLogoutDate()->format($dateFormat) : '';
212
            $list = [
213
                'IP: '.$item->getUserIp(),
214
                'Start: '.$startDate,
215
                'End: '.$endDate,
216
            ];
217
            $trackELoginList[] = implode(', ', $list);
218
        }
219
220
        // TrackEAccess
221
        $trackEAccessList = [];
222
223
        /** @var TrackEAccess $item */
224
        foreach ($trackResults[TrackEAccess::class] as $item) {
225
            $date = $item->getAccessDate()->format($dateFormat);
226
            $list = [
227
                'IP: '.$item->getUserIp(),
228
                'Tool: '.$item->getAccessTool(),
229
                'End: '.$date,
230
            ];
231
            $trackEAccessList[] = implode(', ', $list);
232
        }
233
234
        // TrackEOnline
235
        $trackEOnlineList = [];
236
237
        /** @var TrackEOnline $item */
238
        foreach ($trackResults[TrackEOnline::class] as $item) {
239
            $date = $item->getLoginDate()->format($dateFormat);
240
            $list = [
241
                'IP: '.$item->getUserIp(),
242
                'Login date: '.$date,
243
                'Course # '.$item->getCId(),
244
                'Session # '.$item->getSessionId(),
245
            ];
246
            $trackEOnlineList[] = implode(', ', $list);
247
        }
248
249
        // TrackEDefault
250
        $trackEDefault = [];
251
252
        /** @var TrackEDefault $item */
253
        foreach ($trackResults[TrackEDefault::class] as $item) {
254
            $date = $item->getDefaultDate()->format($dateFormat);
255
            $list = [
256
                'Type: '.$item->getDefaultEventType(),
257
                'Value: '.$item->getDefaultValue(),
258
                'Value type: '.$item->getDefaultValueType(),
259
                'Date: '.$date,
260
                'Course #'.$item->getCId(),
261
                'Session # '.$item->getSessionId(),
262
            ];
263
            $trackEDefault[] = implode(', ', $list);
264
        }
265
266
        // TrackELastaccess
267
        $trackELastaccess = [];
268
269
        /** @var TrackELastaccess $item */
270
        foreach ($trackResults[TrackELastaccess::class] as $item) {
271
            $date = $item->getAccessDate()->format($dateFormat);
272
            $list = [
273
                'Course #'.$item->getCId(),
274
                'Session # '.$item->getSessionId(),
275
                'Tool: '.$item->getAccessTool(),
276
                'Access date: '.$date,
277
            ];
278
            $trackELastaccess[] = implode(', ', $list);
279
        }
280
281
        // TrackEUploads
282
        $trackEUploads = [];
283
284
        /** @var TrackEUploads $item */
285
        foreach ($trackResults[TrackEUploads::class] as $item) {
286
            $date = $item->getUploadDate()->format($dateFormat);
287
            $list = [
288
                'Course #'.$item->getCId(),
289
                'Uploaded at: '.$date,
290
                'Upload id # '.$item->getUploadId(),
291
            ];
292
            $trackEUploads[] = implode(', ', $list);
293
        }
294
295
        $gradebookResult = [];
296
297
        /** @var GradebookResult $item */
298
        foreach ($trackResults[GradebookResult::class] as $item) {
299
            $date = $item->getCreatedAt()->format($dateFormat);
300
            $list = [
301
                'Evaluation id# '.$item->getEvaluation()->getId(),
302
                // 'Score: '.$item->getScore(),
303
                'Creation date: '.$date,
304
            ];
305
            $gradebookResult[] = implode(', ', $list);
306
        }
307
308
        $trackEDownloads = [];
309
310
        /** @var TrackEDownloads $item */
311
        foreach ($trackResults[TrackEDownloads::class] as $item) {
312
            $date = $item->getDownDate()->format($dateFormat);
313
            $list = [
314
                'File: '.$item->getDownDocPath(),
315
                'Download at: '.$date,
316
            ];
317
            $trackEDownloads[] = implode(', ', $list);
318
        }
319
320
        // UserCourseCategory
321
        $result = $em->getRepository(UserCourseCategory::class)->findBy([
322
            'user' => $userId,
323
        ]);
324
        $userCourseCategory = [];
325
326
        /** @var UserCourseCategory $item */
327
        foreach ($result as $item) {
328
            $list = [
329
                'Title: '.$item->getTitle(),
330
            ];
331
            $userCourseCategory[] = implode(', ', $list);
332
        }
333
334
        // Forum
335
        $result = $em->getRepository(CForumPost::class)->findBy([
336
            'user' => $userId,
337
        ]);
338
        $cForumPostList = [];
339
340
        /** @var CForumPost $item */
341
        foreach ($result as $item) {
342
            $date = $item->getPostDate()->format($dateFormat);
343
            $list = [
344
                'Title: '.$item->getTitle(),
345
                'Creation date: '.$date,
346
            ];
347
            $cForumPostList[] = implode(', ', $list);
348
        }
349
350
        // CForumThread
351
        $result = $em->getRepository(CForumThread::class)->findBy([
352
            'user' => $userId,
353
        ]);
354
        $cForumThreadList = [];
355
356
        /** @var CForumThread $item */
357
        foreach ($result as $item) {
358
            $date = $item->getThreadDate()->format($dateFormat);
359
            $list = [
360
                'Title: '.$item->getTitle(),
361
                'Creation date: '.$date,
362
            ];
363
            $cForumThreadList[] = implode(', ', $list);
364
        }
365
366
        // cGroupRelUser
367
        $result = $em->getRepository(CGroupRelUser::class)->findBy([
368
            'user' => $userId,
369
        ]);
370
        $cGroupRelUser = [];
371
372
        /** @var CGroupRelUser $item */
373
        foreach ($result as $item) {
374
            $list = [
375
                'Course # '.$item->getCId(),
376
                'Group #'.$item->getGroup()->getIid(),
377
                'Role: '.$item->getStatus(),
378
            ];
379
            $cGroupRelUser[] = implode(', ', $list);
380
        }
381
382
        // CAttendanceSheet
383
        $result = $em->getRepository(CAttendanceSheet::class)->findBy([
384
            'user' => $userId,
385
        ]);
386
        $cAttendanceSheetList = [];
387
388
        /** @var CAttendanceSheet $item */
389
        foreach ($result as $item) {
390
            $list = [
391
                'Presence: '.$item->getPresence(),
392
                'Calendar id: '.$item->getAttendanceCalendar()->getIid(),
393
            ];
394
            $cAttendanceSheetList[] = implode(', ', $list);
395
        }
396
397
        // CAttendanceResult
398
        $result = $em->getRepository(CAttendanceResult::class)->findBy([
399
            'user' => $userId,
400
        ]);
401
        $cAttendanceResult = [];
402
403
        /** @var CAttendanceResult $item */
404
        foreach ($result as $item) {
405
            $list = [
406
                'Score : '.$item->getScore(),
407
                'Calendar id: '.$item->getAttendance()->getIid(),
408
            ];
409
            $cAttendanceResult[] = implode(', ', $list);
410
        }
411
412
        // Message
413
        $result = $em->getRepository(Message::class)->findBy([
414
            'sender' => $userId,
415
        ]);
416
        $messageList = [];
417
418
        /** @var Message $item */
419
        foreach ($result as $item) {
420
            $date = $item->getSendDate()->format($dateFormat);
421
            $userName = '';
422
            if ($item->getReceivers()) {
423
                foreach ($item->getReceivers() as $receiver) {
424
                    $userName = ', '.$receiver->getReceiver()->getUsername();
425
                }
426
            }
427
428
            $list = [
429
                'Title: '.$item->getTitle(),
430
                'Sent date: '.$date,
431
                'To users: '.$userName,
432
                'Type: '.$item->getMsgType(),
433
            ];
434
            $messageList[] = implode(', ', $list);
435
        }
436
437
        // CSurveyAnswer
438
        $result = $em->getRepository(CSurveyAnswer::class)->findBy([
439
            'user' => $userId,
440
        ]);
441
        $cSurveyAnswer = [];
442
443
        /** @var CSurveyAnswer $item */
444
        foreach ($result as $item) {
445
            $list = [
446
                'Answer # '.$item->getIid(),
447
                'Value: '.$item->getValue(),
448
            ];
449
            $cSurveyAnswer[] = implode(', ', $list);
450
        }
451
452
        // CDropboxFile
453
        $result = $em->getRepository(CDropboxFile::class)->findBy([
454
            'uploaderId' => $userId,
455
        ]);
456
        $cDropboxFile = [];
457
458
        /** @var CDropboxFile $item */
459
        foreach ($result as $item) {
460
            $date = $item->getUploadDate()->format($dateFormat);
461
            $list = [
462
                'Title: '.$item->getTitle(),
463
                'Uploaded date: '.$date,
464
                'File: '.$item->getFilename(),
465
            ];
466
            $cDropboxFile[] = implode(', ', $list);
467
        }
468
469
        // CDropboxPerson
470
        $result = $em->getRepository(CDropboxPerson::class)->findBy([
471
            'userId' => $userId,
472
        ]);
473
        $cDropboxPerson = [];
474
475
        /** @var CDropboxPerson $item */
476
        foreach ($result as $item) {
477
            $list = [
478
                'File #'.$item->getFileId(),
479
                'Course #'.$item->getCId(),
480
            ];
481
            $cDropboxPerson[] = implode(', ', $list);
482
        }
483
484
        // CDropboxPerson
485
        $result = $em->getRepository(CDropboxFeedback::class)->findBy([
486
            'authorUserId' => $userId,
487
        ]);
488
        $cDropboxFeedback = [];
489
490
        /** @var CDropboxFeedback $item */
491
        foreach ($result as $item) {
492
            $date = $item->getFeedbackDate()->format($dateFormat);
493
            $list = [
494
                'File #'.$item->getFileId(),
495
                'Feedback: '.$item->getFeedback(),
496
                'Date: '.$date,
497
            ];
498
            $cDropboxFeedback[] = implode(', ', $list);
499
        }
500
501
        // CNotebook
502
        $result = $em->getRepository(CNotebook::class)->findBy([
503
            'user' => $userId,
504
        ]);
505
        $cNotebook = [];
506
507
        /** @var CNotebook $item */
508
        foreach ($result as $item) {
509
            $date = $item->getUpdateDate()->format($dateFormat);
510
            $list = [
511
                'Title: '.$item->getTitle(),
512
                'Date: '.$date,
513
            ];
514
            $cNotebook[] = implode(', ', $list);
515
        }
516
517
        // CLpView
518
        $result = $em->getRepository(CLpView::class)->findBy([
519
            'user' => $userId,
520
        ]);
521
        $cLpView = [];
522
523
        /** @var CLpView $item */
524
        foreach ($result as $item) {
525
            $list = [
526
                // 'Id #'.$item->getId(),
527
                'LP #'.$item->getLp()->getIid(),
528
                'Progress: '.$item->getProgress(),
529
                // 'Course #'.$item->getCId(),
530
                // 'Session #'.$item->getSessionId(),
531
            ];
532
            $cLpView[] = implode(', ', $list);
533
        }
534
535
        // CStudentPublication
536
        $result = $em->getRepository(CStudentPublication::class)->findBy([
537
            'user' => $userId,
538
        ]);
539
        $cStudentPublication = [];
540
541
        /** @var CStudentPublication $item */
542
        foreach ($result as $item) {
543
            $list = [
544
                'Title: '.$item->getTitle(),
545
                // 'URL: '.$item->getTitle(),
546
            ];
547
            $cStudentPublication[] = implode(', ', $list);
548
        }
549
550
        // CStudentPublicationComment
551
        $result = $em->getRepository(CStudentPublicationComment::class)->findBy([
552
            'user' => $userId,
553
        ]);
554
        $cStudentPublicationComment = [];
555
556
        /** @var CStudentPublicationComment $item */
557
        foreach ($result as $item) {
558
            $date = $item->getSentAt()->format($dateFormat);
559
            $list = [
560
                'Commment: '.$item->getComment(),
561
                'File '.$item->getFile(),
562
                // 'Course # '.$item->getCId(),
563
                'Date: '.$date,
564
            ];
565
            $cStudentPublicationComment[] = implode(', ', $list);
566
        }
567
568
        // CWiki
569
        $result = $em->getRepository(CWiki::class)->findBy([
570
            'userId' => $userId,
571
        ]);
572
        $cWiki = [];
573
574
        /** @var CWiki $item */
575
        foreach ($result as $item) {
576
            $list = [
577
                'Title: '.$item->getTitle(),
578
                'Progress: '.$item->getProgress(),
579
                'IP: '.$item->getUserIp(),
580
            ];
581
            $cWiki[] = implode(', ', $list);
582
        }
583
584
        // Ticket
585
        $result = $em->getRepository(Ticket::class)->findBy([
586
            'insertUserId' => $userId,
587
        ]);
588
        $ticket = [];
589
590
        /** @var Ticket $item */
591
        foreach ($result as $item) {
592
            $list = [
593
                'Code: '.$item->getCode(),
594
                'Subject: '.$item->getSubject(),
595
            ];
596
            $ticket[] = implode(', ', $list);
597
        }
598
599
        // Message
600
        $result = $em->getRepository(TicketMessage::class)->findBy([
601
            'insertUserId' => $userId,
602
        ]);
603
        $ticketMessage = [];
604
605
        /** @var TicketMessage $item */
606
        foreach ($result as $item) {
607
            $date = $item->getInsertDateTime()->format($dateFormat);
608
            $list = [
609
                'Subject: '.$item->getSubject(),
610
                'IP: '.$item->getIpAddress(),
611
                'Status: '.$item->getStatus(),
612
                'Creation date: '.$date,
613
            ];
614
            $ticketMessage[] = implode(', ', $list);
615
        }
616
617
        // SkillRelUserComment
618
        $result = $em->getRepository(SkillRelUserComment::class)->findBy([
619
            'feedbackGiver' => $userId,
620
        ]);
621
        $skillRelUserComment = [];
622
623
        /** @var SkillRelUserComment $item */
624
        foreach ($result as $item) {
625
            $date = $item->getFeedbackDateTime()->format($dateFormat);
626
            $list = [
627
                'Feedback: '.$item->getFeedbackText(),
628
                'Value: '.$item->getFeedbackValue(),
629
                'Created at: '.$date,
630
            ];
631
            $skillRelUserComment[] = implode(', ', $list);
632
        }
633
634
        // UserRelCourseVote
635
        $result = $em->getRepository(UserRelCourseVote::class)->findBy([
636
            'user' => $userId,
637
        ]);
638
        $userRelCourseVote = [];
639
640
        /** @var UserRelCourseVote $item */
641
        foreach ($result as $item) {
642
            $list = [
643
                'Course #'.$item->getCourse()->getId(),
644
                // 'Session #'.$item->getSession()->getId(),
645
                'Vote: '.$item->getVote(),
646
            ];
647
            $userRelCourseVote[] = implode(', ', $list);
648
        }
649
650
        $lastLogin = $user->getLastLogin();
651
        $user->setLastLogin($lastLogin);
652
653
        $ignore = [
654
            'twoStepVerificationCode',
655
            'biography',
656
            'dateOfBirth',
657
            'gender',
658
            'facebookData',
659
            'facebookName',
660
            'facebookUid',
661
            'gplusData',
662
            'gplusName',
663
            'gplusUid',
664
            'locale',
665
            'timezone',
666
            'twitterData',
667
            'twitterName',
668
            'twitterUid',
669
            'gplusUid',
670
            'token',
671
            'website',
672
            'plainPassword',
673
            'completeNameWithUsername',
674
            'completeName',
675
            'completeNameWithClasses',
676
            'salt',
677
            'dropBoxSentFiles',
678
            'dropBoxReceivedFiles',
679
            'currentUrl',
680
            'uuid',
681
            'curriculumItems',
682
            'currentSession',
683
            'currentCourse',
684
            'resourceNode',
685
        ];
686
687
        return $this->serializer->serialize($user, 'json', [
688
            AbstractNormalizer::IGNORED_ATTRIBUTES => $ignore,
689
            'groups' => ['user_export'],
690
        ]);
691
    }
692
693
    public function serializeUserData(int $userId): string
694
    {
695
        $em = $this->em;
696
        $dateFormat = DateTimeInterface::ATOM;
697
698
        /** @var User $user */
699
        $user = $this->userRepository->find($userId);
700
        if (!$user) {
0 ignored issues
show
introduced by
$user is of type Chamilo\CoreBundle\Entity\User, thus it always evaluated to true.
Loading history...
701
            throw new Exception('User not found.');
702
        }
703
704
        $personalData = [];
705
        $personalData['user_info'][] = [
706
            'ID' => $user->getId(),
707
            'Username' => $user->getUsername(),
708
            'Email' => $user->getEmail(),
709
            'FirstName' => $user->getFirstname(),
710
            'LastName' => $user->getLastname(),
711
            'Website' => $user->getWebsite(),
712
            'Biography' => $user->getBiography(),
713
            'Locale' => $user->getLocale(),
714
            'Timezone' => $user->getTimezone(),
715
            'PhoneNumber' => $user->getPhone(),
716
            'Address' => $user->getAddress(),
717
            'Gender' => $user->getGender(),
718
            'LastLogin' => $user->getLastLogin() ? $user->getLastLogin()->format($dateFormat) : null,
719
            'Roles' => $user->getRoles(),
720
            'ApiToken' => $user->getApiToken(),
721
        ];
722
723
        $courses = $user->getCourses();
724
        foreach ($courses as $course) {
725
            $personalData['Courses'][] = [
726
                'CourseID' => $course->getCourse()->getId(),
727
                'CourseCode' => $course->getCourse()->getCode(),
728
                'CourseTitle' => $course->getCourse()->getTitle(),
729
            ];
730
        }
731
732
        $gradebookCertificates = $em->getRepository(GradebookCertificate::class)->findBy(['user' => $userId]);
733
        foreach ($gradebookCertificates as $certificate) {
734
            $personalData['GradebookCertificates'][] = [
735
                'Score' => $certificate->getScoreCertificate(),
736
                'Path' => $certificate->getPathCertificate(),
737
                'CreatedAt' => $certificate->getCreatedAt()->format($dateFormat),
738
            ];
739
        }
740
741
        $trackEExercises = $em->getRepository(TrackEExercise::class)->findBy(['user' => $userId]);
742
        foreach ($trackEExercises as $exercise) {
743
            $personalData['TrackEExercises'][] = [
744
                'IP' => $exercise->getUserIp(),
745
                'Start' => $exercise->getExeDate()->format($dateFormat),
746
                'Status' => $exercise->getStatus(),
747
            ];
748
        }
749
750
        // TrackEDownloads
751
        $resourceLinkId = $user->getResourceNode()->getResourceLinks()->first();
752
        if (null !== $resourceLinkId) {
753
            $trackEDownloads = $em->getRepository(TrackEDownloads::class)->findBy(['resourceLink' => $resourceLinkId]);
754
            foreach ($trackEDownloads as $item) {
755
                $userData['Downloads'][] = [
756
                    'File' => $item->getDownDocPath(),
757
                    'DownloadedAt' => $item->getDownDate()->format($dateFormat),
758
                ];
759
            }
760
        }
761
762
        // UserCourseCategory
763
        $userCourseCategories = $em->getRepository(UserCourseCategory::class)->findBy(['user' => $userId]);
764
        foreach ($userCourseCategories as $item) {
765
            $userData['CourseCategories'][] = [
766
                'Title' => $item->getTitle(),
767
            ];
768
        }
769
770
        // CForumPost
771
        $cForumPosts = $em->getRepository(CForumPost::class)->findBy(['user' => $userId]);
772
        foreach ($cForumPosts as $item) {
773
            $userData['ForumPosts'][] = [
774
                'Title' => $item->getTitle(),
775
                'CreationDate' => $item->getPostDate()->format($dateFormat),
776
            ];
777
        }
778
779
        // CForumThread
780
        $cForumThreads = $em->getRepository(CForumThread::class)->findBy(['user' => $userId]);
781
        foreach ($cForumThreads as $item) {
782
            $userData['ForumThreads'][] = [
783
                'Title' => $item->getTitle(),
784
                'CreationDate' => $item->getThreadDate()->format($dateFormat),
785
            ];
786
        }
787
788
        // CForumThread
789
        $cForumThreads = $em->getRepository(CForumThread::class)->findBy(['user' => $userId]);
790
        foreach ($cForumThreads as $item) {
791
            $userData['ForumThreads'][] = [
792
                'Title' => $item->getTitle(),
793
                'CreationDate' => $item->getThreadDate()->format($dateFormat),
794
            ];
795
        }
796
797
        // CGroupRelUser
798
        $cGroupRelUsers = $em->getRepository(CGroupRelUser::class)->findBy(['user' => $userId]);
799
        foreach ($cGroupRelUsers as $item) {
800
            $userData['GroupRelations'][] = [
801
                'CourseId' => $item->getCId(),
802
                'GroupId' => $item->getGroup()->getIid(),
803
                'Role' => $item->getStatus(),
804
            ];
805
        }
806
807
        // CAttendanceSheet
808
        $cAttendanceSheets = $em->getRepository(CAttendanceSheet::class)->findBy(['user' => $userId]);
809
        foreach ($cAttendanceSheets as $item) {
810
            $userData['AttendanceSheets'][] = [
811
                'Presence' => $item->getPresence(),
812
                'CalendarId' => $item->getAttendanceCalendar()->getIid(),
813
            ];
814
        }
815
816
        // CAttendanceResult
817
        $cAttendanceResults = $em->getRepository(CAttendanceResult::class)->findBy(['user' => $userId]);
818
        foreach ($cAttendanceResults as $item) {
819
            $userData['AttendanceResults'][] = [
820
                'Score' => $item->getScore(),
821
                'CalendarId' => $item->getAttendance()->getIid(),
822
            ];
823
        }
824
825
        // Message
826
        $messages = $em->getRepository(Message::class)->findBy(['sender' => $userId]);
827
        foreach ($messages as $item) {
828
            $receivers = array_map(fn ($receiver) => $receiver->getReceiver()->getUsername(), $item->getReceivers()->toArray());
829
            $userData['Messages'][] = [
830
                'Title' => $item->getTitle(),
831
                'SentDate' => $item->getSendDate()->format($dateFormat),
832
                'ToUsers' => implode(', ', $receivers),
833
                'Type' => $item->getMsgType(),
834
            ];
835
        }
836
837
        // CSurveyAnswer
838
        $cSurveyAnswers = $em->getRepository(CSurveyAnswer::class)->findBy(['user' => $userId]);
839
        foreach ($cSurveyAnswers as $item) {
840
            $userData['SurveyAnswers'][] = [
841
                'AnswerId' => $item->getIid(),
842
                'Value' => $item->getValue(),
843
            ];
844
        }
845
846
        // CLpView
847
        $cLpViews = $em->getRepository(CLpView::class)->findBy(['user' => $userId]);
848
        foreach ($cLpViews as $item) {
849
            $userData['LpViews'][] = [
850
                'LPId' => $item->getLp()->getIid(),
851
                'Progress' => $item->getProgress(),
852
            ];
853
        }
854
855
        // CStudentPublication
856
        $cStudentPublications = $em->getRepository(CStudentPublication::class)->findBy(['user' => $userId]);
857
        foreach ($cStudentPublications as $item) {
858
            $userData['StudentPublications'][] = [
859
                'Title' => $item->getTitle(),
860
            ];
861
        }
862
863
        // CStudentPublicationComment
864
        $cStudentPublicationComments = $em->getRepository(CStudentPublicationComment::class)->findBy(['user' => $userId]);
865
        foreach ($cStudentPublicationComments as $item) {
866
            $userData['StudentPublicationComments'][] = [
867
                'Comment' => $item->getComment(),
868
                'File' => $item->getFile(),
869
                'Date' => $item->getSentAt()->format($dateFormat),
870
            ];
871
        }
872
873
        // CWiki
874
        $cWikis = $em->getRepository(CWiki::class)->findBy(['userId' => $userId]);
875
        foreach ($cWikis as $item) {
876
            $userData['Wikis'][] = [
877
                'Title' => $item->getTitle(),
878
                'Progress' => $item->getProgress(),
879
                'IP' => $item->getUserIp(),
880
            ];
881
        }
882
883
        // Ticket
884
        $tickets = $em->getRepository(Ticket::class)->findBy(['insertUserId' => $userId]);
885
        foreach ($tickets as $item) {
886
            $userData['Tickets'][] = [
887
                'Code' => $item->getCode(),
888
                'Subject' => $item->getSubject(),
889
            ];
890
        }
891
892
        // TicketMessage
893
        $ticketMessages = $em->getRepository(TicketMessage::class)->findBy(['insertUserId' => $userId]);
894
        foreach ($ticketMessages as $item) {
895
            $userData['TicketMessages'][] = [
896
                'Subject' => $item->getSubject(),
897
                'IP' => $item->getIpAddress(),
898
                'Status' => $item->getStatus(),
899
                'CreationDate' => $item->getInsertDateTime()->format($dateFormat),
900
            ];
901
        }
902
903
        // SkillRelUserComment
904
        $skillRelUserComments = $em->getRepository(SkillRelUserComment::class)->findBy(['feedbackGiver' => $userId]);
905
        foreach ($skillRelUserComments as $item) {
906
            $userData['SkillUserComments'][] = [
907
                'Feedback' => $item->getFeedbackText(),
908
                'Value' => $item->getFeedbackValue(),
909
                'CreatedAt' => $item->getFeedbackDateTime()->format($dateFormat),
910
            ];
911
        }
912
913
        // UserRelCourseVote
914
        $userRelCourseVotes = $em->getRepository(UserRelCourseVote::class)->findBy(['user' => $userId]);
915
        foreach ($userRelCourseVotes as $item) {
916
            $userData['CourseVotes'][] = [
917
                'CourseId' => $item->getCourse()->getId(),
918
                'Vote' => $item->getVote(),
919
            ];
920
        }
921
922
        return $this->serializer->serialize($personalData, 'json');
923
    }
924
}
925