From 0daca763b930b5ad7682f37d5cdef1797d278768 Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Thu, 19 Sep 2024 14:27:50 +0300 Subject: [PATCH] Fix copying of a public list to favorites. --- module/Finna/config/module.config.php | 2 +- .../src/Finna/Controller/ListController.php | 3 + .../src/Finna/Favorites/FavoritesService.php | 15 ++-- .../Favorites/FavoritesServiceFactory.php | 87 +++++++++++++++++++ 4 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 module/Finna/src/Finna/Favorites/FavoritesServiceFactory.php diff --git a/module/Finna/config/module.config.php b/module/Finna/config/module.config.php index 299659769c1..a76b1d9701a 100644 --- a/module/Finna/config/module.config.php +++ b/module/Finna/config/module.config.php @@ -375,7 +375,7 @@ 'Finna\Service\UserPreferenceService' => 'Finna\Service\UserPreferenceServiceFactory', 'Finna\Statistics\Driver\PluginManager' => 'VuFind\ServiceManager\AbstractPluginManagerFactory', 'Finna\Statistics\EventHandler' => 'Finna\Statistics\EventHandlerFactory', - 'Finna\Favorites\FavoritesService' => 'VuFind\Favorites\FavoritesServiceFactory', + 'Finna\Favorites\FavoritesService' => 'Finna\Favorites\FavoritesServiceFactory', 'Finna\View\CustomElement\PluginManager' => 'VuFind\ServiceManager\AbstractPluginManagerFactory', 'Finna\Video\Handler\PluginManager' => 'VuFind\ServiceManager\AbstractPluginManagerFactory', 'Finna\Video\Video' => 'Finna\Video\VideoFactory', diff --git a/module/Finna/src/Finna/Controller/ListController.php b/module/Finna/src/Finna/Controller/ListController.php index f03dcf7dc2b..4c661b464aa 100644 --- a/module/Finna/src/Finna/Controller/ListController.php +++ b/module/Finna/src/Finna/Controller/ListController.php @@ -31,12 +31,14 @@ namespace Finna\Controller; use Laminas\Stdlib\Parameters; +use VuFind\Db\Entity\UserEntityInterface; use VuFind\Db\Service\TagServiceInterface; use VuFind\Db\Service\UserListService; use VuFind\Db\Service\UserListServiceInterface; use VuFind\Exception\ListPermission as ListPermissionException; use VuFind\Exception\RecordMissing as RecordMissingException; +use function assert; use function is_object; /** @@ -222,6 +224,7 @@ protected function processSave($user, $sourceListId, $targetListId): void // Perform the save operation: $favorites = $this->serviceLocator->get(\VuFind\Favorites\FavoritesService::class); + assert($favorites instanceof \Finna\Favorites\FavoritesService); $favorites->saveMany(['list' => $targetListId], $user, $records); } diff --git a/module/Finna/src/Finna/Favorites/FavoritesService.php b/module/Finna/src/Finna/Favorites/FavoritesService.php index ea9442bc179..e5ad23424cf 100644 --- a/module/Finna/src/Finna/Favorites/FavoritesService.php +++ b/module/Finna/src/Finna/Favorites/FavoritesService.php @@ -31,6 +31,7 @@ namespace Finna\Favorites; +use Finna\Db\Entity\FinnaUserResourceEntityInterface; use Finna\Db\Service\UserListService; use VuFind\Db\Entity\UserEntityInterface; use VuFind\Record\Cache as RecordCache; @@ -73,14 +74,13 @@ public function saveMany(array $params, UserEntityInterface $user, array $record assert($this->userListService instanceof UserListService); - // Add custom order keys for new items if the list has custom order + // Add custom order keys for new items if the list has custom order: $index = $this->userListService->getNextAvailableCustomOrderIndex($list->getId()); - // If target list is not in custom order then reverse + // If target list is not in custom order then reverse the records to get original order: if (!$this->userListService->isCustomOrderAvailable($list->getId())) { - $params['ids'] = array_reverse($params['ids']); + $records = array_reverse($records); } - $tags = isset($params['mytags']) ? $this->tagsService->parse($params['mytags']) : []; foreach ($records as $record) { @@ -88,11 +88,12 @@ public function saveMany(array $params, UserEntityInterface $user, array $record $resource = $this->resourcePopulator->getOrCreateResourceForDriver($record); // Create the resource link if it doesn't exist: - $resource = $this->userResourceService->createOrUpdateLink($resource, $user, $list); + $userResource = $this->userResourceService->createOrUpdateLink($resource, $user, $list); // Update custom order index: if ($index) { - $resource->finna_custom_order_index = $index; - $resource->save(); + assert($userResource instanceof FinnaUserResourceEntityInterface); + $userResource->setFinnaCustomOrderIndex($index); + $this->userResourceService->persistEntity($resource); ++$index; } diff --git a/module/Finna/src/Finna/Favorites/FavoritesServiceFactory.php b/module/Finna/src/Finna/Favorites/FavoritesServiceFactory.php new file mode 100644 index 00000000000..f06fcdeac5a --- /dev/null +++ b/module/Finna/src/Finna/Favorites/FavoritesServiceFactory.php @@ -0,0 +1,87 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org Main Page + */ + +namespace Finna\Favorites; + +use Laminas\ServiceManager\Factory\FactoryInterface; +use Psr\Container\ContainerInterface; +use VuFind\Db\Service\ResourceServiceInterface; +use VuFind\Db\Service\ResourceTagsServiceInterface; +use VuFind\Db\Service\UserListServiceInterface; +use VuFind\Db\Service\UserResourceServiceInterface; +use VuFind\Db\Service\UserServiceInterface; +use VuFind\Record\Loader; +use VuFind\Record\ResourcePopulator; +use VuFind\Tags\TagsService; + +/** + * Favorites service + * + * @category VuFind + * @package Favorites + * @author Demian Katz + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org Main Page + * + * @codeCoverageIgnore + */ +class FavoritesServiceFactory implements FactoryInterface +{ + /** + * Create service + * + * Finna version due to the hardcoded class name + * + * @param ContainerInterface $container Service container + * @param string $name Requested service name (unused) + * @param array $options Extra options (unused) + * + * @return FavoritesService + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $serviceManager = $container->get(\VuFind\Db\Service\PluginManager::class); + $sessionManager = $container->get(\Laminas\Session\SessionManager::class); + $session = new \Laminas\Session\Container('List', $sessionManager); + return new FavoritesService( + $serviceManager->get(ResourceServiceInterface::class), + $serviceManager->get(ResourceTagsServiceInterface::class), + $serviceManager->get(UserListServiceInterface::class), + $serviceManager->get(UserResourceServiceInterface::class), + $serviceManager->get(UserServiceInterface::class), + $container->get(ResourcePopulator::class), + $container->get(TagsService::class), + $container->get(Loader::class), + $container->get(\VuFind\Record\Cache::class), + $session + ); + } +}