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