diff options
author | skjnldsv <skjnldsv@protonmail.com> | 2024-10-22 15:56:03 +0200 |
---|---|---|
committer | skjnldsv <skjnldsv@protonmail.com> | 2024-10-29 09:08:31 +0100 |
commit | 14e2a8d3f982656e2a7c23c006fd59fdeebc80bd (patch) | |
tree | 216f9b391e4815daed88dbbf475252ad89fc42ae /lib/private/SystemTag/SystemTagObjectMapper.php | |
parent | f24b93e5067e54244d14eb08ad8ed8330a03724b (diff) | |
download | nextcloud-server-14e2a8d3f982656e2a7c23c006fd59fdeebc80bd.tar.gz nextcloud-server-14e2a8d3f982656e2a7c23c006fd59fdeebc80bd.zip |
feat(systemtags): add etag support and handle proppatch
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
Diffstat (limited to 'lib/private/SystemTag/SystemTagObjectMapper.php')
-rw-r--r-- | lib/private/SystemTag/SystemTagObjectMapper.php | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php index 0bfc03a1227..ddb04fa968d 100644 --- a/lib/private/SystemTag/SystemTagObjectMapper.php +++ b/lib/private/SystemTag/SystemTagObjectMapper.php @@ -156,6 +156,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { } } + $this->updateEtagForTags($tagIds); + $this->connection->commit(); if (empty($tagsAssigned)) { return; @@ -189,6 +191,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { ->setParameter('tagids', $tagIds, IQueryBuilder::PARAM_INT_ARRAY) ->executeStatement(); + $this->updateEtagForTags($tagIds); + $this->dispatcher->dispatch(MapperEvent::EVENT_UNASSIGN, new MapperEvent( MapperEvent::EVENT_UNASSIGN, $objectType, @@ -198,6 +202,21 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { } /** + * Update the etag for the given tags. + * + * @param int[] $tagIds + */ + private function updateEtagForTags(array $tagIds): void { + // Update etag after assigning tags + $md5 = md5(json_encode(time())); + $query = $this->connection->getQueryBuilder(); + $query->update('systemtag') + ->set('etag', $query->createNamedParameter($md5)) + ->where($query->expr()->in('id', $query->createNamedParameter($tagIds, IQueryBuilder::PARAM_INT_ARRAY))); + $query->execute(); + } + + /** * {@inheritdoc} */ public function haveTag($objIds, string $objectType, string $tagId, bool $all = true): bool { @@ -261,6 +280,43 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { } } + /** + * {@inheritdoc} + */ + public function setObjectIdsForTag(string $tagId, string $objectType, array $objectIds): void { + $this->connection->beginTransaction(); + $query = $this->connection->getQueryBuilder(); + $query->delete(self::RELATION_TABLE) + ->where($query->expr()->eq('systemtagid', $query->createNamedParameter($tagId, IQueryBuilder::PARAM_INT))) + ->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType))) + ->executeStatement(); + $this->connection->commit(); + + if (empty($objectIds)) { + return; + } + + $this->connection->beginTransaction(); + $query = $this->connection->getQueryBuilder(); + $query->insert(self::RELATION_TABLE) + ->values([ + 'systemtagid' => $query->createNamedParameter($tagId, IQueryBuilder::PARAM_INT), + 'objecttype' => $query->createNamedParameter($objectType), + 'objectid' => $query->createParameter('objectid'), + ]); + + foreach (array_unique($objectIds) as $objectId) { + $query->setParameter('objectid', (string)$objectId); + $query->executeStatement(); + } + + $this->updateEtagForTags([$tagId]); + $this->connection->commit(); + } + + /** + * {@inheritdoc} + */ public function getAvailableObjectTypes(): array { $query = $this->connection->getQueryBuilder(); $query->selectDistinct('objecttype') |