mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Syncer for user absence, from the msgraph reader
This commit is contained in:
parent
5b42b85b50
commit
2861945a52
@ -13,8 +13,8 @@ namespace Chill\CalendarBundle\Exception;
|
|||||||
|
|
||||||
class UserAbsenceSyncException extends \LogicException
|
class UserAbsenceSyncException extends \LogicException
|
||||||
{
|
{
|
||||||
public function __construct(string $message = "", int $code = 20230706)
|
public function __construct(string $message = "", int $code = 20230706, ?\Throwable $previous = null)
|
||||||
{
|
{
|
||||||
parent::__construct($message, $code);
|
parent::__construct($message, $code, $previous);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
|
|||||||
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||||
|
|
||||||
readonly class MSUserAbsenceReader
|
final readonly class MSUserAbsenceReader implements MSUserAbsenceReaderInterface
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private HttpClientInterface $machineHttpClient,
|
private HttpClientInterface $machineHttpClient,
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
<?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\MainBundle\Entity\User;
|
||||||
|
|
||||||
|
interface MSUserAbsenceReaderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @throw UserAbsenceSyncException when the data cannot be reached or is not valid from microsoft
|
||||||
|
*/
|
||||||
|
public function isUserAbsent(User $user): bool|null;
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
<?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\MainBundle\Entity\User;
|
||||||
|
use Symfony\Component\Clock\ClockInterface;
|
||||||
|
|
||||||
|
readonly class MSUserAbsenceSync
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private MSUserAbsenceReaderInterface $absenceReader,
|
||||||
|
private ClockInterface $clock,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function syncUserAbsence(User $user): void
|
||||||
|
{
|
||||||
|
$absence = $this->absenceReader->isUserAbsent($user);
|
||||||
|
|
||||||
|
if (null === $absence) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($absence === $user->isAbsent()) {
|
||||||
|
// nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($absence) {
|
||||||
|
$user->setAbsenceStart($this->clock->now());
|
||||||
|
} else {
|
||||||
|
$user->setAbsenceStart(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
<?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\MSUserAbsenceReader;
|
||||||
|
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceReaderInterface;
|
||||||
|
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceSync;
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\PhpUnit\ProphecyTrait;
|
||||||
|
use Symfony\Component\Clock\MockClock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
class MSUserAbsenceSyncTest extends TestCase
|
||||||
|
{
|
||||||
|
use ProphecyTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideDataTestSyncUserAbsence
|
||||||
|
*/
|
||||||
|
public function testSyncUserAbsence(User $user, ?bool $absenceFromMicrosoft, bool $expectedAbsence, ?\DateTimeImmutable $expectedAbsenceStart, string $message): void
|
||||||
|
{
|
||||||
|
$userAbsenceReader = $this->prophesize(MSUserAbsenceReaderInterface::class);
|
||||||
|
$userAbsenceReader->isUserAbsent($user)->willReturn($absenceFromMicrosoft);
|
||||||
|
|
||||||
|
$clock = new MockClock(new \DateTimeImmutable('2023-07-01T12:00:00'));
|
||||||
|
|
||||||
|
$syncer = new MSUserAbsenceSync($userAbsenceReader->reveal(), $clock);
|
||||||
|
|
||||||
|
$syncer->syncUserAbsence($user);
|
||||||
|
|
||||||
|
self::assertEquals($expectedAbsence, $user->isAbsent(), $message);
|
||||||
|
self::assertEquals($expectedAbsenceStart, $user->getAbsenceStart(), $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideDataTestSyncUserAbsence(): iterable
|
||||||
|
{
|
||||||
|
yield [new User(), false, false, null, "user present remains present"];
|
||||||
|
yield [new User(), true, true, new \DateTimeImmutable('2023-07-01T12:00:00'), "user present becomes absent"];
|
||||||
|
|
||||||
|
$user = new User();
|
||||||
|
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||||
|
yield [$user, true, true, $abs, "user absent remains absent"];
|
||||||
|
|
||||||
|
$user = new User();
|
||||||
|
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||||
|
yield [$user, false, false, null, "user absent becomes present"];
|
||||||
|
|
||||||
|
yield [new User(), null, false, null, "user not syncable: presence do not change"];
|
||||||
|
|
||||||
|
$user = new User();
|
||||||
|
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||||
|
yield [$user, null, true, $abs, "user not syncable: absence do not change"];
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user