mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-27 18:13:48 +00:00
associate location on ms calendar remote
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
||||
|
||||
use Chill\MainBundle\Entity\Address;
|
||||
use Chill\MainBundle\Templating\Entity\AddressRender;
|
||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||
|
||||
class AddressConverter
|
||||
{
|
||||
private AddressRender $addressRender;
|
||||
|
||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
||||
|
||||
public function __construct(AddressRender $addressRender, TranslatableStringHelperInterface $translatableStringHelper)
|
||||
{
|
||||
$this->addressRender = $addressRender;
|
||||
$this->translatableStringHelper = $translatableStringHelper;
|
||||
}
|
||||
|
||||
public function addressToRemote(Address $address): array
|
||||
{
|
||||
return [
|
||||
'city' => $address->getPostcode()->getName(),
|
||||
'postalCode' => $address->getPostcode()->getCode(),
|
||||
'countryOrRegion' => $this->translatableStringHelper->localize($address->getPostcode()->getCountry()->getName()),
|
||||
'street' => $address->isNoAddress() ? '' :
|
||||
implode(', ', $this->addressRender->renderLines($address, false, false)),
|
||||
'state' => '',
|
||||
];
|
||||
}
|
||||
}
|
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
||||
|
||||
use Chill\MainBundle\Entity\Location;
|
||||
|
||||
class LocationConverter
|
||||
{
|
||||
private AddressConverter $addressConverter;
|
||||
|
||||
public function __construct(AddressConverter $addressConverter)
|
||||
{
|
||||
$this->addressConverter = $addressConverter;
|
||||
}
|
||||
|
||||
public function locationToRemote(Location $location): array
|
||||
{
|
||||
$results = [];
|
||||
|
||||
if ($location->hasAddress()) {
|
||||
$results['address'] = $this->addressConverter->addressToRemote($location->getAddress());
|
||||
|
||||
if ($location->getAddress()->hasAddressReference() && $location->getAddress()->getAddressReference()->hasPoint()) {
|
||||
$results['coordinates'] = [
|
||||
'latitude' => $location->getAddress()->getAddressReference()->getPoint()->getLat(),
|
||||
'longitude' => $location->getAddress()->getAddressReference()->getPoint()->getLon(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $location->getName()) {
|
||||
$results['displayName'] = $location->getName();
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
@@ -19,6 +19,7 @@ use Chill\PersonBundle\Entity\Person;
|
||||
use Chill\PersonBundle\Templating\Entity\PersonRenderInterface;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\Templating\EngineInterface;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
@@ -35,6 +36,11 @@ class RemoteEventConverter
|
||||
*/
|
||||
public const REMOTE_DATETIMEZONE_FORMAT = 'Y-m-d\\TH:i:s.u?P';
|
||||
|
||||
/**
|
||||
* Same as above, but sometimes the date is expressed with only 6 milliseconds.
|
||||
*/
|
||||
public const REMOTE_DATETIMEZONE_FORMAT_ALT = 'Y-m-d\\TH:i:s.uP';
|
||||
|
||||
private const REMOTE_DATE_FORMAT = 'Y-m-d\TH:i:s.u0';
|
||||
|
||||
private const REMOTE_DATETIME_WITHOUT_TZ_FORMAT = 'Y-m-d\TH:i:s.u?';
|
||||
@@ -43,15 +49,26 @@ class RemoteEventConverter
|
||||
|
||||
private EngineInterface $engine;
|
||||
|
||||
private LocationConverter $locationConverter;
|
||||
|
||||
private LoggerInterface $logger;
|
||||
|
||||
private PersonRenderInterface $personRender;
|
||||
|
||||
private DateTimeZone $remoteDateTimeZone;
|
||||
|
||||
private TranslatorInterface $translator;
|
||||
|
||||
public function __construct(EngineInterface $engine, PersonRenderInterface $personRender, TranslatorInterface $translator)
|
||||
{
|
||||
public function __construct(
|
||||
EngineInterface $engine,
|
||||
LocationConverter $locationConverter,
|
||||
LoggerInterface $logger,
|
||||
PersonRenderInterface $personRender,
|
||||
TranslatorInterface $translator
|
||||
) {
|
||||
$this->engine = $engine;
|
||||
$this->locationConverter = $locationConverter;
|
||||
$this->logger = $logger;
|
||||
$this->translator = $translator;
|
||||
$this->personRender = $personRender;
|
||||
$this->defaultDateTimeZone = (new DateTimeImmutable())->getTimezone();
|
||||
@@ -86,12 +103,13 @@ class RemoteEventConverter
|
||||
],
|
||||
],
|
||||
'isReminderOn' => false,
|
||||
'location' => $this->locationConverter->locationToRemote($calendarRange->getLocation()),
|
||||
];
|
||||
}
|
||||
|
||||
public function calendarToEvent(Calendar $calendar): array
|
||||
{
|
||||
return array_merge(
|
||||
$result = array_merge(
|
||||
[
|
||||
'subject' => '[Chill] ' .
|
||||
implode(
|
||||
@@ -120,9 +138,16 @@ class RemoteEventConverter
|
||||
),
|
||||
],
|
||||
'responseRequested' => true,
|
||||
'isReminderOn' => false,
|
||||
],
|
||||
$this->calendarToEventAttendeesOnly($calendar)
|
||||
);
|
||||
|
||||
if ($calendar->hasLocation()) {
|
||||
$result['location'] = $this->locationConverter->locationToRemote($calendar->getLocation());
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function calendarToEventAttendeesOnly(Calendar $calendar): array
|
||||
@@ -203,7 +228,27 @@ class RemoteEventConverter
|
||||
|
||||
public function getLastModifiedDate(array $event): DateTimeImmutable
|
||||
{
|
||||
return DateTimeImmutable::createFromFormat(self::REMOTE_DATETIMEZONE_FORMAT, $event['lastModifiedDateTime']);
|
||||
$date = DateTimeImmutable::createFromFormat(self::REMOTE_DATETIMEZONE_FORMAT, $event['lastModifiedDateTime']);
|
||||
|
||||
if (false === $date) {
|
||||
$date = DateTimeImmutable::createFromFormat(self::REMOTE_DATETIMEZONE_FORMAT_ALT, $event['lastModifiedDateTime']);
|
||||
}
|
||||
|
||||
if (false === $date) {
|
||||
$this->logger->error(self::class . ' Could not convert lastModifiedDate', [
|
||||
'actual' => $event['lastModifiedDateTime'],
|
||||
'format' => self::REMOTE_DATETIMEZONE_FORMAT,
|
||||
'format_alt' => self::REMOTE_DATETIMEZONE_FORMAT_ALT,
|
||||
]);
|
||||
|
||||
throw new RuntimeException(sprintf(
|
||||
'could not convert lastModifiedDate: %s, expected format: %s',
|
||||
$event['lastModifiedDateTime'],
|
||||
self::REMOTE_DATETIMEZONE_FORMAT . ' and ' . self::REMOTE_DATETIMEZONE_FORMAT_ALT
|
||||
));
|
||||
}
|
||||
|
||||
return $date;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user