aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/SystemTag/SystemTagObjectMapper.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/SystemTag/SystemTagObjectMapper.php')
-rw-r--r--lib/private/SystemTag/SystemTagObjectMapper.php112
1 files changed, 108 insertions, 4 deletions
diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php
index 10117eebeaa..1fa5975dafb 100644
--- a/lib/private/SystemTag/SystemTagObjectMapper.php
+++ b/lib/private/SystemTag/SystemTagObjectMapper.php
@@ -97,7 +97,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
$objectIds = [];
- $result = $query->execute();
+ $result = $query->executeQuery();
while ($row = $result->fetch()) {
$objectIds[] = $row['objectid'];
}
@@ -156,6 +156,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
}
}
+ $this->updateEtagForTags($tagIds);
+
$this->connection->commit();
if (empty($tagsAssigned)) {
return;
@@ -187,7 +189,9 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
->setParameter('objectid', $objId)
->setParameter('objecttype', $objectType)
->setParameter('tagids', $tagIds, IQueryBuilder::PARAM_INT_ARRAY)
- ->execute();
+ ->executeStatement();
+
+ $this->updateEtagForTags($tagIds);
$this->dispatcher->dispatch(MapperEvent::EVENT_UNASSIGN, new MapperEvent(
MapperEvent::EVENT_UNASSIGN,
@@ -198,6 +202,21 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
}
/**
+ * Update the etag for the given tags.
+ *
+ * @param string[] $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 {
@@ -226,7 +245,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
->setParameter('tagid', $tagId)
->setParameter('objecttype', $objectType);
- $result = $query->execute();
+ $result = $query->executeQuery();
$row = $result->fetch(\PDO::FETCH_NUM);
$result->closeCursor();
@@ -234,7 +253,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
return ((int)$row[0] === \count($objIds));
}
- return (bool) $row;
+ return (bool)$row;
}
/**
@@ -260,4 +279,89 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
);
}
}
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setObjectIdsForTag(string $tagId, string $objectType, array $objectIds): void {
+ $currentObjectIds = $this->getObjectIdsForTags($tagId, $objectType);
+ $removedObjectIds = array_diff($currentObjectIds, $objectIds);
+ $addedObjectIds = array_diff($objectIds, $currentObjectIds);
+
+ $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();
+
+ foreach ($removedObjectIds as $objectId) {
+ $this->dispatcher->dispatch(MapperEvent::EVENT_UNASSIGN, new MapperEvent(
+ MapperEvent::EVENT_UNASSIGN,
+ $objectType,
+ (string)$objectId,
+ [(int)$tagId]
+ ));
+ }
+
+ 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();
+
+ // Dispatch assign events for new object ids
+ foreach ($addedObjectIds as $objectId) {
+ $this->dispatcher->dispatch(MapperEvent::EVENT_ASSIGN, new MapperEvent(
+ MapperEvent::EVENT_ASSIGN,
+ $objectType,
+ (string)$objectId,
+ [(int)$tagId]
+ ));
+ }
+
+ // Dispatch unassign events for removed object ids
+ foreach ($removedObjectIds as $objectId) {
+ $this->dispatcher->dispatch(MapperEvent::EVENT_UNASSIGN, new MapperEvent(
+ MapperEvent::EVENT_UNASSIGN,
+ $objectType,
+ (string)$objectId,
+ [(int)$tagId]
+ ));
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAvailableObjectTypes(): array {
+ $query = $this->connection->getQueryBuilder();
+ $query->selectDistinct('objecttype')
+ ->from(self::RELATION_TABLE);
+
+ $result = $query->executeQuery();
+ $objectTypes = [];
+ while ($row = $result->fetch()) {
+ $objectTypes[] = $row['objecttype'];
+ }
+ $result->closeCursor();
+
+ return $objectTypes;
+ }
}