aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/SystemTag/SystemTagObjectMapper.php
diff options
context:
space:
mode:
authorskjnldsv <skjnldsv@protonmail.com>2024-10-22 15:56:03 +0200
committerskjnldsv <skjnldsv@protonmail.com>2024-10-29 09:08:31 +0100
commit14e2a8d3f982656e2a7c23c006fd59fdeebc80bd (patch)
tree216f9b391e4815daed88dbbf475252ad89fc42ae /lib/private/SystemTag/SystemTagObjectMapper.php
parentf24b93e5067e54244d14eb08ad8ed8330a03724b (diff)
downloadnextcloud-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.php56
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')