You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							4.6 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/* For license terms, see /license.txt */
 | 
						|
 | 
						|
use Chamilo\PluginBundle\Zoom\API\RecordingMeeting;
 | 
						|
use Chamilo\PluginBundle\Zoom\Meeting;
 | 
						|
use Chamilo\PluginBundle\Zoom\MeetingActivity;
 | 
						|
use Chamilo\PluginBundle\Zoom\Recording;
 | 
						|
use Chamilo\PluginBundle\Zoom\Registrant;
 | 
						|
use Symfony\Component\HttpFoundation\Response;
 | 
						|
 | 
						|
if ('POST' !== $_SERVER['REQUEST_METHOD']) {
 | 
						|
    http_response_code(Response::HTTP_NOT_FOUND); // Not found
 | 
						|
    exit;
 | 
						|
}
 | 
						|
 | 
						|
// @todo handle non-apache installations
 | 
						|
$authorizationHeaderValue = apache_request_headers()['Authorization'];
 | 
						|
 | 
						|
require_once __DIR__.'/config.php';
 | 
						|
 | 
						|
if (api_get_plugin_setting('zoom', 'verificationToken') !== $authorizationHeaderValue) {
 | 
						|
    http_response_code(Response::HTTP_UNAUTHORIZED);
 | 
						|
    exit;
 | 
						|
}
 | 
						|
 | 
						|
$body = file_get_contents('php://input');
 | 
						|
$decoded = json_decode($body);
 | 
						|
if (is_null($decoded) || !is_object($decoded) || !isset($decoded->event) || !isset($decoded->payload->object)) {
 | 
						|
    error_log(sprintf('Did not recognize event notification: %s', $body));
 | 
						|
    http_response_code(Response::HTTP_UNPROCESSABLE_ENTITY);
 | 
						|
    exit;
 | 
						|
}
 | 
						|
 | 
						|
$object = $decoded->payload->object;
 | 
						|
list($objectType, $action) = explode('.', $decoded->event);
 | 
						|
 | 
						|
$em = Database::getManager();
 | 
						|
 | 
						|
$meetingRepository = $em->getRepository(Meeting::class);
 | 
						|
$meeting = null;
 | 
						|
if ($object->id) {
 | 
						|
    /** @var Meeting $meeting */
 | 
						|
    $meeting = $meetingRepository->findOneBy(['meetingId' => $object->id]);
 | 
						|
}
 | 
						|
 | 
						|
$activity = null;
 | 
						|
if ($meeting) {
 | 
						|
    $activity = new MeetingActivity();
 | 
						|
    $activity->setName($action);
 | 
						|
    $activity->setType($objectType);
 | 
						|
    $activity->setEvent(json_encode($object));
 | 
						|
}
 | 
						|
 | 
						|
switch ($objectType) {
 | 
						|
    case 'meeting':
 | 
						|
        $registrantRepository = $em->getRepository(Registrant::class);
 | 
						|
 | 
						|
        if (null === $meeting) {
 | 
						|
            exit;
 | 
						|
        }
 | 
						|
 | 
						|
        error_log('Meeting '.$action.' - '.$meeting->getId());
 | 
						|
        error_log(print_r($object, 1));
 | 
						|
 | 
						|
        switch ($action) {
 | 
						|
            case 'deleted':
 | 
						|
                $em->remove($meeting);
 | 
						|
                $em->flush();
 | 
						|
                break;
 | 
						|
            case 'ended':
 | 
						|
            case 'started':
 | 
						|
                $meeting->setStatus($action);
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                $em->persist($meeting);
 | 
						|
                $em->flush();
 | 
						|
                break;
 | 
						|
            case 'participant_joined':
 | 
						|
            case 'participant_left':
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                $em->persist($meeting);
 | 
						|
                $em->flush();
 | 
						|
                //error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
 | 
						|
                //http_response_code(Response::HTTP_NOT_IMPLEMENTED); // Not Implemented
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case 'recording':
 | 
						|
        $recordingRepository = $em->getRepository(Recording::class);
 | 
						|
 | 
						|
        $recordingEntity = null;
 | 
						|
        if ($object->uuid) {
 | 
						|
            $recordingEntity = $recordingRepository->findBy(['uuid' => $object->uuid, 'meeting' => $meeting]);
 | 
						|
        }
 | 
						|
 | 
						|
        error_log("Recording: $action");
 | 
						|
        error_log(print_r($object, 1));
 | 
						|
 | 
						|
        switch ($action) {
 | 
						|
            case 'completed':
 | 
						|
                $recording = new Recording();
 | 
						|
                $recording->setRecordingMeeting(RecordingMeeting::fromObject($object));
 | 
						|
                $recording->setMeeting($meeting);
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                $em->persist($meeting);
 | 
						|
                $em->persist($recording);
 | 
						|
                $em->flush();
 | 
						|
                break;
 | 
						|
            case 'recovered':
 | 
						|
                /*if (null === $recordingEntity) {
 | 
						|
                    $em->persist(
 | 
						|
                        (new Recording())->setRecordingMeeting(RecordingMeeting::fromObject($object))
 | 
						|
                    );
 | 
						|
                    $em->flush();
 | 
						|
                }*/
 | 
						|
                break;
 | 
						|
            case 'trashed':
 | 
						|
            case 'deleted':
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                $em->persist($meeting);
 | 
						|
                if (null !== $recordingEntity) {
 | 
						|
                    $em->remove($recordingEntity);
 | 
						|
                }
 | 
						|
                $em->flush();
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                $meeting->addActivity($activity);
 | 
						|
                $em->persist($meeting);
 | 
						|
                $em->flush();
 | 
						|
                //error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
 | 
						|
                //http_response_code(501); // Not Implemented
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body));
 | 
						|
        http_response_code(501); // Not Implemented
 | 
						|
        break;
 | 
						|
}
 | 
						|
 |