Issues (1796)

public/plugin/Zoom/endpoint.php (1 issue)

1
<?php
2
3
/* For license terms, see /license.txt */
4
5
use Chamilo\PluginBundle\Zoom\API\RecordingMeeting;
6
use Chamilo\PluginBundle\Zoom\Meeting;
7
use Chamilo\PluginBundle\Zoom\MeetingActivity;
8
use Chamilo\PluginBundle\Zoom\Recording;
9
use Symfony\Component\HttpFoundation\Response;
10
11
require_once __DIR__.'/config.php';
12
if ('POST' !== $_SERVER['REQUEST_METHOD']) {
13
    http_response_code(Response::HTTP_NOT_FOUND); // Not found
14
    exit;
15
}
16
17
// @todo handle non-apache installations
18
$authorizationHeaderValue = apache_request_headers()['Authorization'];
19
20
if (api_get_plugin_setting('zoom', 'verificationToken') !== $authorizationHeaderValue) {
21
    error_log('verificationToken not valid, please check your zoom configuration');
22
    http_response_code(Response::HTTP_UNAUTHORIZED);
23
    exit;
24
}
25
26
$body = file_get_contents('php://input');
27
$decoded = json_decode($body);
28
if (is_null($decoded) || !is_object($decoded) || !isset($decoded->event) || !isset($decoded->payload->object)) {
29
    error_log(sprintf('Did not recognize event notification: %s', $body));
30
    http_response_code(Response::HTTP_UNPROCESSABLE_ENTITY);
31
    exit;
32
}
33
34
$object = $decoded->payload->object;
35
list($objectType, $action) = explode('.', $decoded->event);
36
37
$em = Database::getManager();
38
39
$meetingRepository = $em->getRepository(Meeting::class);
40
$meeting = null;
41
if ($object->id) {
42
    /** @var Meeting $meeting */
43
    $meeting = $meetingRepository->findOneBy(['meetingId' => $object->id]);
44
}
45
46
if (null === $meeting) {
47
    error_log("Meeting not found");
48
    error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
49
    http_response_code(Response::HTTP_NOT_FOUND);
50
    exit;
51
}
52
53
$activity = new MeetingActivity();
54
$activity->setName($action);
55
$activity->setType($objectType);
56
$activity->setEvent(json_encode($object));
57
58
switch ($objectType) {
59
    case 'meeting':
60
        error_log('Meeting '.$action.' - '.$meeting->getId());
61
        error_log(print_r($object, 1));
62
63
        switch ($action) {
64
            case 'deleted':
65
                $em->remove($meeting);
66
                break;
67
            case 'ended':
68
            case 'started':
69
                $meeting->setStatus($action);
70
                $meeting->addActivity($activity);
71
                $em->persist($meeting);
72
                break;
73
            default:
74
                $meeting->addActivity($activity);
75
                $em->persist($meeting);
76
                break;
77
        }
78
        $em->flush();
79
        break;
80
    case 'recording':
81
        $recordingRepository = $em->getRepository(Recording::class);
82
83
        $recordingEntity = null;
84
        if ($object->uuid) {
85
            /** @var Recording $recordingEntity */
86
            $recordingEntity = $recordingRepository->findOneBy(['uuid' => $object->uuid, 'meeting' => $meeting]);
87
        }
88
89
        error_log("Recording: $action");
90
        error_log(print_r($object, 1));
91
92
        switch ($action) {
93
            case 'completed':
94
                $recording = new Recording();
95
                $recording->setRecordingMeeting(RecordingMeeting::fromObject($object));
96
                $recording->setMeeting($meeting);
97
                $meeting->addActivity($activity);
98
                $em->persist($meeting);
99
                $em->persist($recording);
100
                $em->flush();
101
                break;
102
            case 'recovered':
103
                /*if (null === $recordingEntity) {
104
                    $em->persist(
105
                        (new Recording())->setRecordingMeeting(RecordingMeeting::fromObject($object))
106
                    );
107
                    $em->flush();
108
                }*/
109
                break;
110
            case 'trashed':
111
            case 'deleted':
112
                $meeting->addActivity($activity);
113
                if (null !== $recordingEntity) {
114
                    $recordMeeting = $recordingEntity->getRecordingMeeting();
115
                    $recordingToDelete = RecordingMeeting::fromObject($object);
116
                    $files = [];
117
                    if ($recordingToDelete->recording_files) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $recordingToDelete->recording_files of type Chamilo\PluginBundle\Zoom\API\RecordingFile[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
118
                        foreach ($recordingToDelete->recording_files as $fileToDelete) {
119
                            foreach ($recordMeeting->recording_files as $file) {
120
                                if ($fileToDelete->id != $file->id) {
121
                                    $files[] = $file;
122
                                }
123
                            }
124
                        }
125
                    }
126
127
                    if (empty($files)) {
128
                        $em->remove($recordingEntity);
129
                    } else {
130
                        $recordMeeting->recording_files = $files;
131
                        $recordingEntity->setRecordingMeeting($recordMeeting);
132
                        $em->persist($recordingEntity);
133
                    }
134
                }
135
                $em->persist($meeting);
136
                $em->flush();
137
                break;
138
            default:
139
                $meeting->addActivity($activity);
140
                $em->persist($meeting);
141
                $em->flush();
142
                //error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
143
                //http_response_code(501); // Not Implemented
144
                break;
145
        }
146
        break;
147
    default:
148
        error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
149
        http_response_code(501); // Not Implemented
150
        break;
151
}
152