Merge pull request #45994 from nextcloud/backport/45580/stable28

[stable28] fix: avoid duplicate tag inserts by checking if the mapping exists already in db
This commit is contained in:
Louis 2024-06-27 14:16:06 +02:00 committed by GitHub
commit bdbf00cd8d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -133,6 +133,27 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
}
$this->assertTagsExist($tagIds);
$this->connection->beginTransaction();
$query = $this->connection->getQueryBuilder();
$query->select('systemtagid')
->from(self::RELATION_TABLE)
->where($query->expr()->in('systemtagid', $query->createNamedParameter($tagIds, IQueryBuilder::PARAM_INT_ARRAY)))
->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType)))
->andWhere($query->expr()->eq('objectid', $query->createNamedParameter($objId)));
$result = $query->executeQuery();
$rows = $result->fetchAll();
$existingTags = [];
foreach ($rows as $row) {
$existingTags[] = $row['systemtagid'];
}
//filter only tags that do not exist in db
$tagIds = array_diff($tagIds, $existingTags);
if (empty($tagIds)) {
// no tags to insert so return here
$this->connection->commit();
return;
}
$query = $this->connection->getQueryBuilder();
$query->insert(self::RELATION_TABLE)
@ -153,6 +174,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
}
}
$this->connection->commit();
if (empty($tagsAssigned)) {
return;
}