aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/SystemTag
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/SystemTag')
-rw-r--r--lib/private/SystemTag/SystemTagManager.php21
-rw-r--r--lib/private/SystemTag/SystemTagObjectMapper.php13
2 files changed, 32 insertions, 2 deletions
diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php
index e889ceff54e..4b421fa033a 100644
--- a/lib/private/SystemTag/SystemTagManager.php
+++ b/lib/private/SystemTag/SystemTagManager.php
@@ -108,7 +108,7 @@ class SystemTagManager implements ISystemTagManager {
if (!empty($nameSearchPattern)) {
$query->andWhere(
- $query->expr()->like(
+ $query->expr()->iLike(
'name',
$query->createNamedParameter('%' . $this->connection->escapeLikeParameter($nameSearchPattern) . '%')
)
@@ -120,7 +120,7 @@ class SystemTagManager implements ISystemTagManager {
->addOrderBy('visibility', 'ASC')
->addOrderBy('editable', 'ASC');
- $result = $query->execute();
+ $result = $query->executeQuery();
while ($row = $result->fetch()) {
$tags[$row['id']] = $this->createSystemTagFromRow($row);
}
@@ -156,6 +156,14 @@ class SystemTagManager implements ISystemTagManager {
throw new TagCreationForbiddenException();
}
+ // Check if tag already exists (case-insensitive)
+ $existingTags = $this->getAllTags(null, $tagName);
+ foreach ($existingTags as $existingTag) {
+ if (mb_strtolower($existingTag->getName()) === mb_strtolower($tagName)) {
+ throw new TagAlreadyExistsException('Tag ' . $tagName . ' already exists');
+ }
+ }
+
// Length of name column is 64
$truncatedTagName = substr($tagName, 0, 64);
$query = $this->connection->getQueryBuilder();
@@ -226,6 +234,15 @@ class SystemTagManager implements ISystemTagManager {
$color
);
+ // Check if tag already exists (case-insensitive)
+ $existingTags = $this->getAllTags(null, $truncatedNewName);
+ foreach ($existingTags as $existingTag) {
+ if (mb_strtolower($existingTag->getName()) === mb_strtolower($truncatedNewName)
+ && $existingTag->getId() !== $tagId) {
+ throw new TagAlreadyExistsException('Tag ' . $truncatedNewName . ' already exists');
+ }
+ }
+
$query = $this->connection->getQueryBuilder();
$query->update(self::TAG_TABLE)
->set('name', $query->createParameter('name'))
diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php
index 3881336bf37..1fa5975dafb 100644
--- a/lib/private/SystemTag/SystemTagObjectMapper.php
+++ b/lib/private/SystemTag/SystemTagObjectMapper.php
@@ -287,6 +287,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
$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)
@@ -324,6 +325,8 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
$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,
@@ -332,6 +335,16 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper {
[(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]
+ ));
+ }
}
/**