From ba5d2bb84a0738973f08fc1065434d44f69ea093 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 20 Nov 2024 16:41:56 +0100 Subject: [PATCH 1/6] Fix deletes --- src/Service/CacheService.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php index 04148e4e..172f4a17 100644 --- a/src/Service/CacheService.php +++ b/src/Service/CacheService.php @@ -312,7 +312,7 @@ public function warmup(array $config = [], ?string $bundleToCache = null): int // Backwards compatibility. if (((isset($config['schemas']) === false || $config['schemas'] !== true) - || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) + || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) && isset($this->client) === false ) { isset($this->style) === true && $this->style->writeln('No cache client found, halting warmup'); @@ -443,6 +443,7 @@ private function removeDataFromCache(Collection $collection, string $type, array foreach ($schemaRefs as $schemaRef) { $filter['_self.schema.id']['$in'][] = $schemaRef; } + $filter['_limit'] = $collection->count($filter); $objects = $collection->find($filter, [])->toArray(); } else { From 746ee56064c811ee10853565719a396bb4ae8bf1 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 19 Feb 2025 21:12:18 +0100 Subject: [PATCH 2/6] First steps in fixing multitenancy --- src/Message/CacheMessage.php | 7 ++++++- src/Message/ValueMessage.php | 7 ++++++- src/MessageHandler/CacheMessageHandler.php | 4 ++++ src/MessageHandler/ValueMessageHandler.php | 4 ++++ src/Subscriber/ActionSubscriber.php | 2 +- src/Subscriber/ValueSubscriber.php | 2 +- 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Message/CacheMessage.php b/src/Message/CacheMessage.php index f4e6a1e7..38792e1d 100644 --- a/src/Message/CacheMessage.php +++ b/src/Message/CacheMessage.php @@ -15,7 +15,7 @@ class CacheMessage private UuidInterface $objectEntityId; - public function __construct(UuidInterface $actionId) + public function __construct(UuidInterface $actionId, private readonly string $application) { $this->objectEntityId = $actionId; @@ -26,4 +26,9 @@ public function getObjectEntityId(): UuidInterface return $this->objectEntityId; }//end getObjectEntityId() + + public function getApplication(): ?string + { + return $this->application; + } }//end class diff --git a/src/Message/ValueMessage.php b/src/Message/ValueMessage.php index 965eee8a..3125fa9c 100644 --- a/src/Message/ValueMessage.php +++ b/src/Message/ValueMessage.php @@ -29,7 +29,7 @@ class ValueMessage * * @param UuidInterface $valueId The id of the value to check./ */ - public function __construct(UuidInterface $valueId, ?UuidInterface $userId) + public function __construct(UuidInterface $valueId, ?UuidInterface $userId, private readonly string $application) { $this->valueId = $valueId; $this->userId = $userId; @@ -57,4 +57,9 @@ public function getUserId(): ?UuidInterface return $this->userId; }//end getUserId() + + public function getApplication(): string + { + $this->application; + } }//end class diff --git a/src/MessageHandler/CacheMessageHandler.php b/src/MessageHandler/CacheMessageHandler.php index 8ee788bf..ae201d1a 100644 --- a/src/MessageHandler/CacheMessageHandler.php +++ b/src/MessageHandler/CacheMessageHandler.php @@ -47,6 +47,10 @@ public function __construct(CacheService $cacheService, ObjectEntityRepository $ public function __invoke(CacheMessage $message): void { $object = $this->repository->find($message->getObjectEntityId()); + + if ($message->getApplication() !== null) { + $this->session->set('application', $message->getApplication()); + } try { if ($object instanceof ObjectEntity) { diff --git a/src/MessageHandler/ValueMessageHandler.php b/src/MessageHandler/ValueMessageHandler.php index 9bf57e53..8e500f04 100644 --- a/src/MessageHandler/ValueMessageHandler.php +++ b/src/MessageHandler/ValueMessageHandler.php @@ -86,6 +86,10 @@ public function __invoke(ValueMessage $message): void if ($message->getUserId() !== null) { $this->session->set('valueMessageUserId', $message->getUserId()->toString()); } + + if ($message->getApplication() !== null) { + $this->session->set('application', $message->getApplication()); + } try { if ($value instanceof Value === true) { diff --git a/src/Subscriber/ActionSubscriber.php b/src/Subscriber/ActionSubscriber.php index 66f6a928..fa8455f2 100644 --- a/src/Subscriber/ActionSubscriber.php +++ b/src/Subscriber/ActionSubscriber.php @@ -193,7 +193,7 @@ public function handleAction(Action $action, ActionEvent $event): ActionEvent } else { $data = $event->getData(); unset($data['httpRequest']); - $this->messageBus->dispatch(new ActionMessage($action->getId(), $data, $currentCronJobThrow)); + $this->messageBus->dispatch(new ActionMessage($action->getId(), $data, $currentCronJobThrow, $this->session->get('application'))); } $this->handleActionIoFinish($action, $currentCronJobThrow); diff --git a/src/Subscriber/ValueSubscriber.php b/src/Subscriber/ValueSubscriber.php index f7a89e2c..0a9e0209 100644 --- a/src/Subscriber/ValueSubscriber.php +++ b/src/Subscriber/ValueSubscriber.php @@ -96,7 +96,7 @@ public function postUpdate(LifecycleEventArgs $value): void $userId = Uuid::fromString($this->session->get('user')); } - $this->messageBus->dispatch(new ValueMessage($value->getObject()->getId(), $userId)); + $this->messageBus->dispatch(new ValueMessage($value->getObject()->getId(), $userId, $this->session->get('application'))); } catch (\Exception $exception) { $this->logger->error("Error when trying to create a ValueMessage for Value {$value->getObject()->getId()}: ".$exception->getMessage()); } From d9ac3463572feff6fceef22ea13143e678f73769 Mon Sep 17 00:00:00 2001 From: GitHub Actions <> Date: Wed, 19 Feb 2025 20:13:02 +0000 Subject: [PATCH 3/6] Update src from PHP Codesniffer --- src/Message/CacheMessage.php | 5 +++-- src/Message/ValueMessage.php | 5 +++-- src/MessageHandler/CacheMessageHandler.php | 2 +- src/MessageHandler/ValueMessageHandler.php | 2 +- src/Service/CacheService.php | 3 ++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Message/CacheMessage.php b/src/Message/CacheMessage.php index 38792e1d..70ad33ff 100644 --- a/src/Message/CacheMessage.php +++ b/src/Message/CacheMessage.php @@ -26,9 +26,10 @@ public function getObjectEntityId(): UuidInterface return $this->objectEntityId; }//end getObjectEntityId() - + public function getApplication(): ?string { return $this->application; - } + + }//end getApplication() }//end class diff --git a/src/Message/ValueMessage.php b/src/Message/ValueMessage.php index 3125fa9c..6c3eb123 100644 --- a/src/Message/ValueMessage.php +++ b/src/Message/ValueMessage.php @@ -57,9 +57,10 @@ public function getUserId(): ?UuidInterface return $this->userId; }//end getUserId() - + public function getApplication(): string { $this->application; - } + + }//end getApplication() }//end class diff --git a/src/MessageHandler/CacheMessageHandler.php b/src/MessageHandler/CacheMessageHandler.php index ae201d1a..5dbf0625 100644 --- a/src/MessageHandler/CacheMessageHandler.php +++ b/src/MessageHandler/CacheMessageHandler.php @@ -47,7 +47,7 @@ public function __construct(CacheService $cacheService, ObjectEntityRepository $ public function __invoke(CacheMessage $message): void { $object = $this->repository->find($message->getObjectEntityId()); - + if ($message->getApplication() !== null) { $this->session->set('application', $message->getApplication()); } diff --git a/src/MessageHandler/ValueMessageHandler.php b/src/MessageHandler/ValueMessageHandler.php index 8e500f04..0f7cfd61 100644 --- a/src/MessageHandler/ValueMessageHandler.php +++ b/src/MessageHandler/ValueMessageHandler.php @@ -86,7 +86,7 @@ public function __invoke(ValueMessage $message): void if ($message->getUserId() !== null) { $this->session->set('valueMessageUserId', $message->getUserId()->toString()); } - + if ($message->getApplication() !== null) { $this->session->set('application', $message->getApplication()); } diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php index 172f4a17..f0365ec3 100644 --- a/src/Service/CacheService.php +++ b/src/Service/CacheService.php @@ -312,7 +312,7 @@ public function warmup(array $config = [], ?string $bundleToCache = null): int // Backwards compatibility. if (((isset($config['schemas']) === false || $config['schemas'] !== true) - || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) + || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) && isset($this->client) === false ) { isset($this->style) === true && $this->style->writeln('No cache client found, halting warmup'); @@ -443,6 +443,7 @@ private function removeDataFromCache(Collection $collection, string $type, array foreach ($schemaRefs as $schemaRef) { $filter['_self.schema.id']['$in'][] = $schemaRef; } + $filter['_limit'] = $collection->count($filter); $objects = $collection->find($filter, [])->toArray(); From 1dbedb8005bca59c1c02eacfcaefc2aa4fa1de13 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Mon, 24 Feb 2025 16:24:25 +0100 Subject: [PATCH 4/6] Fixes for passing tenant to action handlers --- src/Message/ValueMessage.php | 4 ++-- src/Service/CacheService.php | 4 ++-- src/Service/ObjectEntityService.php | 12 +++++++++++- src/Subscriber/ObjectUriSubscriber.php | 20 +++++++++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/Message/ValueMessage.php b/src/Message/ValueMessage.php index 3125fa9c..01d42792 100644 --- a/src/Message/ValueMessage.php +++ b/src/Message/ValueMessage.php @@ -57,9 +57,9 @@ public function getUserId(): ?UuidInterface return $this->userId; }//end getUserId() - + public function getApplication(): string { - $this->application; + return $this->application; } }//end class diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php index 172f4a17..c4dba823 100644 --- a/src/Service/CacheService.php +++ b/src/Service/CacheService.php @@ -312,7 +312,7 @@ public function warmup(array $config = [], ?string $bundleToCache = null): int // Backwards compatibility. if (((isset($config['schemas']) === false || $config['schemas'] !== true) - || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) + || (isset($config['endpoints']) === false || $config['endpoints'] !== true)) && isset($this->client) === false ) { isset($this->style) === true && $this->style->writeln('No cache client found, halting warmup'); @@ -879,7 +879,7 @@ public function retrieveObjectsFromCache(array $filter, ?array $options): array } else { return []; } - + $total = $this->countObjectsInCache(filter: $filter); $results = $collection->find($filter, $options)->toArray(); diff --git a/src/Service/ObjectEntityService.php b/src/Service/ObjectEntityService.php index 66e41785..0fb0f450 100644 --- a/src/Service/ObjectEntityService.php +++ b/src/Service/ObjectEntityService.php @@ -5,6 +5,7 @@ use App\Entity\ObjectEntity; use App\Entity\Organization; use App\Entity\User; +use App\Service\ApplicationService; use Doctrine\ORM\EntityManagerInterface; use Ramsey\Uuid\Uuid; use Symfony\Component\HttpFoundation\Session\SessionInterface; @@ -63,7 +64,8 @@ class ObjectEntityService public function __construct( EntityManagerInterface $entityManager, Security $security, - SessionInterface $session + SessionInterface $session, + private readonly ApplicationService $applicationService ) { $this->entityManager = $entityManager; $this->security = $security; @@ -125,6 +127,8 @@ public function setOwnerAndOrg(ObjectEntity $object): ObjectEntity { $user = $this->findCurrentUser(); +// var_dump($user->getId()); + $object = $this->setOwner($object, $user); return $this->setOrganization($object, $user); // Do not persist here, because this triggers the subscriber that calls this setOwnerAndOrg() function. @@ -145,6 +149,8 @@ private function setOwner(ObjectEntity $object, ?User $user): ObjectEntity return $object; } + $application = $this->applicationService->getApplication(); + // Find the correct owner to set. if ($user !== null) { $owner = $user->getId()->toString(); @@ -175,9 +181,13 @@ private function setOrganization(ObjectEntity $object, ?User $user): ObjectEntit return $object; } + $application = $this->applicationService->getApplication(); + // Find the correct Organization to set. if ($user !== null && $user->getOrganization() !== null) { $organization = $user->getOrganization(); + } else if ($application !== null) { + $organization = $application->getOrganization(); } else { // Default to the Default Organization. $organization = $this->entityManager->getRepository('App:Organization')->findOneBy(['reference' => $this::DEFAULTS['organization']]); diff --git a/src/Subscriber/ObjectUriSubscriber.php b/src/Subscriber/ObjectUriSubscriber.php index 5e21a5e6..6862e5f6 100644 --- a/src/Subscriber/ObjectUriSubscriber.php +++ b/src/Subscriber/ObjectUriSubscriber.php @@ -4,6 +4,8 @@ namespace CommonGateway\CoreBundle\Subscriber; use App\Entity\ObjectEntity; +use App\Exception\GatewayException; +use App\Service\ApplicationService; use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface; use Doctrine\ORM\Events; use Doctrine\Persistence\Event\LifecycleEventArgs; @@ -40,7 +42,8 @@ class ObjectUriSubscriber implements EventSubscriberInterface */ public function __construct( ParameterBagInterface $parameterBag, - SessionInterface $session + SessionInterface $session, + private ApplicationService $applicationService ) { $this->parameterBag = $parameterBag; $this->session = $session; @@ -80,8 +83,19 @@ public function postPersist(LifecycleEventArgs $args): void $object = $args->getObject(); // if this subscriber only applies to certain entity types, if ($object instanceof ObjectEntity) { - if ($object->getUri() === null || str_contains($object->getUri(), $object->getSelf()) === false) { - $object->setUri(rtrim($this->parameterBag->get('app_url'), '/').$object->getSelf()); + try{ + $application = $this->applicationService->getApplication(); + if ($object->getUri() === null + || str_contains($object->getUri(), $object->getSelf()) === false + ) { + $object->setUri('https://'.$application->getDomains()[0].$object->getSelf()); + } + } catch(GatewayException $exception) { + if ($object->getUri() === null + || str_contains($object->getUri(), $object->getSelf()) === false + ) { + $object->setUri(rtrim($this->parameterBag->get('app_url'), '/').$object->getSelf()); + } } return; From cce9c01a869c49e30977350a0c87c11ecd03e051 Mon Sep 17 00:00:00 2001 From: GitHub Actions <> Date: Mon, 24 Feb 2025 15:25:50 +0000 Subject: [PATCH 5/6] Update src from PHP Codesniffer --- src/Service/CacheService.php | 2 +- src/Subscriber/ObjectUriSubscriber.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php index deedde85..f0365ec3 100644 --- a/src/Service/CacheService.php +++ b/src/Service/CacheService.php @@ -880,7 +880,7 @@ public function retrieveObjectsFromCache(array $filter, ?array $options): array } else { return []; } - + $total = $this->countObjectsInCache(filter: $filter); $results = $collection->find($filter, $options)->toArray(); diff --git a/src/Subscriber/ObjectUriSubscriber.php b/src/Subscriber/ObjectUriSubscriber.php index 6862e5f6..7179b58e 100644 --- a/src/Subscriber/ObjectUriSubscriber.php +++ b/src/Subscriber/ObjectUriSubscriber.php @@ -83,14 +83,14 @@ public function postPersist(LifecycleEventArgs $args): void $object = $args->getObject(); // if this subscriber only applies to certain entity types, if ($object instanceof ObjectEntity) { - try{ + try { $application = $this->applicationService->getApplication(); if ($object->getUri() === null || str_contains($object->getUri(), $object->getSelf()) === false ) { $object->setUri('https://'.$application->getDomains()[0].$object->getSelf()); } - } catch(GatewayException $exception) { + } catch (GatewayException $exception) { if ($object->getUri() === null || str_contains($object->getUri(), $object->getSelf()) === false ) { From f027fbfded4665eae60ecdb97592b7948c908f25 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Thu, 27 Feb 2025 09:30:43 +0100 Subject: [PATCH 6/6] Remove var_dump --- src/Service/ObjectEntityService.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Service/ObjectEntityService.php b/src/Service/ObjectEntityService.php index 0fb0f450..4de0aaff 100644 --- a/src/Service/ObjectEntityService.php +++ b/src/Service/ObjectEntityService.php @@ -127,8 +127,6 @@ public function setOwnerAndOrg(ObjectEntity $object): ObjectEntity { $user = $this->findCurrentUser(); -// var_dump($user->getId()); - $object = $this->setOwner($object, $user); return $this->setOrganization($object, $user); // Do not persist here, because this triggers the subscriber that calls this setOwnerAndOrg() function.