mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Read absence from MS graph api
This commit is contained in:
parent
c19232de35
commit
5b42b85b50
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Exception;
|
||||||
|
|
||||||
|
class UserAbsenceSyncException extends \LogicException
|
||||||
|
{
|
||||||
|
public function __construct(string $message = "", int $code = 20230706)
|
||||||
|
{
|
||||||
|
parent::__construct($message, $code);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
||||||
|
|
||||||
|
use Chill\CalendarBundle\Exception\UserAbsenceSyncException;
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use Symfony\Component\Clock\ClockInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||||||
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||||
|
|
||||||
|
readonly class MSUserAbsenceReader
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private HttpClientInterface $machineHttpClient,
|
||||||
|
private MapCalendarToUser $mapCalendarToUser,
|
||||||
|
private ClockInterface $clock,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throw UserAbsenceSyncException when the data cannot be reached or is not valid from microsoft
|
||||||
|
*/
|
||||||
|
public function isUserAbsent(User $user): bool|null
|
||||||
|
{
|
||||||
|
$id = $this->mapCalendarToUser->getUserId($user);
|
||||||
|
|
||||||
|
if (null === $id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$automaticRepliesSettings = $this->machineHttpClient
|
||||||
|
->request('GET', '/users/' . $id . '/mailboxSettings/automaticRepliesSetting')
|
||||||
|
->toArray(true);
|
||||||
|
} catch (ClientExceptionInterface|DecodingExceptionInterface|RedirectionExceptionInterface|TransportExceptionInterface $e) {
|
||||||
|
throw new UserAbsenceSyncException("Error receiving response for mailboxSettings", 0, $e);
|
||||||
|
} catch (ServerExceptionInterface $e) {
|
||||||
|
throw new UserAbsenceSyncException("Server error receiving response for mailboxSettings", 0, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists("status", $automaticRepliesSettings)) {
|
||||||
|
throw new \LogicException("no key \"status\" on automatic replies settings: " . json_encode($automaticRepliesSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
return match ($automaticRepliesSettings['status']) {
|
||||||
|
'disabled' => false,
|
||||||
|
'alwaysEnabled' => true,
|
||||||
|
'scheduled' =>
|
||||||
|
RemoteEventConverter::convertStringDateWithoutTimezone($automaticRepliesSettings['scheduledStartDateTime']['dateTime']) < $this->clock->now()
|
||||||
|
&& RemoteEventConverter::convertStringDateWithoutTimezone($automaticRepliesSettings['scheduledEndDateTime']['dateTime']) > $this->clock->now(),
|
||||||
|
default => throw new UserAbsenceSyncException("this status is not documented by Microsoft")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Tests\RemoteCalendar\Connector\MSGraph;
|
||||||
|
|
||||||
|
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MapCalendarToUser;
|
||||||
|
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceReader;
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\PhpUnit\ProphecyTrait;
|
||||||
|
use Symfony\Component\Clock\MockClock;
|
||||||
|
use Symfony\Component\HttpClient\MockHttpClient;
|
||||||
|
use Symfony\Component\HttpClient\Response\MockResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
class MSUserAbsenceReaderTest extends TestCase
|
||||||
|
{
|
||||||
|
use ProphecyTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideDataTestUserAbsence
|
||||||
|
*/
|
||||||
|
public function testUserAbsenceReader(string $mockResponse, bool $expected, string $message): void
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$client = new MockHttpClient([new MockResponse($mockResponse)]);
|
||||||
|
$mapUser = $this->prophesize(MapCalendarToUser::class);
|
||||||
|
$mapUser->getUserId($user)->willReturn('1234');
|
||||||
|
$clock = new MockClock(new \DateTimeImmutable('2023-07-07T12:00:00'));
|
||||||
|
|
||||||
|
$absenceReader = new MSUserAbsenceReader($client, $mapUser->reveal(), $clock);
|
||||||
|
|
||||||
|
self::assertEquals($expected, $absenceReader->isUserAbsent($user), $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsUserAbsentWithoutRemoteId(): void
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$client = new MockHttpClient();
|
||||||
|
|
||||||
|
$mapUser = $this->prophesize(MapCalendarToUser::class);
|
||||||
|
$mapUser->getUserId($user)->willReturn(null);
|
||||||
|
$clock = new MockClock(new \DateTimeImmutable('2023-07-07T12:00:00'));
|
||||||
|
|
||||||
|
$absenceReader = new MSUserAbsenceReader($client, $mapUser->reveal(), $clock);
|
||||||
|
|
||||||
|
self::assertNull($absenceReader->isUserAbsent($user), "when no user found, absence should be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideDataTestUserAbsence(): iterable
|
||||||
|
{
|
||||||
|
// contains data that was retrieved from microsoft graph api on 2023-07-06
|
||||||
|
|
||||||
|
yield [
|
||||||
|
<<<'JSON'
|
||||||
|
{
|
||||||
|
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('4feb0ae3-7ffb-48dd-891e-c86b2cdeefd4')/mailboxSettings/automaticRepliesSetting",
|
||||||
|
"status": "disabled",
|
||||||
|
"externalAudience": "none",
|
||||||
|
"internalReplyMessage": "Je suis en congé.",
|
||||||
|
"externalReplyMessage": "",
|
||||||
|
"scheduledStartDateTime": {
|
||||||
|
"dateTime": "2023-07-06T12:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
},
|
||||||
|
"scheduledEndDateTime": {
|
||||||
|
"dateTime": "2023-07-07T12:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON,
|
||||||
|
false,
|
||||||
|
"User is present"
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
<<<'JSON'
|
||||||
|
{
|
||||||
|
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('4feb0ae3-7ffb-48dd-891e-c86b2cdeefd4')/mailboxSettings/automaticRepliesSetting",
|
||||||
|
"status": "scheduled",
|
||||||
|
"externalAudience": "none",
|
||||||
|
"internalReplyMessage": "Je suis en congé.",
|
||||||
|
"externalReplyMessage": "",
|
||||||
|
"scheduledStartDateTime": {
|
||||||
|
"dateTime": "2023-07-06T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
},
|
||||||
|
"scheduledEndDateTime": {
|
||||||
|
"dateTime": "2023-07-21T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON,
|
||||||
|
true,
|
||||||
|
'User is absent with absence scheduled, we are within this period'
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
<<<'JSON'
|
||||||
|
{
|
||||||
|
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('4feb0ae3-7ffb-48dd-891e-c86b2cdeefd4')/mailboxSettings/automaticRepliesSetting",
|
||||||
|
"status": "scheduled",
|
||||||
|
"externalAudience": "none",
|
||||||
|
"internalReplyMessage": "Je suis en congé.",
|
||||||
|
"externalReplyMessage": "",
|
||||||
|
"scheduledStartDateTime": {
|
||||||
|
"dateTime": "2023-07-08T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
},
|
||||||
|
"scheduledEndDateTime": {
|
||||||
|
"dateTime": "2023-07-21T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON,
|
||||||
|
false,
|
||||||
|
'User is present: absence is scheduled for later'
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
<<<'JSON'
|
||||||
|
{
|
||||||
|
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('4feb0ae3-7ffb-48dd-891e-c86b2cdeefd4')/mailboxSettings/automaticRepliesSetting",
|
||||||
|
"status": "scheduled",
|
||||||
|
"externalAudience": "none",
|
||||||
|
"internalReplyMessage": "Je suis en congé.",
|
||||||
|
"externalReplyMessage": "",
|
||||||
|
"scheduledStartDateTime": {
|
||||||
|
"dateTime": "2023-07-05T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
},
|
||||||
|
"scheduledEndDateTime": {
|
||||||
|
"dateTime": "2023-07-06T11:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON,
|
||||||
|
false,
|
||||||
|
'User is present: absence is past'
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
<<<'JSON'
|
||||||
|
{
|
||||||
|
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('4feb0ae3-7ffb-48dd-891e-c86b2cdeefd4')/mailboxSettings/automaticRepliesSetting",
|
||||||
|
"status": "alwaysEnabled",
|
||||||
|
"externalAudience": "none",
|
||||||
|
"internalReplyMessage": "Je suis en congé.",
|
||||||
|
"externalReplyMessage": "",
|
||||||
|
"scheduledStartDateTime": {
|
||||||
|
"dateTime": "2023-07-06T12:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
},
|
||||||
|
"scheduledEndDateTime": {
|
||||||
|
"dateTime": "2023-07-07T12:00:00.0000000",
|
||||||
|
"timeZone": "UTC"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON,
|
||||||
|
true,
|
||||||
|
"User is absent: absence is always enabled"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user