aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/TagManager.php
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2022-04-19 13:05:38 +0200
committerCôme Chilliet (Rebase PR Action) <come-nc@users.noreply.github.com>2022-09-29 15:15:28 +0000
commit92a5a8f075fe5e6b72037cc4a668090d3a8cacf5 (patch)
tree198134dd6411f82a077a70b37bec735024437e1d /lib/private/TagManager.php
parentb4708fb9f003a306edcfe0346e25f9583c4c162a (diff)
downloadnextcloud-server-92a5a8f075fe5e6b72037cc4a668090d3a8cacf5.tar.gz
nextcloud-server-92a5a8f075fe5e6b72037cc4a668090d3a8cacf5.zip
Cleanup tags and Share component
- Port to LoggerInterface - Use IDBConnection and IQueryBuilder instead of raw SQL and OC_DB - Use IEventListener instead of hooks - Remove the now unused OC_DB and OC_DB_StatementWrapper legacy utils Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'lib/private/TagManager.php')
-rw-r--r--lib/private/TagManager.php81
1 files changed, 69 insertions, 12 deletions
diff --git a/lib/private/TagManager.php b/lib/private/TagManager.php
index 8c9dca98c92..82c4dd2188d 100644
--- a/lib/private/TagManager.php
+++ b/lib/private/TagManager.php
@@ -28,26 +28,30 @@ namespace OC;
use OC\Tagging\TagMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
use OCP\IDBConnection;
use OCP\ITagManager;
use OCP\ITags;
use OCP\IUserSession;
+use OCP\User\Events\UserDeletedEvent;
+use OCP\Db\Exception as DBException;
+use Psr\Log\LoggerInterface;
-class TagManager implements ITagManager {
-
- /** @var TagMapper */
- private $mapper;
-
- /** @var IUserSession */
- private $userSession;
-
- /** @var IDBConnection */
- private $connection;
+/**
+ * @template-implements IEventListener<UserDeletedEvent>
+ */
+class TagManager implements ITagManager, IEventListener {
+ private TagMapper $mapper;
+ private IUserSession $userSession;
+ private IDBConnection $connection;
+ private LoggerInterface $logger;
- public function __construct(TagMapper $mapper, IUserSession $userSession, IDBConnection $connection) {
+ public function __construct(TagMapper $mapper, IUserSession $userSession, IDBConnection $connection, LoggerInterface $logger) {
$this->mapper = $mapper;
$this->userSession = $userSession;
$this->connection = $connection;
+ $this->logger = $logger;
}
/**
@@ -72,7 +76,7 @@ class TagManager implements ITagManager {
}
$userId = $this->userSession->getUser()->getUId();
}
- return new Tags($this->mapper, $userId, $type, $defaultTags);
+ return new Tags($this->mapper, $userId, $type, $this->logger, $this->connection, $defaultTags);
}
/**
@@ -97,4 +101,57 @@ class TagManager implements ITagManager {
return $users;
}
+
+ public function handle(Event $event): void {
+ if (!($event instanceof UserDeletedEvent)) {
+ return;
+ }
+
+ // Find all objectid/tagId pairs.
+ $user = $event->getUser();
+ $qb = $this->connection->getQueryBuilder();
+ $qb->select('id')
+ ->from('vcategory')
+ ->where($qb->expr()->eq('uid', $qb->createNamedParameter($user->getUID())));
+ try {
+ $result = $qb->executeQuery();
+ } catch (DBException $e) {
+ $this->logger->error($e->getMessage(), [
+ 'app' => 'core',
+ 'exception' => $e,
+ ]);
+ return;
+ }
+
+ $tagsIds = array_map(fn (array $row) => (int)$row['id'], $result->fetchAll());
+ $result->closeCursor();
+
+ if (count($tagsIds) === 0) {
+ return;
+ }
+
+ // Clean vcategory_to_object table
+ $qb = $this->connection->getQueryBuilder();
+ $qb = $qb->delete('vcategory_to_object')
+ ->where($qb->expr()->in('categoryid', $qb->createParameter('chunk')));
+
+ // Clean vcategory
+ $qb1 = $this->connection->getQueryBuilder();
+ $qb1 = $qb1->delete('vcategory')
+ ->where($qb1->expr()->in('uid', $qb1->createParameter('chunk')));
+
+ foreach (array_chunk($tagsIds, 1000) as $tagChunk) {
+ $qb->setParameter('chunk', $tagChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $qb1->setParameter('chunk', $tagChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ try {
+ $qb->executeStatement();
+ $qb1->executeStatement();
+ } catch (DBException $e) {
+ $this->logger->error($e->getMessage(), [
+ 'app' => 'core',
+ 'exception' => $e,
+ ]);
+ }
+ }
+ }
}