Skip to content

Commit

Permalink
migrated resource methods
Browse files Browse the repository at this point in the history
  • Loading branch information
skellamp committed Dec 26, 2023
1 parent 1fdf7e3 commit 702598b
Show file tree
Hide file tree
Showing 16 changed files with 159 additions and 587 deletions.
2 changes: 1 addition & 1 deletion module/VuFind/src/VuFind/Controller/Plugin/Favorites.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ public function saveBulk($params, $user)
$userService->saveResource($resource, $user->id, $list, $tags, '', false);

// Collect record IDs for caching
if ($this->cache->isCachable($resource->source)) {
if ($this->cache->isCachable($resource->getSource())) {
$cacheRecordIds[] = $current;
}
}
Expand Down
2 changes: 0 additions & 2 deletions module/VuFind/src/VuFind/Db/Row/PluginManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
'accesstoken' => AccessToken::class,
'externalsession' => ExternalSession::class,
'ratings' => Ratings::class,
'resource' => Resource::class,
'search' => Search::class,
'session' => Session::class,
'user' => User::class,
Expand All @@ -66,7 +65,6 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
AuthHash::class => RowGatewayFactory::class,
ExternalSession::class => RowGatewayFactory::class,
Ratings::class => RowGatewayFactory::class,
Resource::class => RowGatewayFactory::class,
Search::class => RowGatewayFactory::class,
Session::class => RowGatewayFactory::class,
User::class => UserFactory::class,
Expand Down
125 changes: 0 additions & 125 deletions module/VuFind/src/VuFind/Db/Row/Resource.php

This file was deleted.

