diff --git a/src/CoreBundle/Entity/Listener/ResourceListener.php b/src/CoreBundle/Entity/Listener/ResourceListener.php index 6e7ac54c873..55f65851014 100644 --- a/src/CoreBundle/Entity/Listener/ResourceListener.php +++ b/src/CoreBundle/Entity/Listener/ResourceListener.php @@ -84,26 +84,47 @@ public function prePersist(AbstractResource $resource, PrePersistEventArgs $even } // 2. Set creator. - // Check if creator was set with $resource->setCreator() + // Priority order: + // 1) Resource node creator (if explicitly provided) + // 2) Resource creator (set via $resource->setCreator()) + // 3) Current authenticated user (Security token) + // Then normalize to a managed reference to avoid duplicate INSERT on user.username. $creator = $resource->getResourceNodeCreator(); + if (!$creator instanceof User) { + $creator = null; + } + + if (null === $creator) { + $explicitCreator = $resource->getCreator(); + if ($explicitCreator instanceof User) { + $creator = $explicitCreator; + } + } - $currentUser = null; if (null === $creator) { - // Get the creator from the current request. - /** @var User|null $currentUser */ $currentUser = $this->security->getUser(); - if (null !== $currentUser) { + if ($currentUser instanceof User) { $creator = $currentUser; } + } - // Check if user has a resource node. - if ($resource->hasResourceNode() && null !== $resource->getCreator()) { - $creator = $resource->getCreator(); + if (!$creator instanceof User) { + throw new UserNotFoundException('User creator not found, use $resource->setCreator();'); + } + + // Ensure creator is managed by this EntityManager. + if (!$em->contains($creator)) { + $creatorId = $creator->getId(); + if (null === $creatorId) { + throw new UserNotFoundException('Invalid creator user entity (missing ID).'); } + + $creator = $em->getReference(User::class, (int) $creatorId); } - if (null === $creator) { - throw new UserNotFoundException('User creator not found, use $resource->setCreator();'); + // Ensure the resource itself has creator set (not only the ResourceNode). + if (null === $resource->getCreator()) { + $resource->setCreator($creator); } // 3. Set ResourceType. @@ -341,9 +362,6 @@ public function updateResourceName(AbstractResource $resource): void if (empty($extension)) { // $slug = $this->slugify->slugify($resourceName); } - /*$originalExtension = pathinfo($resourceName, PATHINFO_EXTENSION); - $originalBasename = \basename($resourceName, $originalExtension); - $slug = sprintf('%s.%s', $this->slugify->slugify($originalBasename), $originalExtension);*/ $resource->getResourceNode()->setTitle($resourceName); }