From 6277d73dc44e8ef156467cc9988fdc631eca394a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 25 Sep 2024 12:01:34 +0200 Subject: [PATCH 01/36] 2314: add regions and playlists in screen processor to avoid multiple edits and deadlock --- src/State/ScreenProcessor.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 8ad6afc7..53f7008c 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -9,14 +9,24 @@ use App\Dto\ScreenInput; use App\Entity\Tenant\Screen; use App\Repository\ScreenLayoutRepository; +use App\Repository\ScreenLayoutRegionsRepository; +use App\Repository\PlaylistRepository; use App\Utils\IriHelperUtils; use Doctrine\ORM\EntityManagerInterface; +use App\Entity\Tenant\PlaylistScreenRegion; +use App\Entity\Tenant\Playlist; +use Psr\Cache\InvalidArgumentException; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; +use App\Exceptions\AuthScreenBindException; class ScreenProcessor extends AbstractProcessor { public function __construct( private readonly IriHelperUtils $iriHelperUtils, private readonly ScreenLayoutRepository $layoutRepository, + private readonly ScreenLayoutRegionsRepository $screenLayoutRegionsRepository, + private readonly PlaylistRepository $playlistRepository, EntityManagerInterface $entityManager, ProcessorInterface $persistProcessor, ProcessorInterface $removeProcessor, @@ -44,6 +54,26 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $screen->setEnableColorSchemeChange($object->enableColorSchemeChange); } + if (isset($object->regionsAndPlaylists)) { + foreach ($object->regionsAndPlaylists as $playlistAndRegion) { + $playlistAndRegionToSave = new PlaylistScreenRegion(); + + $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); + if (is_null($region)) { + throw new InvalidArgumentException('Unknown region resource'); + } + + $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); + if (is_null($playlist)) { + throw new InvalidArgumentException('Unknown playlist resource'); + } + + $playlistAndRegionToSave->setPlaylist($playlist); + $playlistAndRegionToSave->setRegion($region); + $screen->addPlaylistScreenRegion($playlistAndRegionToSave); + } + } + if (!empty($object->layout)) { // Validate that layout IRI exists. $ulid = $this->iriHelperUtils->getUlidFromIRI($object->layout); From aa9cd51617a174657e272d052b8f930945c9e60c Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 11:21:28 +0200 Subject: [PATCH 02/36] 2314: add regionsAndPlaylists and groups to screeninput --- src/Dto/ScreenInput.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Dto/ScreenInput.php b/src/Dto/ScreenInput.php index f1206da4..84c2a8d9 100644 --- a/src/Dto/ScreenInput.php +++ b/src/Dto/ScreenInput.php @@ -16,4 +16,6 @@ class ScreenInput public string $orientation = ''; public ?bool $enableColorSchemeChange = null; + public ?array $regionsAndPlaylists = null; + public ?array $groups = null; } From 3b9be3a909e1b96a1355853aecb9d7e75f64a30a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 11:21:59 +0200 Subject: [PATCH 03/36] 2314: add deleteAllRelationsForARegion, to delete screen playlists and before saving new --- .../PlaylistScreenRegionRepository.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/Repository/PlaylistScreenRegionRepository.php b/src/Repository/PlaylistScreenRegionRepository.php index d058072e..b59c418f 100644 --- a/src/Repository/PlaylistScreenRegionRepository.php +++ b/src/Repository/PlaylistScreenRegionRepository.php @@ -135,6 +135,31 @@ public function deleteRelations(Ulid $screenUlid, Ulid $regionUid, Ulid $playlis $this->entityManager->remove($playlistScreenRegion); $this->entityManager->flush(); } + /** + * Remove relation between a playlist in a given region on a given screen. + * + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function deleteAllRelationsForARegion(Ulid $screenUlid, array $regions): void + { + foreach ($regions as $region) { + $playlistScreenRegions = $this->findBy([ + 'screen' => $screenUlid, + 'region' => $region['regionId'], + ]); + + if (is_null($playlistScreenRegions)) { + throw new InvalidArgumentException('Relation not found'); + } + + foreach ($playlistScreenRegions as $entity) { + $this->entityManager->remove($entity); + } + } + + $this->entityManager->flush(); + } /** * Remove all relations a playlist has within a tenant. From 1231e39f08a85cca91b35c2b9812b2b927c5151b Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 11:22:20 +0200 Subject: [PATCH 04/36] 2314: add cascade: ['persist', 'remove'] to playlistScreenRegions on screen --- src/Entity/Tenant/Screen.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Entity/Tenant/Screen.php b/src/Entity/Tenant/Screen.php index 63ccafde..60807632 100644 --- a/src/Entity/Tenant/Screen.php +++ b/src/Entity/Tenant/Screen.php @@ -52,7 +52,7 @@ class Screen extends AbstractTenantScopedEntity implements RelationsChecksumInte /** * @var \Doctrine\Common\Collections\Collection|\App\Entity\Tenant\PlaylistScreenRegion[] */ - #[ORM\OneToMany(mappedBy: 'screen', targetEntity: PlaylistScreenRegion::class, orphanRemoval: true)] + #[ORM\OneToMany(mappedBy: 'screen', targetEntity: PlaylistScreenRegion::class, cascade: ['persist', 'remove'], orphanRemoval: true)] #[ORM\OrderBy(['weight' => \Doctrine\Common\Collections\Order::Ascending->value])] private Collection $playlistScreenRegions; @@ -161,7 +161,7 @@ public function removePlaylistScreenRegion(PlaylistScreenRegion $playlistScreenR public function removeAllPlaylistScreenRegions(): self { - foreach ($this->playlistScreenRegions as $playlistScreenRegion) { + foreach ($this->getPlaylistScreenRegions() as $playlistScreenRegion) { // set the owning side to null (unless already changed) if ($playlistScreenRegion->getScreen() === $this) { $playlistScreenRegion->removeScreen(); From 591b8ec1191cc38111f210f06ecd4ea93506cf60 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 11:22:51 +0200 Subject: [PATCH 05/36] 2314: delete playlists and save groups --- src/State/ScreenProcessor.php | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 53f7008c..f2f167b3 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -8,9 +8,11 @@ use ApiPlatform\State\ProcessorInterface; use App\Dto\ScreenInput; use App\Entity\Tenant\Screen; -use App\Repository\ScreenLayoutRepository; +use App\Repository\ScreenGroupRepository; use App\Repository\ScreenLayoutRegionsRepository; +use App\Repository\ScreenLayoutRepository; use App\Repository\PlaylistRepository; +use App\Repository\PlaylistScreenRegionRepository; use App\Utils\IriHelperUtils; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Tenant\PlaylistScreenRegion; @@ -27,6 +29,8 @@ public function __construct( private readonly ScreenLayoutRepository $layoutRepository, private readonly ScreenLayoutRegionsRepository $screenLayoutRegionsRepository, private readonly PlaylistRepository $playlistRepository, + private readonly PlaylistScreenRegionRepository $playlistScreenRegionRepository, + private readonly ScreenGroupRepository $groupRepository, EntityManagerInterface $entityManager, ProcessorInterface $persistProcessor, ProcessorInterface $removeProcessor, @@ -55,6 +59,10 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari } if (isset($object->regionsAndPlaylists)) { + // Delete playlists from relevant regions + $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); + + // Add new playlist/screen/region relations foreach ($object->regionsAndPlaylists as $playlistAndRegion) { $playlistAndRegionToSave = new PlaylistScreenRegion(); @@ -70,10 +78,23 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $playlistAndRegionToSave->setPlaylist($playlist); $playlistAndRegionToSave->setRegion($region); + $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); $screen->addPlaylistScreenRegion($playlistAndRegionToSave); } } + if (isset($object->groups)) { + $screen->removeAllScreenGroup(); + + foreach ($object->groups as $group) { + $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); + if (is_null($groupToSave)) { + throw new InvalidArgumentException('Unknown group resource'); + } + $screen->addScreenGroup($groupToSave); + } + } + if (!empty($object->layout)) { // Validate that layout IRI exists. $ulid = $this->iriHelperUtils->getUlidFromIRI($object->layout); From 74cb181a6c7643949d77dfb1f3d94d99768867fb Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 19:47:12 +0200 Subject: [PATCH 06/36] 2314: make psalm happy --- src/State/ScreenProcessor.php | 79 +++++++++++++++++------------------ 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index f2f167b3..da7a4e64 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -8,6 +8,7 @@ use ApiPlatform\State\ProcessorInterface; use App\Dto\ScreenInput; use App\Entity\Tenant\Screen; +use ApiPlatform\Metadata\Exception\InvalidArgumentException; use App\Repository\ScreenGroupRepository; use App\Repository\ScreenLayoutRegionsRepository; use App\Repository\ScreenLayoutRepository; @@ -16,11 +17,6 @@ use App\Utils\IriHelperUtils; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Tenant\PlaylistScreenRegion; -use App\Entity\Tenant\Playlist; -use Psr\Cache\InvalidArgumentException; -use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Response; -use App\Exceptions\AuthScreenBindException; class ScreenProcessor extends AbstractProcessor { @@ -39,6 +35,7 @@ public function __construct( parent::__construct($entityManager, $persistProcessor, $removeProcessor, $provider); } + protected function fromInput(mixed $object, Operation $operation, array $uriVariables, array $context): Screen { // FIXME Do we really have to do (something like) this to load an existing object into the entity manager? @@ -58,42 +55,42 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $screen->setEnableColorSchemeChange($object->enableColorSchemeChange); } - if (isset($object->regionsAndPlaylists)) { - // Delete playlists from relevant regions - $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); - - // Add new playlist/screen/region relations - foreach ($object->regionsAndPlaylists as $playlistAndRegion) { - $playlistAndRegionToSave = new PlaylistScreenRegion(); - - $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); - if (is_null($region)) { - throw new InvalidArgumentException('Unknown region resource'); - } - - $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); - if (is_null($playlist)) { - throw new InvalidArgumentException('Unknown playlist resource'); - } - - $playlistAndRegionToSave->setPlaylist($playlist); - $playlistAndRegionToSave->setRegion($region); - $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); - $screen->addPlaylistScreenRegion($playlistAndRegionToSave); - } - } - - if (isset($object->groups)) { - $screen->removeAllScreenGroup(); - - foreach ($object->groups as $group) { - $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); - if (is_null($groupToSave)) { - throw new InvalidArgumentException('Unknown group resource'); - } - $screen->addScreenGroup($groupToSave); - } - } + // if (isset($object->regionsAndPlaylists) && isset($screen)) { + // // Delete playlists from relevant regions + // $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); + + // // Add new playlist/screen/region relations + // foreach ($object->regionsAndPlaylists as $playlistAndRegion) { + // $playlistAndRegionToSave = new PlaylistScreenRegion(); + + // $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); + // if (is_null($region)) { + // throw new InvalidArgumentException('Unknown region resource'); + // } + + // $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); + // if (is_null($playlist)) { + // throw new InvalidArgumentException('Unknown playlist resource'); + // } + + // $playlistAndRegionToSave->setPlaylist($playlist); + // $playlistAndRegionToSave->setRegion($region); + // $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); + // $screen->addPlaylistScreenRegion($playlistAndRegionToSave); + // } + // } + + // if (isset($object->groups) && isset($screen)) { + // $screen->removeAllScreenGroup(); + + // foreach ($object->groups as $group) { + // $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); + // if (is_null($groupToSave)) { + // throw new InvalidArgumentException('Unknown group resource'); + // } + // $screen->addScreenGroup($groupToSave); + // } + // } if (!empty($object->layout)) { // Validate that layout IRI exists. From 49fda457ccca0d13aee207362a91b061a1f9f590 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 19:57:03 +0200 Subject: [PATCH 07/36] 2314: psalm will never be happy --- src/State/ScreenProcessor.php | 73 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index da7a4e64..63441ae0 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -35,7 +35,6 @@ public function __construct( parent::__construct($entityManager, $persistProcessor, $removeProcessor, $provider); } - protected function fromInput(mixed $object, Operation $operation, array $uriVariables, array $context): Screen { // FIXME Do we really have to do (something like) this to load an existing object into the entity manager? @@ -55,42 +54,42 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $screen->setEnableColorSchemeChange($object->enableColorSchemeChange); } - // if (isset($object->regionsAndPlaylists) && isset($screen)) { - // // Delete playlists from relevant regions - // $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); - - // // Add new playlist/screen/region relations - // foreach ($object->regionsAndPlaylists as $playlistAndRegion) { - // $playlistAndRegionToSave = new PlaylistScreenRegion(); - - // $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); - // if (is_null($region)) { - // throw new InvalidArgumentException('Unknown region resource'); - // } - - // $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); - // if (is_null($playlist)) { - // throw new InvalidArgumentException('Unknown playlist resource'); - // } - - // $playlistAndRegionToSave->setPlaylist($playlist); - // $playlistAndRegionToSave->setRegion($region); - // $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); - // $screen->addPlaylistScreenRegion($playlistAndRegionToSave); - // } - // } - - // if (isset($object->groups) && isset($screen)) { - // $screen->removeAllScreenGroup(); - - // foreach ($object->groups as $group) { - // $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); - // if (is_null($groupToSave)) { - // throw new InvalidArgumentException('Unknown group resource'); - // } - // $screen->addScreenGroup($groupToSave); - // } - // } + if (isset($object->regionsAndPlaylists) && isset($screen)) { + // Delete playlists from relevant regions + $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); + + // Add new playlist/screen/region relations + foreach ($object->regionsAndPlaylists as $playlistAndRegion) { + $playlistAndRegionToSave = new PlaylistScreenRegion(); + + $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); + if (is_null($region)) { + throw new InvalidArgumentException('Unknown region resource'); + } + + $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); + if (is_null($playlist)) { + throw new InvalidArgumentException('Unknown playlist resource'); + } + + $playlistAndRegionToSave->setPlaylist($playlist); + $playlistAndRegionToSave->setRegion($region); + $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); + $screen->addPlaylistScreenRegion($playlistAndRegionToSave); + } + } + + if (isset($object->groups) && isset($screen)) { + $screen->removeAllScreenGroup(); + + foreach ($object->groups as $group) { + $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); + if (is_null($groupToSave)) { + throw new InvalidArgumentException('Unknown group resource'); + } + $screen->addScreenGroup($groupToSave); + } + } if (!empty($object->layout)) { // Validate that layout IRI exists. From 444d32c0f643df18e629bf78d1ab3622dabe9d85 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 20:00:09 +0200 Subject: [PATCH 08/36] 2314: coding standards appyl --- src/Repository/PlaylistScreenRegionRepository.php | 1 + src/State/ScreenProcessor.php | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Repository/PlaylistScreenRegionRepository.php b/src/Repository/PlaylistScreenRegionRepository.php index b59c418f..2c41acbe 100644 --- a/src/Repository/PlaylistScreenRegionRepository.php +++ b/src/Repository/PlaylistScreenRegionRepository.php @@ -135,6 +135,7 @@ public function deleteRelations(Ulid $screenUlid, Ulid $regionUid, Ulid $playlis $this->entityManager->remove($playlistScreenRegion); $this->entityManager->flush(); } + /** * Remove relation between a playlist in a given region on a given screen. * diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 63441ae0..91a400b8 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -4,19 +4,19 @@ namespace App\State; +use ApiPlatform\Metadata\Exception\InvalidArgumentException; use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use App\Dto\ScreenInput; +use App\Entity\Tenant\PlaylistScreenRegion; use App\Entity\Tenant\Screen; -use ApiPlatform\Metadata\Exception\InvalidArgumentException; +use App\Repository\PlaylistRepository; +use App\Repository\PlaylistScreenRegionRepository; use App\Repository\ScreenGroupRepository; use App\Repository\ScreenLayoutRegionsRepository; use App\Repository\ScreenLayoutRepository; -use App\Repository\PlaylistRepository; -use App\Repository\PlaylistScreenRegionRepository; use App\Utils\IriHelperUtils; use Doctrine\ORM\EntityManagerInterface; -use App\Entity\Tenant\PlaylistScreenRegion; class ScreenProcessor extends AbstractProcessor { @@ -62,12 +62,12 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari foreach ($object->regionsAndPlaylists as $playlistAndRegion) { $playlistAndRegionToSave = new PlaylistScreenRegion(); - $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); + $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); if (is_null($region)) { throw new InvalidArgumentException('Unknown region resource'); } - $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); + $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); if (is_null($playlist)) { throw new InvalidArgumentException('Unknown playlist resource'); } @@ -83,7 +83,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $screen->removeAllScreenGroup(); foreach ($object->groups as $group) { - $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); + $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); if (is_null($groupToSave)) { throw new InvalidArgumentException('Unknown group resource'); } From 0f863e1bfcb661346976121fd761e331205df42a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 20:05:08 +0200 Subject: [PATCH 09/36] 2314: update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e76d642c..96c2aea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ All notable changes to this project will be documented in this file. - [#214](https://github.com/os2display/display-api-service/pull/214) - Updated endSessionUrl to be nullable. + +- [#213](https://github.com/os2display/display-api-service/pull/213) + - Add regionsAndPlaylists and groups to `ScreenInput.php` + - Add adding playlist/regions in `ScreenProcessor.php` (as an alternative to sending multiple requests) + - Add a function that deletes all playlists for a screen in a specific region (`PlaylistScreenRegionRepository.php`) + - Save groups in `ScreenProcessor.php` + - [#193](https://github.com/os2display/display-api-service/pull/193) - Adds support for interactive slides. - Adds interactivity for creating quick bookings from a slide through Microsoft Graph. From 268684065ed357f2d7d01002ce59beab2ac85c13 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 20:37:08 +0200 Subject: [PATCH 10/36] 2314: update baseline --- psalm-baseline.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/psalm-baseline.xml b/psalm-baseline.xml index d3120752..1931db62 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -685,9 +685,6 @@ - - - @@ -746,10 +743,10 @@ - + From 24dc4799f8d015a3322500852540b046a8f0442b Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 26 Sep 2024 20:38:02 +0200 Subject: [PATCH 11/36] 2314: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96c2aea7..9a5ead65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Add adding playlist/regions in `ScreenProcessor.php` (as an alternative to sending multiple requests) - Add a function that deletes all playlists for a screen in a specific region (`PlaylistScreenRegionRepository.php`) - Save groups in `ScreenProcessor.php` + - Update psalm baseline - [#193](https://github.com/os2display/display-api-service/pull/193) - Adds support for interactive slides. From 1cca81fef934fe9f3a1538ccff13e33d68db0483 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 1 Oct 2024 09:56:34 +0200 Subject: [PATCH 12/36] 2314: update-api-spec --- public/api-spec-v2.json | 36 ++++++++++++++++++++++++++++++++++++ public/api-spec-v2.yaml | 24 ++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/public/api-spec-v2.json b/public/api-spec-v2.json index 7efcb4b9..cc4c0ff4 100644 --- a/public/api-spec-v2.json +++ b/public/api-spec-v2.json @@ -11119,6 +11119,24 @@ "boolean", "null" ] + }, + "regionsAndPlaylists": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } + }, + "groups": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } } } }, @@ -11153,6 +11171,24 @@ "boolean", "null" ] + }, + "regionsAndPlaylists": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } + }, + "groups": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } } } }, diff --git a/public/api-spec-v2.yaml b/public/api-spec-v2.yaml index 01470fdd..98a347ab 100644 --- a/public/api-spec-v2.yaml +++ b/public/api-spec-v2.yaml @@ -7735,6 +7735,18 @@ components: type: - boolean - 'null' + regionsAndPlaylists: + type: + - array + - 'null' + items: + type: string + groups: + type: + - array + - 'null' + items: + type: string Screen.ScreenInput.jsonld: type: object description: '' @@ -7758,6 +7770,18 @@ components: type: - boolean - 'null' + regionsAndPlaylists: + type: + - array + - 'null' + items: + type: string + groups: + type: + - array + - 'null' + items: + type: string Screen.jsonld: type: object description: '' From 0f391764cdb3b6505c38264fbd03a94d4ae689cd Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 09:09:04 +0200 Subject: [PATCH 13/36] 2314: delete playlists that is removed in frontend, save new playlists --- .../PlaylistScreenRegionDeleteController.php | 2 +- src/Dto/ScreenInput.php | 2 +- .../PlaylistScreenRegionRepository.php | 29 +--------- src/State/ScreenProcessor.php | 56 ++++++++++++++----- 4 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/Controller/PlaylistScreenRegionDeleteController.php b/src/Controller/PlaylistScreenRegionDeleteController.php index 7c6469ce..efbafb24 100644 --- a/src/Controller/PlaylistScreenRegionDeleteController.php +++ b/src/Controller/PlaylistScreenRegionDeleteController.php @@ -23,7 +23,7 @@ public function __invoke(string $id, string $regionId, string $playlistId): Json $regionUlid = $this->validationUtils->validateUlid($regionId); $playlistUlid = $this->validationUtils->validateUlid($playlistId); - $this->playlistScreenRegionRepository->deleteRelations($screenUlid, $regionUlid, $playlistUlid, $this->getActiveTenant()); + $this->playlistScreenRegionRepository->deleteRelations($screenUlid, $regionUlid, $playlistUlid); return new JsonResponse(null, \Symfony\Component\HttpFoundation\Response::HTTP_NO_CONTENT); } diff --git a/src/Dto/ScreenInput.php b/src/Dto/ScreenInput.php index 84c2a8d9..b2ca878f 100644 --- a/src/Dto/ScreenInput.php +++ b/src/Dto/ScreenInput.php @@ -16,6 +16,6 @@ class ScreenInput public string $orientation = ''; public ?bool $enableColorSchemeChange = null; - public ?array $regionsAndPlaylists = null; + public ?array $regions = null; public ?array $groups = null; } diff --git a/src/Repository/PlaylistScreenRegionRepository.php b/src/Repository/PlaylistScreenRegionRepository.php index 2c41acbe..4fee9c9c 100644 --- a/src/Repository/PlaylistScreenRegionRepository.php +++ b/src/Repository/PlaylistScreenRegionRepository.php @@ -119,13 +119,12 @@ public function updateRelations(Ulid $screenUlid, Ulid $regionUlid, ArrayCollect * @throws \Doctrine\ORM\ORMException * @throws \Doctrine\ORM\OptimisticLockException */ - public function deleteRelations(Ulid $screenUlid, Ulid $regionUid, Ulid $playlistUlid, Tenant $tenant): void + public function deleteRelations(Ulid $screenUlid, Ulid $regionUid, Ulid $playlistUlid): void { $playlistScreenRegion = $this->findOneBy([ 'screen' => $screenUlid, 'region' => $regionUid, 'playlist' => $playlistUlid, - 'tenant' => $tenant, ]); if (is_null($playlistScreenRegion)) { @@ -136,32 +135,6 @@ public function deleteRelations(Ulid $screenUlid, Ulid $regionUid, Ulid $playlis $this->entityManager->flush(); } - /** - * Remove relation between a playlist in a given region on a given screen. - * - * @throws \Doctrine\ORM\ORMException - * @throws \Doctrine\ORM\OptimisticLockException - */ - public function deleteAllRelationsForARegion(Ulid $screenUlid, array $regions): void - { - foreach ($regions as $region) { - $playlistScreenRegions = $this->findBy([ - 'screen' => $screenUlid, - 'region' => $region['regionId'], - ]); - - if (is_null($playlistScreenRegions)) { - throw new InvalidArgumentException('Relation not found'); - } - - foreach ($playlistScreenRegions as $entity) { - $this->entityManager->remove($entity); - } - } - - $this->entityManager->flush(); - } - /** * Remove all relations a playlist has within a tenant. * diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 91a400b8..03d17fa6 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -17,6 +17,7 @@ use App\Repository\ScreenLayoutRepository; use App\Utils\IriHelperUtils; use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Uid\Ulid; class ScreenProcessor extends AbstractProcessor { @@ -54,28 +55,55 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $screen->setEnableColorSchemeChange($object->enableColorSchemeChange); } - if (isset($object->regionsAndPlaylists) && isset($screen)) { - // Delete playlists from relevant regions - $this->playlistScreenRegionRepository->deleteAllRelationsForARegion($screen->getId(), $object->regionsAndPlaylists); + // Adding relations for playlist/screen/region + if (isset($object->regions) && isset($screen)) { - // Add new playlist/screen/region relations - foreach ($object->regionsAndPlaylists as $playlistAndRegion) { - $playlistAndRegionToSave = new PlaylistScreenRegion(); + foreach ($object->regions as $regionAndPlaylists) { + $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $regionAndPlaylists['regionId']]); - $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $playlistAndRegion['regionId']]); if (is_null($region)) { throw new InvalidArgumentException('Unknown region resource'); } - $playlist = $this->playlistRepository->findOneBy(['id' => $playlistAndRegion['playlist']]); - if (is_null($playlist)) { - throw new InvalidArgumentException('Unknown playlist resource'); + $newPlaylists = array_map(function ($playlistObject) { + return Ulid::fromString($playlistObject['id']); + }, $regionAndPlaylists['playlists']); + + $playlistScreens = $this->playlistScreenRegionRepository->findBy([ + 'screen' => $screen->getId(), + 'region' => $regionAndPlaylists['regionId'], + ]); + + $existingPlaylists = array_map(function ($playlistObject) { + return $playlistObject->getPlaylist()->getId(); + }, $playlistScreens); + + // This diff finds the playlists to be deleted + $deletePlaylists = array_diff($existingPlaylists, $newPlaylists); + + // ... and deletes them. + foreach ($deletePlaylists as $deletePlaylist) { + $playlistScreens = $this->playlistScreenRegionRepository->deleteRelations($screen->getId(), $region->getId(), $deletePlaylist); } - $playlistAndRegionToSave->setPlaylist($playlist); - $playlistAndRegionToSave->setRegion($region); - $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); - $screen->addPlaylistScreenRegion($playlistAndRegionToSave); + // This diff finds the playlists to be saved + $newPlaylists = array_diff($newPlaylists, $existingPlaylists); + + // ... and saves them. + foreach ($newPlaylists as $newPlaylist) { + $playlistAndRegionToSave = new PlaylistScreenRegion(); + $playlist = $this->playlistRepository->findOneBy(['id' => $newPlaylist]); + + if (is_null($playlist)) { + throw new InvalidArgumentException('Unknown playlist resource'); + } + + $playlistAndRegionToSave->setPlaylist($playlist); + $playlistAndRegionToSave->setRegion($region); + // todo + // $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); + $screen->addPlaylistScreenRegion($playlistAndRegionToSave); + } } } From 1d0c374fb65a5f8fd7ebe7e26dda35cdc4abc318 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 10:16:04 +0200 Subject: [PATCH 14/36] 2314: handle playlist weight --- src/State/ScreenProcessor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 03d17fa6..b1c47505 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -98,10 +98,10 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari throw new InvalidArgumentException('Unknown playlist resource'); } + $playlistWeight = array_filter($regionAndPlaylists['playlists'], fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $playlist->getId()); $playlistAndRegionToSave->setPlaylist($playlist); $playlistAndRegionToSave->setRegion($region); - // todo - // $playlistAndRegionToSave->setWeight($playlistAndRegion['weight']); + $playlistAndRegionToSave->setWeight($playlistWeight[0]['weight']); $screen->addPlaylistScreenRegion($playlistAndRegionToSave); } } From 55e921e7e2ef77323bb07e7066dc4ccdbc064bb5 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 10:17:31 +0200 Subject: [PATCH 15/36] 2314: coding standards apply --- src/State/ScreenProcessor.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index b1c47505..d27e3a50 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -57,7 +57,6 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari // Adding relations for playlist/screen/region if (isset($object->regions) && isset($screen)) { - foreach ($object->regions as $regionAndPlaylists) { $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $regionAndPlaylists['regionId']]); From a9edd7bc257c001d9e3840ed9fdb142433c12c3b Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 10:17:51 +0200 Subject: [PATCH 16/36] 2314: markdown remove indentation for code sections --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index ce4df7a3..46eb989a 100644 --- a/README.md +++ b/README.md @@ -258,16 +258,16 @@ the coding standard for the project. - PHP files [PHP Coding Standards Fixer](https://cs.symfony.com/) - ```shell - docker compose exec phpfpm composer coding-standards-check - ``` +```shell +docker compose exec phpfpm composer coding-standards-check +``` - Markdown files (markdownlint standard rules) - ```shell - docker run --rm -v .:/app --workdir=/app node:20 npm install - docker run --rm -v .:/app --workdir=/app node:20 npm run coding-standards-check - ``` +```shell +docker run --rm -v .:/app --workdir=/app node:20 npm install +docker run --rm -v .:/app --workdir=/app node:20 npm run coding-standards-check +``` #### YAML @@ -281,16 +281,16 @@ To attempt to automatically fix coding style issues - PHP files [PHP Coding Standards Fixer](https://cs.symfony.com/) - ```sh - docker compose exec phpfpm composer coding-standards-apply - ``` +```sh +docker compose exec phpfpm composer coding-standards-apply +``` - Markdown files (markdownlint standard rules) - ```shell - docker run --rm -v .:/app --workdir=/app node:18 npm install - docker run --rm -v .:/app --workdir=/app node:18 npm run coding-standards-apply - ``` +```shell +docker run --rm -v .:/app --workdir=/app node:18 npm install +docker run --rm -v .:/app --workdir=/app node:18 npm run coding-standards-apply +``` ## Tests From ec379861fdec61cc3655d8ab5ba070b10a1ec492 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 11:05:00 +0200 Subject: [PATCH 17/36] 2314: code analysis --- src/State/ScreenProcessor.php | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index d27e3a50..f5acb834 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -8,6 +8,7 @@ use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use App\Dto\ScreenInput; +use App\Entity\Tenant\Playlist; use App\Entity\Tenant\PlaylistScreenRegion; use App\Entity\Tenant\Screen; use App\Repository\PlaylistRepository; @@ -64,9 +65,13 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari throw new InvalidArgumentException('Unknown region resource'); } - $newPlaylists = array_map(function ($playlistObject) { - return Ulid::fromString($playlistObject['id']); - }, $regionAndPlaylists['playlists']); + $newPlaylists = array_map( + /** + * @param array $playlistObject + * + * @return Ulid + */ + fn ($playlistObject): Ulid => Ulid::fromString($playlistObject['id']), $regionAndPlaylists['playlists']); $playlistScreens = $this->playlistScreenRegionRepository->findBy([ 'screen' => $screen->getId(), @@ -74,7 +79,10 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari ]); $existingPlaylists = array_map(function ($playlistObject) { - return $playlistObject->getPlaylist()->getId(); + $playlist = $playlistObject->getPlaylist(); + if (!is_null($playlist)) { + return $playlist->getId(); + } }, $playlistScreens); // This diff finds the playlists to be deleted @@ -82,7 +90,11 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari // ... and deletes them. foreach ($deletePlaylists as $deletePlaylist) { - $playlistScreens = $this->playlistScreenRegionRepository->deleteRelations($screen->getId(), $region->getId(), $deletePlaylist); + $regionId = $region->getId(); + $screenId = $screen->getId(); + if (!is_null($screenId) && !is_null($regionId) && !is_null($deletePlaylist)) { + $this->playlistScreenRegionRepository->deleteRelations($screenId, $regionId, $deletePlaylist); + } } // This diff finds the playlists to be saved @@ -97,7 +109,14 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari throw new InvalidArgumentException('Unknown playlist resource'); } - $playlistWeight = array_filter($regionAndPlaylists['playlists'], fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $playlist->getId()); + $playlistWeight = array_filter($regionAndPlaylists['playlists'], + /** + * @param array $playlistAndWeight + * + * @return bool + */ + fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $playlist->getId()); + $playlistAndRegionToSave->setPlaylist($playlist); $playlistAndRegionToSave->setRegion($region); $playlistAndRegionToSave->setWeight($playlistWeight[0]['weight']); From 926795563859a5a74861ddb63902889917e5f756 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Mon, 7 Oct 2024 11:07:17 +0200 Subject: [PATCH 18/36] 2314: update api spec --- public/api-spec-v2.json | 4 ++-- public/api-spec-v2.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/api-spec-v2.json b/public/api-spec-v2.json index cc4c0ff4..c7425dcd 100644 --- a/public/api-spec-v2.json +++ b/public/api-spec-v2.json @@ -11120,7 +11120,7 @@ "null" ] }, - "regionsAndPlaylists": { + "regions": { "type": [ "array", "null" @@ -11172,7 +11172,7 @@ "null" ] }, - "regionsAndPlaylists": { + "regions": { "type": [ "array", "null" diff --git a/public/api-spec-v2.yaml b/public/api-spec-v2.yaml index 98a347ab..65b52cea 100644 --- a/public/api-spec-v2.yaml +++ b/public/api-spec-v2.yaml @@ -7735,7 +7735,7 @@ components: type: - boolean - 'null' - regionsAndPlaylists: + regions: type: - array - 'null' @@ -7770,7 +7770,7 @@ components: type: - boolean - 'null' - regionsAndPlaylists: + regions: type: - array - 'null' From 2b7dbf4c7af715d20093845de4ba8a9c54e6341e Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 8 Oct 2024 11:07:53 +0200 Subject: [PATCH 19/36] 2314: composer update "symfony/*" --with-dependencies --- composer.lock | 989 +++++++++++++++++++++++++------------------------- 1 file changed, 503 insertions(+), 486 deletions(-) diff --git a/composer.lock b/composer.lock index b4cb0997..72e34e98 100644 --- a/composer.lock +++ b/composer.lock @@ -630,16 +630,16 @@ }, { "name": "doctrine/collections", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/420480fc085bc65f3c956af13abe8e7546f94813", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { @@ -696,7 +696,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.1" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -712,7 +712,7 @@ "type": "tidelift" } ], - "time": "2024-03-05T22:28:45+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/common", @@ -1177,16 +1177,16 @@ }, { "name": "doctrine/event-manager", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", "shasum": "" }, "require": { @@ -1196,10 +1196,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^10", + "doctrine/coding-standard": "^12", "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "type": "library", "autoload": { @@ -1248,7 +1248,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { @@ -1264,7 +1264,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:59:15+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", @@ -1709,16 +1709,16 @@ }, { "name": "doctrine/persistence", - "version": "3.3.1", + "version": "3.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b6fd1f126b13c1f7e7321f7338b14a19116b5de4" + "reference": "b337726451f5d530df338fc7f68dee8781b49779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b6fd1f126b13c1f7e7321f7338b14a19116b5de4", - "reference": "b6fd1f126b13c1f7e7321f7338b14a19116b5de4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", "shasum": "" }, "require": { @@ -1730,15 +1730,14 @@ "doctrine/common": "<2.10" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^12", "doctrine/common": "^3.0", - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.11.1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8.5 || ^9.5", "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.3.0" + "vimeo/psalm": "4.30.0 || 5.24.0" }, "type": "library", "autoload": { @@ -1787,7 +1786,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.1" + "source": "https://github.com/doctrine/persistence/tree/3.3.3" }, "funding": [ { @@ -1803,7 +1802,7 @@ "type": "tidelift" } ], - "time": "2024-03-01T19:53:13+00:00" + "time": "2024-06-20T10:14:30+00:00" }, { "name": "doctrine/sql-formatter", @@ -2014,16 +2013,16 @@ }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.16", + "version": "v1.0.18", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", "shasum": "" }, "require": { @@ -2080,7 +2079,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" }, "funding": [ { @@ -2092,7 +2091,7 @@ "type": "tidelift" } ], - "time": "2023-05-24T07:17:17+00:00" + "time": "2024-03-20T12:50:41+00:00" }, { "name": "gesdinet/jwt-refresh-token-bundle", @@ -2869,16 +2868,16 @@ }, { "name": "laminas/laminas-code", - "version": "4.13.0", + "version": "4.14.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" + "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/562e02b7d85cb9142b5116cc76c4c7c162a11a1c", + "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c", "shasum": "" }, "require": { @@ -2890,7 +2889,7 @@ "laminas/laminas-coding-standard": "^2.5.0", "laminas/laminas-stdlib": "^3.17.0", "phpunit/phpunit": "^10.3.3", - "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-phpunit": "^0.19.0", "vimeo/psalm": "^5.15.0" }, "suggest": { @@ -2928,7 +2927,7 @@ "type": "community_bridge" } ], - "time": "2023-10-18T10:00:55+00:00" + "time": "2024-06-17T08:50:25+00:00" }, { "name": "lcobucci/clock", @@ -3361,16 +3360,16 @@ }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -3393,7 +3392,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -3446,7 +3445,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -3458,7 +3457,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "namshi/jose", @@ -4537,16 +4536,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -4581,9 +4580,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "ralouphie/getallheaders", @@ -4788,16 +4787,16 @@ }, { "name": "symfony/asset", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "14b1c0fddb64af6ea626af51bb3c47af9fa19cb7" + "reference": "c668aa320e26b7379540368832b9d1dd43d32603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/14b1c0fddb64af6ea626af51bb3c47af9fa19cb7", - "reference": "14b1c0fddb64af6ea626af51bb3c47af9fa19cb7", + "url": "https://api.github.com/repos/symfony/asset/zipball/c668aa320e26b7379540368832b9d1dd43d32603", + "reference": "c668aa320e26b7379540368832b9d1dd43d32603", "shasum": "" }, "require": { @@ -4837,7 +4836,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.4.3" + "source": "https://github.com/symfony/asset/tree/v6.4.8" }, "funding": [ { @@ -4853,20 +4852,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/cache", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7" + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0ef36534694c572ff526d91c7181f3edede176e7", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7", + "url": "https://api.github.com/repos/symfony/cache/zipball/a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", "shasum": "" }, "require": { @@ -4933,7 +4932,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.4" + "source": "https://github.com/symfony/cache/tree/v6.4.12" }, "funding": [ { @@ -4949,20 +4948,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { @@ -4972,7 +4971,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5009,7 +5008,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -5025,20 +5024,20 @@ "type": "tidelift" } ], - "time": "2023-09-25T12:52:38+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/clock", - "version": "v6.4.5", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "ecba44be4def12cd71e0460b956ab7e51a2c980e" + "reference": "7a4840efd17135cbd547e41ec49fb910ed4f8b98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/ecba44be4def12cd71e0460b956ab7e51a2c980e", - "reference": "ecba44be4def12cd71e0460b956ab7e51a2c980e", + "url": "https://api.github.com/repos/symfony/clock/zipball/7a4840efd17135cbd547e41ec49fb910ed4f8b98", + "reference": "7a4840efd17135cbd547e41ec49fb910ed4f8b98", "shasum": "" }, "require": { @@ -5083,7 +5082,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.5" + "source": "https://github.com/symfony/clock/tree/v6.4.8" }, "funding": [ { @@ -5099,20 +5098,20 @@ "type": "tidelift" } ], - "time": "2024-03-01T14:02:27+00:00" + "time": "2024-05-31T14:51:39+00:00" }, { "name": "symfony/config", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", "shasum": "" }, "require": { @@ -5158,7 +5157,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.4" + "source": "https://github.com/symfony/config/tree/v6.4.8" }, "funding": [ { @@ -5174,20 +5173,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/console", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -5252,7 +5251,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.4" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -5268,20 +5267,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363" + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", "shasum": "" }, "require": { @@ -5333,7 +5332,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.12" }, "funding": [ { @@ -5349,20 +5348,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -5371,7 +5370,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5400,7 +5399,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -5416,20 +5415,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.5", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "fb868f29461c8a9ffc5c729ac03d08bf49e0139b" + "reference": "b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/fb868f29461c8a9ffc5c729ac03d08bf49e0139b", - "reference": "fb868f29461c8a9ffc5c729ac03d08bf49e0139b", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af", + "reference": "b5c0a0172bbe9b1435181d94ca5cbe4af3fb45af", "shasum": "" }, "require": { @@ -5447,7 +5446,7 @@ "doctrine/orm": "<2.15", "symfony/cache": "<5.4", "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", "symfony/http-foundation": "<6.3", "symfony/http-kernel": "<6.2", "symfony/lock": "<6.3", @@ -5468,7 +5467,7 @@ "symfony/dependency-injection": "^6.2|^7.0", "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.21|^6.2.7|^7.0", + "symfony/form": "^5.4.38|^6.4.6|^7.0.6", "symfony/http-kernel": "^6.3|^7.0", "symfony/lock": "^6.3|^7.0", "symfony/messenger": "^5.4|^6.0|^7.0", @@ -5508,7 +5507,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.12" }, "funding": [ { @@ -5524,20 +5523,20 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-09-08T12:31:10+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0" + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", - "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/815284236cab7d8e1280f53bf562c07a4dfe5954", + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954", "shasum": "" }, "require": { @@ -5582,7 +5581,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.4" + "source": "https://github.com/symfony/dotenv/tree/v6.4.12" }, "funding": [ { @@ -5598,20 +5597,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T17:53:17+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a" + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", "shasum": "" }, "require": { @@ -5657,7 +5656,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.4" + "source": "https://github.com/symfony/error-handler/tree/v6.4.10" }, "funding": [ { @@ -5673,20 +5672,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "shasum": "" }, "require": { @@ -5737,7 +5736,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" }, "funding": [ { @@ -5753,20 +5752,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -5776,7 +5775,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5813,7 +5812,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -5829,20 +5828,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/expression-language", - "version": "v6.4.3", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4" + "reference": "564e109c40d3637053c942a29a58e9434592a8bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", - "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/564e109c40d3637053c942a29a58e9434592a8bf", + "reference": "564e109c40d3637053c942a29a58e9434592a8bf", "shasum": "" }, "require": { @@ -5877,7 +5876,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.3" + "source": "https://github.com/symfony/expression-language/tree/v6.4.11" }, "funding": [ { @@ -5893,20 +5892,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -5914,6 +5913,9 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -5940,7 +5942,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -5956,20 +5958,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", "shasum": "" }, "require": { @@ -6004,7 +6006,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v6.4.11" }, "funding": [ { @@ -6020,26 +6022,29 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/flex", - "version": "v2.4.5", + "version": "v2.4.7", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "b0a405f40614c9f584b489d54f91091817b0e26e" + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/b0a405f40614c9f584b489d54f91091817b0e26e", - "reference": "b0a405f40614c9f584b489d54f91091817b0e26e", + "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", "php": ">=8.0" }, + "conflict": { + "composer/semver": "<1.7.2" + }, "require-dev": { "composer/composer": "^2.1", "symfony/dotenv": "^5.4|^6.0", @@ -6069,7 +6074,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.5" + "source": "https://github.com/symfony/flex/tree/v2.4.7" }, "funding": [ { @@ -6085,20 +6090,20 @@ "type": "tidelift" } ], - "time": "2024-03-02T08:16:47+00:00" + "time": "2024-10-07T08:51:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067" + "reference": "6a9665bd1fae37b198429775c6132f193339434f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c76d3881596860ead95f5444a5ce4414447f0067", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6a9665bd1fae37b198429775c6132f193339434f", + "reference": "6a9665bd1fae37b198429775c6132f193339434f", "shasum": "" }, "require": { @@ -6107,7 +6112,7 @@ "php": ">=8.1", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.12|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.1|^7.0", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", @@ -6217,7 +6222,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.4" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.12" }, "funding": [ { @@ -6233,27 +6238,27 @@ "type": "tidelift" } ], - "time": "2024-02-22T22:50:59+00:00" + "time": "2024-09-20T13:34:56+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.5", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7" + "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/f3c86a60a3615f466333a11fd42010d4382a82c7", - "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7", + "url": "https://api.github.com/repos/symfony/http-client/zipball/fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", + "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3", + "symfony/http-client-contracts": "^3.4.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -6271,7 +6276,7 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -6310,7 +6315,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.5" + "source": "https://github.com/symfony/http-client/tree/v6.4.12" }, "funding": [ { @@ -6326,20 +6331,20 @@ "type": "tidelift" } ], - "time": "2024-03-02T12:45:30+00:00" + "time": "2024-09-20T08:21:33+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "1ee70e699b41909c209a0c930f11034b93578654" + "reference": "20414d96f391677bf80078aa55baece78b82647d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", - "reference": "1ee70e699b41909c209a0c930f11034b93578654", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", "shasum": "" }, "require": { @@ -6348,7 +6353,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6388,7 +6393,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" }, "funding": [ { @@ -6404,20 +6409,20 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" + "reference": "133ac043875f59c26c55e79cf074562127cce4d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2", "shasum": "" }, "require": { @@ -6465,7 +6470,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" }, "funding": [ { @@ -6481,20 +6486,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T15:01:18+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.5", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75" + "reference": "96df83d51b5f78804f70c093b97310794fd6257b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", + "reference": "96df83d51b5f78804f70c093b97310794fd6257b", "shasum": "" }, "require": { @@ -6549,6 +6554,7 @@ "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0|^7.0", "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, @@ -6578,7 +6584,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.5" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" }, "funding": [ { @@ -6594,20 +6600,20 @@ "type": "tidelift" } ], - "time": "2024-03-04T21:00:47+00:00" + "time": "2024-09-21T06:02:57+00:00" }, { "name": "symfony/mime", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", "shasum": "" }, "require": { @@ -6621,16 +6627,17 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -6662,7 +6669,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.3" + "source": "https://github.com/symfony/mime/tree/v6.4.12" }, "funding": [ { @@ -6678,20 +6685,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:32:12+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "db7468152b27242f1a4d10fabe278a2cfaa4eac0" + "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/db7468152b27242f1a4d10fabe278a2cfaa4eac0", - "reference": "db7468152b27242f1a4d10fabe278a2cfaa4eac0", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/0fbee64913b1c595e7650a1919ba3edba8d49ea7", + "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7", "shasum": "" }, "require": { @@ -6741,7 +6748,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.8" }, "funding": [ { @@ -6757,7 +6764,7 @@ "type": "tidelift" } ], - "time": "2024-02-01T11:49:25+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/monolog-bundle", @@ -6842,16 +6849,16 @@ }, { "name": "symfony/options-resolver", - "version": "v6.4.0", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e" + "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22ab9e9101ab18de37839074f8a1197f55590c1b", + "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b", "shasum": "" }, "require": { @@ -6889,7 +6896,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.8" }, "funding": [ { @@ -6905,20 +6912,20 @@ "type": "tidelift" } ], - "time": "2023-08-08T10:16:24+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "114788555e6d768d25fffdbae618cee48cbcd112" + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/114788555e6d768d25fffdbae618cee48cbcd112", - "reference": "114788555e6d768d25fffdbae618cee48cbcd112", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/90ebbe946e5d64a5fad9ac9427e335045cf2bd31", + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31", "shasum": "" }, "require": { @@ -6961,7 +6968,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.4" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.8" }, "funding": [ { @@ -6977,24 +6984,24 @@ "type": "tidelift" } ], - "time": "2024-02-12T11:14:32+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7039,7 +7046,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -7055,26 +7062,25 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -7123,7 +7129,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -7139,24 +7145,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -7204,7 +7210,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -7220,24 +7226,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -7284,7 +7290,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -7300,7 +7306,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php56", @@ -7372,20 +7378,20 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7432,7 +7438,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -7448,24 +7454,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7508,7 +7514,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -7524,25 +7530,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7585,7 +7590,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -7601,24 +7606,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -7664,7 +7669,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -7680,20 +7685,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -7725,7 +7730,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -7741,20 +7746,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.4", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "c0664db266024013e31446dd690b6bfcf218ad93" + "reference": "866f6cd84f2094cbc6f66ce9752faf749916e2a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/c0664db266024013e31446dd690b6bfcf218ad93", - "reference": "c0664db266024013e31446dd690b6bfcf218ad93", + "url": "https://api.github.com/repos/symfony/property-access/zipball/866f6cd84f2094cbc6f66ce9752faf749916e2a9", + "reference": "866f6cd84f2094cbc6f66ce9752faf749916e2a9", "shasum": "" }, "require": { @@ -7802,7 +7807,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.4" + "source": "https://github.com/symfony/property-access/tree/v6.4.11" }, "funding": [ { @@ -7818,20 +7823,20 @@ "type": "tidelift" } ], - "time": "2024-02-16T13:31:43+00:00" + "time": "2024-08-30T16:10:11+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.3", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26" + "reference": "edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/e96d740ab5ac39aa530c8eaa0720ea8169118e26", - "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "url": "https://api.github.com/repos/symfony/property-info/zipball/edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77", + "reference": "edaea9dcc723cb4a0ab6a00f7d6f8c07c0d8ff77", "shasum": "" }, "require": { @@ -7885,7 +7890,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.3" + "source": "https://github.com/symfony/property-info/tree/v6.4.10" }, "funding": [ { @@ -7901,20 +7906,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-07-26T07:32:07+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "c3f1b7d8f0b567eb960c540567f24219cb759e0a" + "reference": "b8119e0b248ef0711c25cd09acc729102122621c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/c3f1b7d8f0b567eb960c540567f24219cb759e0a", - "reference": "c3f1b7d8f0b567eb960c540567f24219cb759e0a", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/b8119e0b248ef0711c25cd09acc729102122621c", + "reference": "b8119e0b248ef0711c25cd09acc729102122621c", "shasum": "" }, "require": { @@ -7952,7 +7957,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.3" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.8" }, "funding": [ { @@ -7968,20 +7973,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/routing", - "version": "v6.4.5", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", + "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", "shasum": "" }, "require": { @@ -8035,7 +8040,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.5" + "source": "https://github.com/symfony/routing/tree/v6.4.12" }, "funding": [ { @@ -8051,20 +8056,20 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/runtime", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "5682281d26366cd3bf0648cec69de0e62cca7fa0" + "reference": "bfe32a1adf41da4dd7f6b939a039779d7af5497f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/5682281d26366cd3bf0648cec69de0e62cca7fa0", - "reference": "5682281d26366cd3bf0648cec69de0e62cca7fa0", + "url": "https://api.github.com/repos/symfony/runtime/zipball/bfe32a1adf41da4dd7f6b939a039779d7af5497f", + "reference": "bfe32a1adf41da4dd7f6b939a039779d7af5497f", "shasum": "" }, "require": { @@ -8114,7 +8119,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.4.3" + "source": "https://github.com/symfony/runtime/tree/v6.4.12" }, "funding": [ { @@ -8130,20 +8135,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-09-19T13:29:10+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.4.5", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "b7825ec970f51fcc4982397856405728544df9ce" + "reference": "620be16fceded671823ce6332d06f44bb327096d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/b7825ec970f51fcc4982397856405728544df9ce", - "reference": "b7825ec970f51fcc4982397856405728544df9ce", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/620be16fceded671823ce6332d06f44bb327096d", + "reference": "620be16fceded671823ce6332d06f44bb327096d", "shasum": "" }, "require": { @@ -8152,7 +8157,7 @@ "php": ">=8.1", "symfony/clock": "^6.3|^7.0", "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", "symfony/http-foundation": "^6.2|^7.0", @@ -8226,7 +8231,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.5" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.11" }, "funding": [ { @@ -8242,20 +8247,20 @@ "type": "tidelift" } ], - "time": "2024-03-02T12:45:30+00:00" + "time": "2024-08-20T11:22:16+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "bb10f630cf5b1819ff80aa3ad57a09c61268fc48" + "reference": "8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/bb10f630cf5b1819ff80aa3ad57a09c61268fc48", - "reference": "bb10f630cf5b1819ff80aa3ad57a09c61268fc48", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f", + "reference": "8c7e52155262b3ef6b7885f6d9bd90fb24eaa66f", "shasum": "" }, "require": { @@ -8312,7 +8317,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.3" + "source": "https://github.com/symfony/security-core/tree/v6.4.12" }, "funding": [ { @@ -8328,20 +8333,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-09-20T08:21:33+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "e10257dd26f965d75e96bbfc27e46efd943f3010" + "reference": "f46ab02b76311087873257071559edcaf6d7ab99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/e10257dd26f965d75e96bbfc27e46efd943f3010", - "reference": "e10257dd26f965d75e96bbfc27e46efd943f3010", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/f46ab02b76311087873257071559edcaf6d7ab99", + "reference": "f46ab02b76311087873257071559edcaf6d7ab99", "shasum": "" }, "require": { @@ -8380,7 +8385,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.3" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.8" }, "funding": [ { @@ -8396,20 +8401,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/security-http", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "bf7548976c19ce751c95a3d012d0dcd27409e506" + "reference": "f6df97af71943cda726dc852335204eac02a716b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/bf7548976c19ce751c95a3d012d0dcd27409e506", - "reference": "bf7548976c19ce751c95a3d012d0dcd27409e506", + "url": "https://api.github.com/repos/symfony/security-http/zipball/f6df97af71943cda726dc852335204eac02a716b", + "reference": "f6df97af71943cda726dc852335204eac02a716b", "shasum": "" }, "require": { @@ -8468,7 +8473,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.4" + "source": "https://github.com/symfony/security-http/tree/v6.4.12" }, "funding": [ { @@ -8484,20 +8489,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "88da7f8fe03c5f4c2a69da907f1de03fab2e6872" + "reference": "10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/88da7f8fe03c5f4c2a69da907f1de03fab2e6872", - "reference": "88da7f8fe03c5f4c2a69da907f1de03fab2e6872", + "url": "https://api.github.com/repos/symfony/serializer/zipball/10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c", + "reference": "10ae9c1b90f4809ccb7277cc8fe8d80b3af4412c", "shasum": "" }, "require": { @@ -8566,7 +8571,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.4" + "source": "https://github.com/symfony/serializer/tree/v6.4.12" }, "funding": [ { @@ -8582,25 +8587,26 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -8608,7 +8614,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8648,7 +8654,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -8664,20 +8670,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + "reference": "63e069eb616049632cde9674c46957819454b8aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", + "reference": "63e069eb616049632cde9674c46957819454b8aa", "shasum": "" }, "require": { @@ -8710,7 +8716,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" }, "funding": [ { @@ -8726,20 +8732,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:35:58+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/string", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -8796,7 +8802,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.4" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -8812,20 +8818,20 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:16:41+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -8834,7 +8840,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -8874,7 +8880,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -8890,20 +8896,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "256f330026d1c97187b61aa5c29e529499877f13" + "reference": "09c0df13f822a1b80c5972ca1aa9eeb1288e1194" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/256f330026d1c97187b61aa5c29e529499877f13", - "reference": "256f330026d1c97187b61aa5c29e529499877f13", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/09c0df13f822a1b80c5972ca1aa9eeb1288e1194", + "reference": "09c0df13f822a1b80c5972ca1aa9eeb1288e1194", "shasum": "" }, "require": { @@ -8983,7 +8989,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.12" }, "funding": [ { @@ -8999,20 +9005,20 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:26:02+00:00" + "time": "2024-09-15T06:35:36+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "f60ba43a09d88395d05797af982588b57331ff4d" + "reference": "4e63369647e3924e110b37337c6a58aac3086ad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/f60ba43a09d88395d05797af982588b57331ff4d", - "reference": "f60ba43a09d88395d05797af982588b57331ff4d", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/4e63369647e3924e110b37337c6a58aac3086ad4", + "reference": "4e63369647e3924e110b37337c6a58aac3086ad4", "shasum": "" }, "require": { @@ -9067,7 +9073,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.4.4" + "source": "https://github.com/symfony/twig-bundle/tree/v6.4.12" }, "funding": [ { @@ -9083,20 +9089,20 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:23:52+00:00" + "time": "2024-09-08T12:30:05+00:00" }, { "name": "symfony/uid", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", "shasum": "" }, "require": { @@ -9141,7 +9147,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.3" + "source": "https://github.com/symfony/uid/tree/v6.4.12" }, "funding": [ { @@ -9157,20 +9163,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/validator", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47" + "reference": "6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/1cf92edc9a94d16275efef949fa6748d11cc8f47", - "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47", + "url": "https://api.github.com/repos/symfony/validator/zipball/6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0", + "reference": "6da1f0a1ee73d060a411d832cbe0539cfe9bbaa0", "shasum": "" }, "require": { @@ -9217,7 +9223,8 @@ "Symfony\\Component\\Validator\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9237,7 +9244,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.4" + "source": "https://github.com/symfony/validator/tree/v6.4.12" }, "funding": [ { @@ -9253,20 +9260,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.4", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1" + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", "shasum": "" }, "require": { @@ -9322,7 +9329,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" }, "funding": [ { @@ -9338,20 +9345,20 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:23:52+00:00" + "time": "2024-08-30T16:03:21+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "shasum": "" }, "require": { @@ -9359,6 +9366,8 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", @@ -9397,7 +9406,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" }, "funding": [ { @@ -9413,20 +9422,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T08:37:45+00:00" + "time": "2024-06-24T15:53:56+00:00" }, { "name": "symfony/web-link", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "1722ee157388aaf2f312954addf5b9665e4b7ee9" + "reference": "304c67cefe7128ea3957e9bb1ac6ce08a90a635b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/1722ee157388aaf2f312954addf5b9665e4b7ee9", - "reference": "1722ee157388aaf2f312954addf5b9665e4b7ee9", + "url": "https://api.github.com/repos/symfony/web-link/zipball/304c67cefe7128ea3957e9bb1ac6ce08a90a635b", + "reference": "304c67cefe7128ea3957e9bb1ac6ce08a90a635b", "shasum": "" }, "require": { @@ -9480,7 +9489,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v6.4.3" + "source": "https://github.com/symfony/web-link/tree/v6.4.8" }, "funding": [ { @@ -9496,20 +9505,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.3", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971", "shasum": "" }, "require": { @@ -9552,7 +9561,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.3" + "source": "https://github.com/symfony/yaml/tree/v6.4.12" }, "funding": [ { @@ -9568,34 +9577,41 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -9628,7 +9644,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" }, "funding": [ { @@ -9640,7 +9656,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-09-09T17:55:12+00:00" }, { "name": "vich/uploader-bundle", @@ -10924,16 +10940,16 @@ }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -10941,7 +10957,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -10985,9 +11001,9 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "myclabs/deep-copy", @@ -11196,25 +11212,25 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -11246,9 +11262,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-09-29T15:01:53+00:00" }, { "name": "phar-io/manifest", @@ -12936,16 +12952,16 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "495ffa2e6d17e199213f93768efa01af32bbf70e" + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/495ffa2e6d17e199213f93768efa01af32bbf70e", - "reference": "495ffa2e6d17e199213f93768efa01af32bbf70e", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", + "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", "shasum": "" }, "require": { @@ -12984,7 +13000,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.3" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.8" }, "funding": [ { @@ -13000,20 +13016,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229" + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee0f7ed5cf298cc019431bb3b3977ebc52b86229", - "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", "shasum": "" }, "require": { @@ -13049,7 +13065,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.3" + "source": "https://github.com/symfony/css-selector/tree/v6.4.8" }, "funding": [ { @@ -13065,20 +13081,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "425c7760a4e6fdc6cb643c791d32277037c971df" + "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/425c7760a4e6fdc6cb643c791d32277037c971df", - "reference": "425c7760a4e6fdc6cb643c791d32277037c971df", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/689f1bcb0bd3b945e3c671cbd06274b127c64dc9", + "reference": "689f1bcb0bd3b945e3c671cbd06274b127c64dc9", "shasum": "" }, "require": { @@ -13123,7 +13139,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.4.3" + "source": "https://github.com/symfony/debug-bundle/tree/v6.4.8" }, "funding": [ { @@ -13139,20 +13155,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.4", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531" + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", - "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9d307ecbcb917001692be333cdc58f474fdb37f0", + "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0", "shasum": "" }, "require": { @@ -13190,7 +13206,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.4" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.12" }, "funding": [ { @@ -13206,20 +13222,20 @@ "type": "tidelift" } ], - "time": "2024-02-07T09:17:57+00:00" + "time": "2024-09-15T06:35:36+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.56.0", + "version": "v1.61.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "bbb7949ae048363df7c8439abeddef8befd155ce" + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bbb7949ae048363df7c8439abeddef8befd155ce", - "reference": "bbb7949ae048363df7c8439abeddef8befd155ce", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", "shasum": "" }, "require": { @@ -13282,7 +13298,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.56.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" }, "funding": [ { @@ -13298,20 +13314,20 @@ "type": "tidelift" } ], - "time": "2024-03-04T13:36:45+00:00" + "time": "2024-08-29T22:50:23+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.4", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222" + "reference": "168f412dcd6caf3813a9cc0f286cd68f6a76f070" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/16ed5bdfd18e14fc7de347c8688e8ac479284222", - "reference": "16ed5bdfd18e14fc7de347c8688e8ac479284222", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/168f412dcd6caf3813a9cc0f286cd68f6a76f070", + "reference": "168f412dcd6caf3813a9cc0f286cd68f6a76f070", "shasum": "" }, "require": { @@ -13343,7 +13359,8 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -13363,7 +13380,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.11" }, "funding": [ { @@ -13379,20 +13396,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T14:08:19+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.4", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "a69d7124bfb2e15638ba0a1be94f0845d8d05ee4" + "reference": "ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/a69d7124bfb2e15638ba0a1be94f0845d8d05ee4", - "reference": "a69d7124bfb2e15638ba0a1be94f0845d8d05ee4", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3", + "reference": "ef4b8b4f9f51260d18abec40ceacc4bc9c5555e3", "shasum": "" }, "require": { @@ -13445,7 +13462,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.4" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.11" }, "funding": [ { @@ -13461,7 +13478,7 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "theofidry/alice-data-fixtures", From da4e13e2e8a896531bdd3670b9ebd59399cb2018 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 8 Oct 2024 13:25:31 +0200 Subject: [PATCH 20/36] 2314: avoid deleting all groups and readding --- src/State/ScreenProcessor.php | 39 ++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index f5acb834..64cec45b 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -11,6 +11,7 @@ use App\Entity\Tenant\Playlist; use App\Entity\Tenant\PlaylistScreenRegion; use App\Entity\Tenant\Screen; +use App\Entity\Tenant\ScreenGroup; use App\Repository\PlaylistRepository; use App\Repository\PlaylistScreenRegionRepository; use App\Repository\ScreenGroupRepository; @@ -125,16 +126,48 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari } } + // Maps ids of existing groups if (isset($object->groups) && isset($screen)) { - $screen->removeAllScreenGroup(); - - foreach ($object->groups as $group) { + $existingGroups = array_map(function ($group) { + if (!is_null($group)) { + return $group->getId(); + } + }, iterator_to_array($screen->getScreenGroups())); + + // Ids of groups inputted + $newGroupsId = array_map( + /** + * @param string $group + * + * @return Ulid + */ + fn ($group): Ulid => Ulid::fromString($group), $object->groups); + + // This diff finds the groups to be saved + $newGroups = array_diff($newGroupsId, $existingGroups); + // ... and saves them. + foreach ($newGroups as $group) { $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); + if (is_null($groupToSave)) { throw new InvalidArgumentException('Unknown group resource'); } + $screen->addScreenGroup($groupToSave); } + + // This diff finds the groups to be deleted + $deleteGroups = array_diff($existingGroups, $newGroupsId); + // ... and deletes them. + foreach ($deleteGroups as $group) { + $groupToDelete = $this->groupRepository->findOneBy(['id' => $group]); + + if (is_null($groupToDelete)) { + throw new InvalidArgumentException('Unknown group resource'); + } + + $screen->removeScreenGroup($groupToDelete); + } } if (!empty($object->layout)) { From a1f35fe53c0f88dde04d5d357b60a25dfaf18897 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 8 Oct 2024 13:30:01 +0200 Subject: [PATCH 21/36] 2314: coding standards apply --- src/State/ScreenProcessor.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 64cec45b..026bdf62 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -11,7 +11,6 @@ use App\Entity\Tenant\Playlist; use App\Entity\Tenant\PlaylistScreenRegion; use App\Entity\Tenant\Screen; -use App\Entity\Tenant\ScreenGroup; use App\Repository\PlaylistRepository; use App\Repository\PlaylistScreenRegionRepository; use App\Repository\ScreenGroupRepository; From 10d13080cd60318d55c5d8126e6fea91a9fc77fb Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 10:49:51 +0200 Subject: [PATCH 22/36] 2314: test with todo --- README.md | 3 ++- tests/Api/ScreensTest.php | 30 ++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 46eb989a..bb8ccfc3 100644 --- a/README.md +++ b/README.md @@ -297,7 +297,8 @@ docker run --rm -v .:/app --workdir=/app node:18 npm run coding-standards-apply Run automated tests: ```shell -docker compose exec phpfpm composer tests +docker compose exec phpfpm composer test setup +docker compose exec phpfpm composer test ``` Disable or hide deprecation warnings using the [`SYMFONY_DEPRECATIONS_HELPER` environment diff --git a/tests/Api/ScreensTest.php b/tests/Api/ScreensTest.php index 59ec242d..6a98d2d4 100644 --- a/tests/Api/ScreensTest.php +++ b/tests/Api/ScreensTest.php @@ -5,7 +5,10 @@ namespace App\Tests\Api; use App\Entity\ScreenLayout; +use App\Entity\ScreenLayoutRegions; +use App\Entity\Tenant\Playlist; use App\Entity\Tenant\Screen; +use App\Entity\Tenant\ScreenGroup; use App\Tests\AbstractBaseApiTestCase; class ScreensTest extends AbstractBaseApiTestCase @@ -67,11 +70,29 @@ public function testGetItem(): void ]); } + /** + * A basic test example. + * + * @group test + * + * @return void + */ public function testCreateScreen(): void { $client = $this->getAuthenticatedClient('ROLE_ADMIN'); - $layoutIri = $this->findIriBy(ScreenLayout::class, []); + $layoutIri = $this->findIriBy(ScreenLayout::class, ['title' => '2 boxes']); + $regionIriLeft = $this->findIriBy(ScreenLayoutRegions::class, ['title' => 'Left']); + $regionIriRight = $this->findIriBy(ScreenLayoutRegions::class, ['title' => 'Right']); + $screenGroupOneIri = $this->findIriBy(ScreenGroup::class, ['title' => 'screen_group_abc_1']); + $screenGroupTwoIri = $this->findIriBy(ScreenGroup::class, ['title' => 'screen_group_abc_2']); + $playlistIri = $this->findIriBy(Playlist::class, ['title' => 'playlist_abc_3']); + + $regionUlidLeft = $this->iriHelperUtils->getUlidFromIRI($regionIriLeft); + $regionUlidRight = $this->iriHelperUtils->getUlidFromIRI($regionIriRight); + $screenGroupOneUlid = $this->iriHelperUtils->getUlidFromIRI($screenGroupOneIri); + $screenGroupTwoUlid = $this->iriHelperUtils->getUlidFromIRI($screenGroupTwoIri); + $playlistUlid = $this->iriHelperUtils->getUlidFromIRI($playlistIri); $response = $client->request('POST', '/v2/screens', [ 'json' => [ @@ -82,12 +103,14 @@ public function testCreateScreen(): void 'location' => 'M2.42', 'resolution' => '4K', 'orientation' => 'vertical', + 'groups' => [$screenGroupOneUlid, $screenGroupTwoUlid], + 'enableColorSchemeChange' => true, + 'regions' => [['playlists' => [['id' => $playlistUlid, 'weight' => 0]], 'regionId' => $regionUlidLeft], ['playlists' => [['id' => $playlistUlid, 'weight' => 0]], 'regionId' => $regionUlidRight]], ], 'headers' => [ 'Content-Type' => 'application/ld+json', ], ]); - $this->assertResponseStatusCodeSame(201); $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); $this->assertJsonContains([ @@ -118,6 +141,9 @@ public function testCreateScreen(): void 'location' => 'M2.42', 'resolution' => '4K', 'orientation' => 'vertical', + 'inScreenGroups' => '/v2/screens/todo/screen-groups', + 'enableColorSchemeChange' => true, + 'regions' => ['/v2/screens/todo/regions/'.$regionUlidLeft.'/playlists', '/v2/screens/todo/regions/'.$regionUlidLeft.'/playlists'], ]); $this->assertMatchesRegularExpression('@^/v\d/\w+/([A-Za-z0-9]{26})$@', $response->toArray()['@id']); From 2cfe1d3df3c38fb76d28e21780c18eb7b220488f Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 10:57:23 +0200 Subject: [PATCH 23/36] 2314: replace todo with screen id --- tests/Api/ScreensTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Api/ScreensTest.php b/tests/Api/ScreensTest.php index 6a98d2d4..31946ef0 100644 --- a/tests/Api/ScreensTest.php +++ b/tests/Api/ScreensTest.php @@ -113,6 +113,7 @@ public function testCreateScreen(): void ]); $this->assertResponseStatusCodeSame(201); $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); + $this->assertJsonContains([ '@context' => [ '@vocab' => 'http://localhost/docs.jsonld#', @@ -141,9 +142,9 @@ public function testCreateScreen(): void 'location' => 'M2.42', 'resolution' => '4K', 'orientation' => 'vertical', - 'inScreenGroups' => '/v2/screens/todo/screen-groups', + 'inScreenGroups' => '/v2/screens/'.$response->toArray()['id'].'/screen-groups', 'enableColorSchemeChange' => true, - 'regions' => ['/v2/screens/todo/regions/'.$regionUlidLeft.'/playlists', '/v2/screens/todo/regions/'.$regionUlidLeft.'/playlists'], + 'regions' => ['/v2/screens/'.$response->toArray()['id'].'/regions/'.$regionUlidLeft.'/playlists', '/v2/screens/'.$response->toArray()['id'].'/regions/'.$regionUlidRight.'/playlists'], ]); $this->assertMatchesRegularExpression('@^/v\d/\w+/([A-Za-z0-9]{26})$@', $response->toArray()['@id']); From 2ee824c63550f6bafd63efd69bf583a14d6437cb Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 11:04:14 +0200 Subject: [PATCH 24/36] 2314: changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a5ead65..4e774cd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ All notable changes to this project will be documented in this file. - Add a function that deletes all playlists for a screen in a specific region (`PlaylistScreenRegionRepository.php`) - Save groups in `ScreenProcessor.php` - Update psalm baseline + - Add regions/playlists and groups to POST screen test + - `composer update symfony/* --with-dependencies` - [#193](https://github.com/os2display/display-api-service/pull/193) - Adds support for interactive slides. From 863cc43e05ef5dcc3bc3a83b50744025fbba334d Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 11:11:06 +0200 Subject: [PATCH 25/36] 2314: update changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e774cd7..92692eb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ All notable changes to this project will be documented in this file. - Updated endSessionUrl to be nullable. - [#213](https://github.com/os2display/display-api-service/pull/213) - - Add regionsAndPlaylists and groups to `ScreenInput.php` - - Add adding playlist/regions in `ScreenProcessor.php` (as an alternative to sending multiple requests) - - Add a function that deletes all playlists for a screen in a specific region (`PlaylistScreenRegionRepository.php`) + - Add regions and groups to `ScreenInput.php` + - Add "cascade: persist remove" to PlaylistScreenRegion + - Save playlist/regions in `ScreenProcessor.php` (as an alternative to sending multiple requests) - Save groups in `ScreenProcessor.php` - Update psalm baseline - Add regions/playlists and groups to POST screen test From cb6970c2430e696af0c41659f5b3854c4bb08bce Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 11:28:18 +0200 Subject: [PATCH 26/36] 2314: remove annotation used locally --- tests/Api/ScreensTest.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/Api/ScreensTest.php b/tests/Api/ScreensTest.php index 31946ef0..19c3e9e4 100644 --- a/tests/Api/ScreensTest.php +++ b/tests/Api/ScreensTest.php @@ -70,13 +70,6 @@ public function testGetItem(): void ]); } - /** - * A basic test example. - * - * @group test - * - * @return void - */ public function testCreateScreen(): void { $client = $this->getAuthenticatedClient('ROLE_ADMIN'); From 9c327c12874665075a50620e6b4c43055bce3c5a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 9 Oct 2024 13:18:21 +0200 Subject: [PATCH 27/36] 2314: fixes from comment on pr --- src/State/ScreenProcessor.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 026bdf62..0018f1b1 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -65,7 +65,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari throw new InvalidArgumentException('Unknown region resource'); } - $newPlaylists = array_map( + $newPlaylistULIDs = array_map( /** * @param array $playlistObject * @@ -78,7 +78,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari 'region' => $regionAndPlaylists['regionId'], ]); - $existingPlaylists = array_map(function ($playlistObject) { + $existingPlaylistsULIDs = array_map(function ($playlistObject) { $playlist = $playlistObject->getPlaylist(); if (!is_null($playlist)) { return $playlist->getId(); @@ -86,7 +86,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari }, $playlistScreens); // This diff finds the playlists to be deleted - $deletePlaylists = array_diff($existingPlaylists, $newPlaylists); + $deletePlaylists = array_diff($existingPlaylistsULIDs, $newPlaylistULIDs); // ... and deletes them. foreach ($deletePlaylists as $deletePlaylist) { @@ -98,10 +98,10 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari } // This diff finds the playlists to be saved - $newPlaylists = array_diff($newPlaylists, $existingPlaylists); + $newPlaylistULIDs = array_diff($newPlaylistULIDs, $existingPlaylistsULIDs); // ... and saves them. - foreach ($newPlaylists as $newPlaylist) { + foreach ($newPlaylistULIDs as $newPlaylist) { $playlistAndRegionToSave = new PlaylistScreenRegion(); $playlist = $this->playlistRepository->findOneBy(['id' => $newPlaylist]); @@ -109,6 +109,8 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari throw new InvalidArgumentException('Unknown playlist resource'); } + // Filter the array containing all the new playlists, to find the weight of the playlist currently + // set for save $playlistWeight = array_filter($regionAndPlaylists['playlists'], /** * @param array $playlistAndWeight @@ -119,7 +121,11 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $playlistAndRegionToSave->setPlaylist($playlist); $playlistAndRegionToSave->setRegion($region); - $playlistAndRegionToSave->setWeight($playlistWeight[0]['weight']); + if (count($playlistWeight) > 0 && isset($playlistWeight[0]['weight'])) { + $playlistAndRegionToSave->setWeight($playlistWeight[0]['weight']); + } else { + $playlistAndRegionToSave->setWeight(0); + } $screen->addPlaylistScreenRegion($playlistAndRegionToSave); } } From 5c6ccf286049da344fe82ab27ae626ce245f19b5 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Thu, 10 Oct 2024 14:13:43 +0200 Subject: [PATCH 28/36] 2314: add handling of changed weight --- src/State/ScreenProcessor.php | 42 +++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 0018f1b1..bbdc2f2e 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -86,10 +86,10 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari }, $playlistScreens); // This diff finds the playlists to be deleted - $deletePlaylists = array_diff($existingPlaylistsULIDs, $newPlaylistULIDs); + $deletePlaylistsULIDs = array_diff($existingPlaylistsULIDs, $newPlaylistULIDs); // ... and deletes them. - foreach ($deletePlaylists as $deletePlaylist) { + foreach ($deletePlaylistsULIDs as $deletePlaylist) { $regionId = $region->getId(); $screenId = $screen->getId(); if (!is_null($screenId) && !is_null($regionId) && !is_null($deletePlaylist)) { @@ -128,6 +128,44 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari } $screen->addPlaylistScreenRegion($playlistAndRegionToSave); } + + $uneditedPlaylists = array_diff(array_diff($existingPlaylistsULIDs, $deletePlaylistsULIDs), $newPlaylistULIDs); + + foreach ($existingPlaylistsULIDs as $existingPlaylist) { + $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $regionAndPlaylists['regionId']]); + + if (is_null($region)) { + throw new InvalidArgumentException('Unknown region resource'); + } + + $playlist = $this->playlistRepository->findOneBy(['id' => $existingPlaylist]); + + if (is_null($playlist)) { + throw new InvalidArgumentException('Unknown playlist resource'); + } + + $psr = $this->playlistScreenRegionRepository->findOneBy([ + 'screen' => $screen->getId(), + 'region' => $region, + 'playlist' => $playlist, + ]); + + // Filter the array containing all the new playlists, to find the weight of the playlist currently + // set for save + $playlistWeight = array_filter($regionAndPlaylists['playlists'], + /** + * @param array $playlistAndWeight + * + * @return bool + */ + fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $existingPlaylist); + + if (count($playlistWeight) > 0) { + $psr->setWeight(reset($playlistWeight)['weight']); + } else { + $psr->setWeight(0); + } + } } } From c98d07ad5fb1266dbfa07201e81267313d6b4f9a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 16 Oct 2024 10:59:51 +0200 Subject: [PATCH 29/36] 2314: comment on pr, move function to entity instead of processor --- CHANGELOG.md | 4 +- src/Entity/ScreenLayoutRegions.php | 14 ++- src/Entity/Tenant/Screen.php | 12 +++ src/State/ScreenProcessor.php | 153 ++++++----------------------- 4 files changed, 55 insertions(+), 128 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92692eb9..0fa3f483 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ All notable changes to this project will be documented in this file. - [#213](https://github.com/os2display/display-api-service/pull/213) - Add regions and groups to `ScreenInput.php` - Add "cascade: persist remove" to PlaylistScreenRegion - - Save playlist/regions in `ScreenProcessor.php` (as an alternative to sending multiple requests) - - Save groups in `ScreenProcessor.php` + - Save playlist/regions in `ScreenProcessor.php` and in `src/entity/ScreenLayoutRegions` (as an alternative to sending multiple requests) + - Save groups in `ScreenProcessor.php` and in `src/entity/tenant/Screen.php` - Update psalm baseline - Add regions/playlists and groups to POST screen test - `composer update symfony/* --with-dependencies` diff --git a/src/Entity/ScreenLayoutRegions.php b/src/Entity/ScreenLayoutRegions.php index 475505e0..ec8e00e9 100644 --- a/src/Entity/ScreenLayoutRegions.php +++ b/src/Entity/ScreenLayoutRegions.php @@ -41,7 +41,7 @@ class ScreenLayoutRegions extends AbstractBaseEntity implements MultiTenantInter /** * @var \Doctrine\Common\Collections\Collection|\App\Entity\Tenant\PlaylistScreenRegion[] */ - #[ORM\OneToMany(targetEntity: PlaylistScreenRegion::class, mappedBy: 'region', orphanRemoval: true)] + #[ORM\OneToMany(targetEntity: PlaylistScreenRegion::class, cascade: ['persist', 'remove'], mappedBy: 'region', orphanRemoval: true)] private Collection $playlistScreenRegions; public function __construct() @@ -82,6 +82,18 @@ public function getPlaylistScreenRegions(): Collection return $this->playlistScreenRegions; } + public function setPlaylistScreenRegions(Collection $playlistScreenRegions): void + { + foreach ($this->playlistScreenRegions as $playlistScreenRegion) { + if (false === $playlistScreenRegions->contains($playlistScreenRegion)) { + $this->removePlaylistScreenRegion($playlistScreenRegion); + } + } + foreach ($playlistScreenRegions as $playlistScreenRegion) { + $this->addPlaylistScreenRegion($playlistScreenRegion); + } + } + public function addPlaylistScreenRegion(PlaylistScreenRegion $playlistScreenRegion): self { if (!$this->playlistScreenRegions->contains($playlistScreenRegion)) { diff --git a/src/Entity/Tenant/Screen.php b/src/Entity/Tenant/Screen.php index 60807632..74b57a49 100644 --- a/src/Entity/Tenant/Screen.php +++ b/src/Entity/Tenant/Screen.php @@ -173,6 +173,18 @@ public function removeAllPlaylistScreenRegions(): self return $this; } + public function setScreenGroups(Collection $screenGroups): void + { + foreach ($this->screenGroups as $screenGroup) { + if (false === $screenGroups->contains($screenGroup)) { + $this->removeScreenGroup($screenGroup); + } + } + foreach ($screenGroups as $screenGroup) { + $this->addScreenGroup($screenGroup); + } + } + /** * @return Collection */ diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index bbdc2f2e..3752003b 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -17,8 +17,8 @@ use App\Repository\ScreenLayoutRegionsRepository; use App\Repository\ScreenLayoutRepository; use App\Utils\IriHelperUtils; +use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\EntityManagerInterface; -use Symfony\Component\Uid\Ulid; class ScreenProcessor extends AbstractProcessor { @@ -59,158 +59,61 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari // Adding relations for playlist/screen/region if (isset($object->regions) && isset($screen)) { foreach ($object->regions as $regionAndPlaylists) { + // Relevant region $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $regionAndPlaylists['regionId']]); if (is_null($region)) { throw new InvalidArgumentException('Unknown region resource'); } - $newPlaylistULIDs = array_map( - /** - * @param array $playlistObject - * - * @return Ulid - */ - fn ($playlistObject): Ulid => Ulid::fromString($playlistObject['id']), $regionAndPlaylists['playlists']); - - $playlistScreens = $this->playlistScreenRegionRepository->findBy([ - 'screen' => $screen->getId(), - 'region' => $regionAndPlaylists['regionId'], - ]); - - $existingPlaylistsULIDs = array_map(function ($playlistObject) { - $playlist = $playlistObject->getPlaylist(); - if (!is_null($playlist)) { - return $playlist->getId(); - } - }, $playlistScreens); - - // This diff finds the playlists to be deleted - $deletePlaylistsULIDs = array_diff($existingPlaylistsULIDs, $newPlaylistULIDs); + // Collection to be saved. + $playlistScreenRegionCollection = new ArrayCollection(); - // ... and deletes them. - foreach ($deletePlaylistsULIDs as $deletePlaylist) { - $regionId = $region->getId(); - $screenId = $screen->getId(); - if (!is_null($screenId) && !is_null($regionId) && !is_null($deletePlaylist)) { - $this->playlistScreenRegionRepository->deleteRelations($screenId, $regionId, $deletePlaylist); - } - } - - // This diff finds the playlists to be saved - $newPlaylistULIDs = array_diff($newPlaylistULIDs, $existingPlaylistsULIDs); - - // ... and saves them. - foreach ($newPlaylistULIDs as $newPlaylist) { - $playlistAndRegionToSave = new PlaylistScreenRegion(); - $playlist = $this->playlistRepository->findOneBy(['id' => $newPlaylist]); + // Looping through playlists connected to region + foreach ($regionAndPlaylists['playlists'] as $inputPlaylist) { + // Checking if playlists exists + $playlist = $this->playlistRepository->findOneBy(['id' => $inputPlaylist['id']]); if (is_null($playlist)) { throw new InvalidArgumentException('Unknown playlist resource'); } - // Filter the array containing all the new playlists, to find the weight of the playlist currently - // set for save - $playlistWeight = array_filter($regionAndPlaylists['playlists'], - /** - * @param array $playlistAndWeight - * - * @return bool - */ - fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $playlist->getId()); - - $playlistAndRegionToSave->setPlaylist($playlist); - $playlistAndRegionToSave->setRegion($region); - if (count($playlistWeight) > 0 && isset($playlistWeight[0]['weight'])) { - $playlistAndRegionToSave->setWeight($playlistWeight[0]['weight']); - } else { - $playlistAndRegionToSave->setWeight(0); - } - $screen->addPlaylistScreenRegion($playlistAndRegionToSave); - } - - $uneditedPlaylists = array_diff(array_diff($existingPlaylistsULIDs, $deletePlaylistsULIDs), $newPlaylistULIDs); - - foreach ($existingPlaylistsULIDs as $existingPlaylist) { - $region = $this->screenLayoutRegionsRepository->findOneBy(['id' => $regionAndPlaylists['regionId']]); - - if (is_null($region)) { - throw new InvalidArgumentException('Unknown region resource'); - } - - $playlist = $this->playlistRepository->findOneBy(['id' => $existingPlaylist]); - - if (is_null($playlist)) { - throw new InvalidArgumentException('Unknown playlist resource'); - } - - $psr = $this->playlistScreenRegionRepository->findOneBy([ - 'screen' => $screen->getId(), + // See if relation already exists + $existingPlaylistScreenRegion = $this->playlistScreenRegionRepository->findOneBy([ + 'screen' => $screen, 'region' => $region, 'playlist' => $playlist, ]); - // Filter the array containing all the new playlists, to find the weight of the playlist currently - // set for save - $playlistWeight = array_filter($regionAndPlaylists['playlists'], - /** - * @param array $playlistAndWeight - * - * @return bool - */ - fn ($playlistAndWeight) => Ulid::fromString($playlistAndWeight['id']) == $existingPlaylist); - - if (count($playlistWeight) > 0) { - $psr->setWeight(reset($playlistWeight)['weight']); + if (is_null($existingPlaylistScreenRegion)) { + // If relation does not exist, create new PlaylistScreenRegion + $newPlaylistScreenRegionRelation = new PlaylistScreenRegion(); + $newPlaylistScreenRegionRelation->setPlaylist($playlist); + $newPlaylistScreenRegionRelation->setRegion($region); + $newPlaylistScreenRegionRelation->setScreen($screen); + $newPlaylistScreenRegionRelation->setWeight($inputPlaylist['weight'] ?? 0); + $playlistScreenRegionCollection->add($playlistAndRegionToSave); } else { - $psr->setWeight(0); + // Update weight, add existing relation + $existingPlaylistScreenRegion->setWeight($inputPlaylist['weight'] ?? 0); + $playlistScreenRegionCollection->add($existingPlaylistScreenRegion); } } + $region->setPlaylistScreenRegions($playlistScreenRegionCollection); } } // Maps ids of existing groups if (isset($object->groups) && isset($screen)) { - $existingGroups = array_map(function ($group) { - if (!is_null($group)) { - return $group->getId(); - } - }, iterator_to_array($screen->getScreenGroups())); - - // Ids of groups inputted - $newGroupsId = array_map( - /** - * @param string $group - * - * @return Ulid - */ - fn ($group): Ulid => Ulid::fromString($group), $object->groups); - - // This diff finds the groups to be saved - $newGroups = array_diff($newGroupsId, $existingGroups); - // ... and saves them. - foreach ($newGroups as $group) { + $groupCollection = new ArrayCollection(); + foreach ($object->groups as $group) { $groupToSave = $this->groupRepository->findOneBy(['id' => $group]); - if (is_null($groupToSave)) { - throw new InvalidArgumentException('Unknown group resource'); + throw new InvalidArgumentException('Unknown screen group resource'); } - - $screen->addScreenGroup($groupToSave); - } - - // This diff finds the groups to be deleted - $deleteGroups = array_diff($existingGroups, $newGroupsId); - // ... and deletes them. - foreach ($deleteGroups as $group) { - $groupToDelete = $this->groupRepository->findOneBy(['id' => $group]); - - if (is_null($groupToDelete)) { - throw new InvalidArgumentException('Unknown group resource'); - } - - $screen->removeScreenGroup($groupToDelete); + $groupCollection->add($groupToSave); } + $screen->setScreenGroups($groupCollection); } if (!empty($object->layout)) { From 09476058601f312973efa9f9c6758ae204db8601 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 16 Oct 2024 11:13:06 +0200 Subject: [PATCH 30/36] 2314: update changed variable name --- src/State/ScreenProcessor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 3752003b..4e41c7cb 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -92,7 +92,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $newPlaylistScreenRegionRelation->setRegion($region); $newPlaylistScreenRegionRelation->setScreen($screen); $newPlaylistScreenRegionRelation->setWeight($inputPlaylist['weight'] ?? 0); - $playlistScreenRegionCollection->add($playlistAndRegionToSave); + $playlistScreenRegionCollection->add($newPlaylistScreenRegionRelation); } else { // Update weight, add existing relation $existingPlaylistScreenRegion->setWeight($inputPlaylist['weight'] ?? 0); From 7a2f1e7eb7e4e214720ec94028aed8bffec92396 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Wed, 16 Oct 2024 11:17:36 +0200 Subject: [PATCH 31/36] 2314: wrap changelog --- CHANGELOG.md | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fa3f483..4ff390ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ All notable changes to this project will be documented in this file. - [#213](https://github.com/os2display/display-api-service/pull/213) - Add regions and groups to `ScreenInput.php` - Add "cascade: persist remove" to PlaylistScreenRegion - - Save playlist/regions in `ScreenProcessor.php` and in `src/entity/ScreenLayoutRegions` (as an alternative to sending multiple requests) + - Save playlist/regions in `ScreenProcessor.php` and in `src/entity/ScreenLayoutRegions` (as an alternative to sending + multiple requests) - Save groups in `ScreenProcessor.php` and in `src/entity/tenant/Screen.php` - Update psalm baseline - Add regions/playlists and groups to POST screen test @@ -72,8 +73,8 @@ All notable changes to this project will be documented in this file. - Changed route prefix to v2. - [#197](https://github.com/os2display/display-api-service/pull/197) - Fixed weight issue when assigning slides to playlist. -- [#194](https://github.com/os2display/display-api-service/pull/194) - Updated test run documentation and added test for `rrule` in playlist. +- [#194](https://github.com/os2display/display-api-service/pull/194) Updated test run documentation and added test for + `rrule` in playlist. - Fixed issue with PlaylistSlide transaction. - Fixed issues with feed following api platform upgrade. - [#192](https://github.com/os2display/display-api-service/pull/192) @@ -95,8 +96,8 @@ All notable changes to this project will be documented in this file. - [#184](https://github.com/os2display/display-api-service/pull/184) - Added RelationsModifiedTrait to serialization groups. - [#182](https://github.com/os2display/display-api-service/pull/182) - - Changed "Theme" api output to have "Logo" embedded to avoid 404 errors when fetching logo from other shared slide - w. foreign tenant. + - Changed "Theme" api output to have "Logo" embedded to avoid 404 errors when fetching logo from other shared slide w. + foreign tenant. - [#181](https://github.com/os2display/display-api-service/pull/181) - Update minimum PHP version to 8.2 to support trait constants - Add 'relationsModified' timestamps on relevant entities and API resources. @@ -117,16 +118,11 @@ All notable changes to this project will be documented in this file. - Switch from doctrine annotations to attributes - Add rector as dev dependency and apply rules - Handle doctrine deprecations -- [#173](https://github.com/os2display/display-api-service/pull/173) - Upgraded to API Platform 3 -- [#172](https://github.com/os2display/display-api-service/pull/172) - Linted YAML API resources -- [#171](https://github.com/os2display/display-api-service/pull/171) - Fixed slide playlists collection operation. -- [#170](https://github.com/os2display/display-api-service/pull/170) - Updated Symfony development packages. -- [#165](https://github.com/os2display/display-api-service/pull/165) - Symfony 6.3 +- [#173](https://github.com/os2display/display-api-service/pull/173) Upgraded to API Platform 3 +- [#172](https://github.com/os2display/display-api-service/pull/172) Linted YAML API resources +- [#171](https://github.com/os2display/display-api-service/pull/171) Fixed slide playlists collection operation. +- [#170](https://github.com/os2display/display-api-service/pull/170) Updated Symfony development packages. +- [#165](https://github.com/os2display/display-api-service/pull/165) Symfony 6.3 - [#162](https://github.com/os2display/display-api-service/pull/162) - Adds "external" openid-connect provider. - Renamed "oidc" openid-connect provider to "internal". @@ -136,9 +132,9 @@ All notable changes to this project will be documented in this file. - Upgrades openid-connect bundle to 3.1 to support multiple providers. - Changes php requirement in composer.json to >= 8.1. - Removed PHP Upgrade coding standards github actions check. - - Changed user identifier from email to providerId. Made email nullable. Copied value from email to providerId in migration. -- [#161](https://github.com/os2display/display-api-service/pull/161) - Fixed non-entity related psalm errors. + - Changed user identifier from email to providerId. Made email nullable. Copied value from email to providerId in + migration. +- [#161](https://github.com/os2display/display-api-service/pull/161) Fixed non-entity related psalm errors. ## [1.5.0] - 2023-10-26 @@ -215,7 +211,8 @@ All notable changes to this project will be documented in this file. - [#138](https://github.com/os2display/display-api-service/pull/138) - Fixed Tenant and command to allow for empty fallbackImageUrl. - [#139](https://github.com/os2display/display-api-service/pull/139) - - Changed from service decoration to event listeners to re-enable setting `tenants` on the response from `/v1/authentication/token`. + - Changed from service decoration to event listeners to re-enable setting `tenants` on the response from + `/v1/authentication/token`. - Ensure same response data from both `/v1/authentication/token` and `/v1/authentication/token/refresh`endpoints. - Added `user` and `tenants` to JWT payload. From 3861ee82d942825f3c89d20bad8d7dd90c759a39 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 22 Oct 2024 14:00:10 +0200 Subject: [PATCH 32/36] 2314: supress psalm InvalidArgument --- src/State/ScreenProcessor.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 4e41c7cb..a36353b7 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -92,10 +92,12 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $newPlaylistScreenRegionRelation->setRegion($region); $newPlaylistScreenRegionRelation->setScreen($screen); $newPlaylistScreenRegionRelation->setWeight($inputPlaylist['weight'] ?? 0); + /** @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($newPlaylistScreenRegionRelation); } else { // Update weight, add existing relation $existingPlaylistScreenRegion->setWeight($inputPlaylist['weight'] ?? 0); + /** @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($existingPlaylistScreenRegion); } } @@ -111,6 +113,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari if (is_null($groupToSave)) { throw new InvalidArgumentException('Unknown screen group resource'); } + /** @psalm-suppress InvalidArgument */ $groupCollection->add($groupToSave); } $screen->setScreenGroups($groupCollection); From 2daf652878b9787f328a5b7a447bd4dbfad4637a Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 22 Oct 2024 20:42:22 +0200 Subject: [PATCH 33/36] 2314: screen processor lint --- src/State/ScreenProcessor.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index a36353b7..87397f44 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -92,12 +92,12 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $newPlaylistScreenRegionRelation->setRegion($region); $newPlaylistScreenRegionRelation->setScreen($screen); $newPlaylistScreenRegionRelation->setWeight($inputPlaylist['weight'] ?? 0); - /** @psalm-suppress InvalidArgument */ + /* @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($newPlaylistScreenRegionRelation); } else { // Update weight, add existing relation $existingPlaylistScreenRegion->setWeight($inputPlaylist['weight'] ?? 0); - /** @psalm-suppress InvalidArgument */ + /* @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($existingPlaylistScreenRegion); } } @@ -113,7 +113,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari if (is_null($groupToSave)) { throw new InvalidArgumentException('Unknown screen group resource'); } - /** @psalm-suppress InvalidArgument */ + /* @psalm-suppress InvalidArgument */ $groupCollection->add($groupToSave); } $screen->setScreenGroups($groupCollection); From 22e8cd96e64d0eb7f5290f1ad374e1c7c4597e51 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 22 Oct 2024 20:55:38 +0200 Subject: [PATCH 34/36] 2314: lint broke psalm, readd psalm --- src/State/ScreenProcessor.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/State/ScreenProcessor.php b/src/State/ScreenProcessor.php index 87397f44..a36353b7 100644 --- a/src/State/ScreenProcessor.php +++ b/src/State/ScreenProcessor.php @@ -92,12 +92,12 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari $newPlaylistScreenRegionRelation->setRegion($region); $newPlaylistScreenRegionRelation->setScreen($screen); $newPlaylistScreenRegionRelation->setWeight($inputPlaylist['weight'] ?? 0); - /* @psalm-suppress InvalidArgument */ + /** @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($newPlaylistScreenRegionRelation); } else { // Update weight, add existing relation $existingPlaylistScreenRegion->setWeight($inputPlaylist['weight'] ?? 0); - /* @psalm-suppress InvalidArgument */ + /** @psalm-suppress InvalidArgument */ $playlistScreenRegionCollection->add($existingPlaylistScreenRegion); } } @@ -113,7 +113,7 @@ protected function fromInput(mixed $object, Operation $operation, array $uriVari if (is_null($groupToSave)) { throw new InvalidArgumentException('Unknown screen group resource'); } - /* @psalm-suppress InvalidArgument */ + /** @psalm-suppress InvalidArgument */ $groupCollection->add($groupToSave); } $screen->setScreenGroups($groupCollection); From c5a33ab51280402b01ca3aa9e90859bc38c673cd Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 22 Oct 2024 20:58:53 +0200 Subject: [PATCH 35/36] 2314: add phpdoc_to_comment false to php-cs-fixer --- .php-cs-fixer.dist.php | 1 + 1 file changed, 1 insertion(+) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 25b5db33..1367a2a4 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -16,6 +16,7 @@ 'phpdoc_align' => false, 'no_superfluous_phpdoc_tags' => false, 'array_syntax' => ['syntax' => 'short'], + 'phpdoc_to_comment' => false, 'declare_strict_types' => true, ConstructorEmptyBracesFixer::name() => true, MultilinePromotedPropertiesFixer::name() => true, From b2f484944ae95857529d17cd2e5c339867d3d539 Mon Sep 17 00:00:00 2001 From: Sine Jespersen Date: Tue, 22 Oct 2024 21:01:34 +0200 Subject: [PATCH 36/36] 2314: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ff390ee..bbd7fbbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Updated endSessionUrl to be nullable. - [#213](https://github.com/os2display/display-api-service/pull/213) + - Set `phpdoc_to_comment` to `false`in `.php-cs-fixer.dist.php` to avoid breaking psalm ignore - Add regions and groups to `ScreenInput.php` - Add "cascade: persist remove" to PlaylistScreenRegion - Save playlist/regions in `ScreenProcessor.php` and in `src/entity/ScreenLayoutRegions` (as an alternative to sending