13 changes: 4 additions & 9 deletions module/VuFind/src/VuFind/Db/Row/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -335,18 +335,13 @@ public function getSavedData(
public function removeResourcesById($ids, $source = DEFAULT_SEARCH_BACKEND)
{
// Retrieve a list of resource IDs:
$resourceTable = $this->getDbTable('Resource');
$resources = $resourceTable->findResources($ids, $source);

$resourceIDs = [];
foreach ($resources as $current) {
$resourceIDs[] = $current->id;
}
$resourceService = $this->getDbService(\VuFind\Db\Service\ResourceService::class);
$resources = $resourceService->findResources($ids, $source);

// Remove Resource (related tags are also removed implicitly)
$userResourceTable = $this->getDbTable('UserResource');
$userResourceService = $this->getDbService(\VuFind\Db\Service\UserResourceService::class);
// true here makes sure that only tags in lists are deleted
$userResourceTable->destroyLinks($resourceIDs, $this->id, true);
$userResourceService->destroyLinks($this->id, $resources, true);
}

/**
Expand Down
117 changes: 117 additions & 0 deletions module/VuFind/src/VuFind/Db/Service/ResourceService.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
use VuFind\Db\Entity\PluginManager as EntityPluginManager;
use VuFind\Db\Entity\Resource;
use VuFind\Db\Entity\User;
use VuFind\Db\Entity\UserResource;
use VuFind\Exception\LoginRequired as LoginRequiredException;
use VuFind\Log\LoggerAwareTrait;
use VuFind\Record\Loader;
Expand Down Expand Up @@ -365,4 +366,120 @@ public function findResources($ids, $source = DEFAULT_SEARCH_BACKEND)
];
return $repo->findBy($criteria);
}

/**
* Update the database to reflect a changed record identifier.
*
* @param string $oldId Original record ID
* @param string $newId Revised record ID
* @param string $source Record source
*
* @return void
*/
public function updateRecordId($oldId, $newId, $source = DEFAULT_SEARCH_BACKEND)
{
if (
$oldId !== $newId
&& $resource = $this->findResource($oldId, $source, false)
) {
// Do this as a transaction to prevent odd behavior:
$this->entityManager->getConnection()->beginTransaction();
// Does the new ID already exist?
$deduplicate = false;
if ($newResource = $this->findResource($newId, $source, false)) {
// Special case: merge new ID and old ID:
$entitiesToUpdate = [
\VuFind\Db\Entity\Comments::class,
\VuFind\Db\Entity\UserResource::class,
\VuFind\Db\Entity\ResourceTags::class,
];
foreach ($entitiesToUpdate as $entityToUpdate) {
$this->updateResource($entityToUpdate, $newResource, $resource);
}
$this->entityManager->remove($resource);
$deduplicate = true;
} else {
// Default case: just update the record ID:
$resource->setRecordId($newId);
}
// Done -- commit the transaction:
try {
$this->entityManager->flush();
$this->entityManager->getConnection()->commit();
} catch (\Exception $e) {
$this->logError('Could not update the record: ' . $e->getMessage());
$this->entityManager->getConnection()->rollBack();
throw $e;
}
// Deduplicate rows where necessary (this can be safely done outside of the transaction):
if ($deduplicate) {
$tagService = $this->getDbService(\VuFind\Db\Service\TagService::class);
$tagService->deduplicateResourceLinks();
$userResourceService = $this->getDbService(\VuFind\Db\Service\UserResourceService::class);
$userResourceService->deduplicate();
}
}
}

/**
* Get a set of records from the requested favorite list.
*
* @param int|User $user ID of user owning favorite list
* @param int|UserList $list ID of list to retrieve (null for all favorites)
* @param array $tags Tags to use for limiting results
* @param string $sort Resource table field to use for sorting (null for
* no particular sort).
* @param int $offset Offset for results
* @param int $limit Limit for results (null for none)
*
* @return \Laminas\Db\ResultSet\AbstractResultSet
*/
public function getFavorites(
$user,
$list = null,
$tags = [],
$sort = null,
$offset = 0,
$limit = null
) {
$dql = 'SELECT DISTINCT(r.id), r '
. 'FROM ' . $this->getEntityClass(Resource::class) . ' r '
. 'JOIN ' . $this->getEntityClass(UserResource::class) . ' ur WITH r.id = ur.resource ';
$dqlWhere = [];
$dqlWhere[] = 'ur.user = :user';
$parameters = compact('user');
if (null !== $list) {
$dqlWhere[] = 'ur.list = :list';
$parameters['list'] = $list;
}

// Adjust for tags if necessary:
if (!empty($tags)) {
$linkingTable = $this->getDbService(\VuFind\Db\Service\TagService::class);
$matches = [];
foreach ($tags as $tag) {
$matches[] = $linkingTable
->getResourceIDsForTag($tag, $user, $list);
}
$dqlWhere[] = 'r.id IN (:ids)';
$parameters['ids'] = $matches;
}
$dql .= ' WHERE ' . implode(' AND ', $dqlWhere);
if (!empty($sort)) {
$dql .= ResourceService::getOrderByClause($sort);
}

$query = $this->entityManager->createQuery($dql);
$query->setParameters($parameters);

if ($offset > 0) {
$query->setFirstResult($offset);
}
if (null !== $limit) {
$query->setMaxResults($limit);
}

$result = $query->getResult();
return $result;
}
}
2 changes: 0 additions & 2 deletions module/VuFind/src/VuFind/Db/Table/PluginManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
'accesstoken' => AccessToken::class,
'externalsession' => ExternalSession::class,
'ratings' => Ratings::class,
'resource' => Resource::class,
'search' => Search::class,
'session' => Session::class,
'user' => User::class,
Expand All @@ -66,7 +65,6 @@ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager
AuthHash::class => GatewayFactory::class,
ExternalSession::class => GatewayFactory::class,
Ratings::class => GatewayFactory::class,
Resource::class => ResourceFactory::class,
Search::class => GatewayFactory::class,
Session::class => GatewayFactory::class,
User::class => UserFactory::class,
Expand Down
Loading

0 comments on commit 702598b

Please sign in to comment.