mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-25 09:03:48 +00:00
handling sync for calendar invite
This commit is contained in:
@@ -13,6 +13,7 @@ namespace Chill\CalendarBundle\RemoteCalendar\Connector;
|
||||
|
||||
use Chill\CalendarBundle\Entity\Calendar;
|
||||
use Chill\CalendarBundle\Entity\CalendarRange;
|
||||
use Chill\CalendarBundle\Entity\Invite;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MachineHttpClient;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MapCalendarToUser;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\OnBehalfOfUserHttpClient;
|
||||
@@ -209,6 +210,67 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface
|
||||
}
|
||||
}
|
||||
|
||||
public function syncInvite(Invite $invite): void
|
||||
{
|
||||
if ('' === $remoteId = $invite->getCalendar()->getRemoteId()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (null === $invite->getUser()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (null === $userId = $this->mapCalendarToUser->getUserId($invite->getUser())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($invite->hasRemoteId()) {
|
||||
$remoteIdAttendeeCalendar = $invite->getRemoteId();
|
||||
} else {
|
||||
$remoteIdAttendeeCalendar = $this->findRemoteIdOnUserCalendar($invite->getCalendar(), $invite->getUser());
|
||||
$invite->setRemoteId($remoteIdAttendeeCalendar);
|
||||
}
|
||||
|
||||
switch ($invite->getStatus()) {
|
||||
case Invite::PENDING:
|
||||
return;
|
||||
|
||||
case Invite::ACCEPTED:
|
||||
$url = "/v1.0/users/{$userId}/calendar/events/{$remoteIdAttendeeCalendar}/accept";
|
||||
|
||||
break;
|
||||
|
||||
case Invite::TENTATIVELY_ACCEPTED:
|
||||
$url = "/v1.0/users/{$userId}/calendar/events/{$remoteIdAttendeeCalendar}/tentativelyAccept";
|
||||
|
||||
break;
|
||||
|
||||
case Invite::DECLINED:
|
||||
$url = "/v1.0/users/{$userId}/calendar/events/{$remoteIdAttendeeCalendar}/decline";
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('not supported');
|
||||
}
|
||||
|
||||
try {
|
||||
$this->machineHttpClient->request(
|
||||
'POST',
|
||||
$url,
|
||||
['json' => ['sendResponse' => true]]
|
||||
);
|
||||
} catch (ClientExceptionInterface $e) {
|
||||
$this->logger->warning('could not update calendar range to remote', [
|
||||
'exception' => $e->getTraceAsString(),
|
||||
'content' => $e->getResponse()->getContent(),
|
||||
'calendarRangeId' => 'invite_' . $invite->getId(),
|
||||
]);
|
||||
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
private function cancelOnRemote(string $remoteId, string $comment, User $user, string $identifier): void
|
||||
{
|
||||
$userId = $this->mapCalendarToUser->getUserId($user);
|
||||
@@ -333,6 +395,44 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* the remoteId is not the same across different user calendars. This method allow to find
|
||||
* the correct remoteId in another calendar.
|
||||
*
|
||||
* For achieving this, the iCalUid is used.
|
||||
*/
|
||||
private function findRemoteIdOnUserCalendar(Calendar $calendar, User $user): ?string
|
||||
{
|
||||
// find the icalUid on original user
|
||||
$event = $this->getOnRemote($calendar->getMainUser(), $calendar->getRemoteId());
|
||||
$userId = $this->mapCalendarToUser->getUserId($user);
|
||||
|
||||
if ('' === $iCalUid = ($event['iCalUId'] ?? '')) {
|
||||
throw new Exception('no iCalUid for this event');
|
||||
}
|
||||
|
||||
try {
|
||||
$events = $this->machineHttpClient->request(
|
||||
'GET',
|
||||
"/v1.0/users/{$userId}/calendar/events",
|
||||
[
|
||||
'query' => [
|
||||
'$select' => 'id',
|
||||
'$filter' => "iCalUId eq '{$iCalUid}'",
|
||||
],
|
||||
]
|
||||
)->toArray();
|
||||
} catch (ClientExceptionInterface $clientException) {
|
||||
throw $clientException;
|
||||
}
|
||||
|
||||
if (1 !== count($events['value'])) {
|
||||
throw new Exception('multiple events found with same iCalUid');
|
||||
}
|
||||
|
||||
return $events['value'][0]['id'];
|
||||
}
|
||||
|
||||
private function getOnRemote(User $user, string $remoteId): array
|
||||
{
|
||||
$userId = $this->mapCalendarToUser->getUserId($user);
|
||||
@@ -345,10 +445,13 @@ class MSGraphRemoteCalendarConnector implements RemoteCalendarConnectorInterface
|
||||
}
|
||||
|
||||
try {
|
||||
return $this->machineHttpClient->request(
|
||||
$v = $this->machineHttpClient->request(
|
||||
'GET',
|
||||
'users/' . $userId . '/calendar/events/' . $remoteId
|
||||
)->toArray();
|
||||
dump($v);
|
||||
|
||||
return $v;
|
||||
} catch (ClientExceptionInterface $e) {
|
||||
$this->logger->warning('Could not get event from calendar', [
|
||||
'remoteId' => $remoteId,
|
||||
|
Reference in New Issue
Block a user