Passed
Pull Request — master (#6124)
by
unknown
07:59
created

Version20250310215900::tableExists()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 7
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
8
9
use Chamilo\CoreBundle\Entity\User;
10
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
11
use Chamilo\CoreBundle\Entity\ConferenceMeeting;
12
use Chamilo\CoreBundle\Entity\ConferenceActivity;
13
use Chamilo\CoreBundle\Entity\ConferenceRecording;
14
use Doctrine\DBAL\Schema\Schema;
15
use Chamilo\CoreBundle\Entity\Course;
16
use Chamilo\CourseBundle\Entity\CGroup;
17
use Chamilo\CoreBundle\Entity\Session;
18
use Exception;
19
20
final class Version20250310215900 extends AbstractMigrationChamilo
21
{
22
    public function getDescription(): string
23
    {
24
        return 'Migrates data from BBB and Zoom plugins to the new conference system using Doctrine persistence.';
25
    }
26
27
    public function up(Schema $schema): void
28
    {
29
        $this->entityManager->beginTransaction();
0 ignored issues
show
Bug introduced by
The method beginTransaction() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

29
        $this->entityManager->/** @scrutinizer ignore-call */ 
30
                              beginTransaction();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
30
31
        try {
32
            // Migrate BBB Meetings
33
            if ($this->tableExists('plugin_bbb_meeting')) {
34
                $this->migrateBbbMeetings();
35
            }
36
37
            // Migrate BBB Activities
38
            if ($this->tableExists('plugin_bbb_room')) {
39
                $this->migrateBbbActivities();
40
            }
41
42
            // Migrate Zoom Meetings
43
            if ($this->tableExists('plugin_zoom_meeting')) {
44
                $this->migrateZoomMeetings();
45
            }
46
47
            // Migrate Zoom Activities
48
            if ($this->tableExists('plugin_zoom_meeting_activity')) {
49
                $this->migrateZoomActivities();
50
            }
51
52
            // Migrate Zoom Recordings
53
            if ($this->tableExists('plugin_zoom_recording')) {
54
                $this->migrateZoomRecordings();
55
            }
56
57
            $this->entityManager->flush();
58
            $this->entityManager->commit();
59
        } catch (Exception $e) {
60
            $this->entityManager->rollBack();
61
            error_log('Migration failed: ' . $e->getMessage());
62
        }
63
    }
64
65
    private function migrateBbbMeetings(): void
66
    {
67
        $bbbMeetings = $this->connection->fetchAllAssociative("SELECT * FROM plugin_bbb_meeting");
68
69
        foreach ($bbbMeetings as $bbb) {
70
            $course = $this->getEntityById(Course::class, $bbb['c_id']);
71
            $user = $this->getEntityById(User::class, $bbb['user_id']);
72
            $group = $this->getEntityById(CGroup::class, $bbb['group_id']);
73
            $session = $this->getEntityById(Session::class, $bbb['session_id']);
74
75
            if (!$course) {
76
                continue;
77
            }
78
79
            $meeting = new ConferenceMeeting();
80
            $meeting->setServiceProvider('bbb');
81
            $meeting->setTitle($bbb['meeting_name']);
82
            $meeting->setRemoteId($bbb['remote_id']);
83
            $meeting->setInternalMeetingId($bbb['remote_id']);
84
            $meeting->setAttendeePw($bbb['attendee_pw']);
85
            $meeting->setModeratorPw($bbb['moderator_pw']);
86
            $meeting->setRecord((bool) $bbb['record']);
87
            $meeting->setStatus((int) $bbb['status']);
88
            $meeting->setWelcomeMsg($bbb['welcome_msg']);
89
            $meeting->setVisibility((int) $bbb['visibility']);
90
            $meeting->setVoiceBridge($bbb['voice_bridge']);
91
            $meeting->setVideoUrl($bbb['video_url']);
92
            $meeting->setHasVideoM4v((bool) $bbb['has_video_m4v']);
93
            $meeting->setClosedAt($bbb['closed_at'] ? new \DateTime($bbb['closed_at']) : null);
94
95
            $meeting->setCourse($course);
96
            $meeting->setUser($user);
97
            $meeting->setGroup($group);
98
99
            if ($session) {
100
                $meeting->setSession($session);
101
            }
102
103
            $this->entityManager->persist($meeting);
104
            $this->entityManager->flush();
105
106
            $this->meetingIdMap[$bbb['id']] = $meeting->getId();
107
        }
108
    }
109
110
    private function migrateBbbActivities(): void
111
    {
112
        $bbbActivities = $this->connection->fetchAllAssociative("SELECT * FROM plugin_bbb_room");
113
114
        foreach ($bbbActivities as $activity) {
115
            if (!isset($this->meetingIdMap[$activity['meeting_id']])) {
116
                continue;
117
            }
118
119
            $meeting = $this->entityManager->find(ConferenceMeeting::class, $this->meetingIdMap[$activity['meeting_id']]);
120
            $participant = $this->getEntityById(User::class, $activity['participant_id']);
121
122
            if (!$meeting || !$participant) {
123
                continue;
124
            }
125
126
            $conferenceActivity = new ConferenceActivity();
127
            $conferenceActivity->setMeeting($meeting);
128
            $conferenceActivity->setParticipant($participant);
129
            $conferenceActivity->setInAt(new \DateTime($activity['in_at']));
130
            $conferenceActivity->setOutAt($activity['out_at'] ? new \DateTime($activity['out_at']) : null);
131
            $conferenceActivity->setType('participant');
132
            $conferenceActivity->setEvent('joined');
133
134
            $this->entityManager->persist($conferenceActivity);
135
        }
136
    }
137
138
    private function migrateZoomMeetings(): void
139
    {
140
        $zoomMeetings = $this->connection->fetchAllAssociative("SELECT * FROM plugin_zoom_meeting");
141
142
        foreach ($zoomMeetings as $zoom) {
143
            $course = $this->getEntityById(Course::class, $zoom['course_id']);
144
            $user = $this->getEntityById(User::class, $zoom['user_id']);
145
            $group = $this->getEntityById(CGroup::class, $zoom['group_id']);
146
            $session = $this->getEntityById(Session::class, $zoom['session_id']);
147
148
            if (!$course) {
149
                continue;
150
            }
151
152
            $meeting = new ConferenceMeeting();
153
            $meeting->setServiceProvider('zoom');
154
            $meeting->setRemoteId($zoom['meeting_id']);
155
            $meeting->setTitle($zoom['meeting_list_item_json']);
156
            $meeting->setSignAttendance((bool) $zoom['sign_attendance']);
157
            $meeting->setReasonToSignAttendance($zoom['reason_to_sign_attendance']);
158
            $meeting->setAccountEmail($zoom['account_email']);
159
160
            $meeting->setCourse($course);
161
            $meeting->setUser($user);
162
            $meeting->setGroup($group);
163
164
            if ($session) {
165
                $meeting->setSession($session);
166
            }
167
168
            $this->entityManager->persist($meeting);
169
            $this->entityManager->flush();
170
171
            $this->meetingIdMap[$zoom['id']] = $meeting->getId();
172
        }
173
    }
174
175
    private function migrateZoomActivities(): void
176
    {
177
        $zoomActivities = $this->connection->fetchAllAssociative("SELECT * FROM plugin_zoom_meeting_activity");
178
179
        foreach ($zoomActivities as $activity) {
180
            if (!isset($this->meetingIdMap[$activity['meeting_id']])) {
181
                continue;
182
            }
183
184
            $meeting = $this->entityManager->find(ConferenceMeeting::class, $this->meetingIdMap[$activity['meeting_id']]);
185
            $participant = $this->getEntityById(User::class, $activity['user_id']);
186
187
            if (!$meeting || !$participant) {
188
                continue;
189
            }
190
191
            $conferenceActivity = new ConferenceActivity();
192
            $conferenceActivity->setMeeting($meeting);
193
            $conferenceActivity->setParticipant($participant);
194
            $conferenceActivity->setInAt(new \DateTime($activity['created_at']));
195
            $conferenceActivity->setEvent($activity['event']);
196
197
            $this->entityManager->persist($conferenceActivity);
198
        }
199
    }
200
201
    private function migrateZoomRecordings(): void
202
    {
203
        $zoomRecordings = $this->connection->fetchAllAssociative("SELECT * FROM plugin_zoom_recording");
204
205
        foreach ($zoomRecordings as $recording) {
206
            $meeting = $this->getEntityById(ConferenceMeeting::class, $recording['meeting_id']);
207
208
            if (!$meeting) {
209
                continue;
210
            }
211
212
            $conferenceRecording = new ConferenceRecording();
213
            $conferenceRecording->setMeeting($meeting);
214
            $conferenceRecording->setFormatType('zoom');
215
            $conferenceRecording->setResourceUrl($recording['recording_meeting_json']);
216
217
            $this->entityManager->persist($conferenceRecording);
218
        }
219
    }
220
221
    private function getEntityById(string $entityClass, ?int $id): ?object
222
    {
223
        return $id ? $this->entityManager->find($entityClass, $id) : null;
224
    }
225
226
    private function tableExists(string $tableName): bool
227
    {
228
        try {
229
            $this->connection->executeQuery("SELECT 1 FROM $tableName LIMIT 1");
230
            return true;
231
        } catch (Exception $e) {
232
            return false;
233
        }
234
    }
235
236
    public function down(Schema $schema): void
237
    {
238
        $this->addSql("DELETE FROM conference_meeting WHERE service_provider = 'bbb';");
239
        $this->addSql("DELETE FROM conference_meeting WHERE service_provider = 'zoom';");
240
    }
241
}
242