From a7c0868a4cc7a0f041484800ad56901f11086459 Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Sun, 9 Jan 2022 19:10:20 -0300 Subject: [PATCH] Prevent violate constraint Signed-off-by: Vitor Mattos --- lib/private/Comments/Manager.php | 37 ++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php index 599c4e106d7..382ffbb9028 100644 --- a/lib/private/Comments/Manager.php +++ b/lib/private/Comments/Manager.php @@ -1123,16 +1123,35 @@ class Manager implements ICommentsManager { } private function addReaction(IComment $reaction): void { + // Prevent violate constraint $qb = $this->dbConn->getQueryBuilder(); - $qb->insert('reactions') - ->values([ - 'parent_id' => $qb->createNamedParameter($reaction->getParentId()), - 'message_id' => $qb->createNamedParameter($reaction->getId()), - 'actor_type' => $qb->createNamedParameter($reaction->getActorType()), - 'actor_id' => $qb->createNamedParameter($reaction->getActorId()), - 'reaction' => $qb->createNamedParameter($reaction->getMessage()), - ]) - ->executeStatement(); + $qb->select($qb->func()->count('*')) + ->from('reactions') + ->where($qb->expr()->eq('parent_id', $qb->createNamedParameter($reaction->getParentId()))) + ->andWhere($qb->expr()->eq('actor_type', $qb->createNamedParameter($reaction->getActorType()))) + ->andWhere($qb->expr()->eq('actor_id', $qb->createNamedParameter($reaction->getActorId()))) + ->andWhere($qb->expr()->eq('reaction', $qb->createNamedParameter($reaction->getMessage()))); + $result = $qb->executeQuery(); + $exists = (int) $result->fetchOne(); + if (!$exists) { + $qb = $this->dbConn->getQueryBuilder(); + try { + $qb->insert('reactions') + ->values([ + 'parent_id' => $qb->createNamedParameter($reaction->getParentId()), + 'message_id' => $qb->createNamedParameter($reaction->getId()), + 'actor_type' => $qb->createNamedParameter($reaction->getActorType()), + 'actor_id' => $qb->createNamedParameter($reaction->getActorId()), + 'reaction' => $qb->createNamedParameter($reaction->getMessage()), + ]) + ->executeStatement(); + } catch (\Exception $e) { + $this->logger->error($e->getMessage(), [ + 'exception' => $e, + 'app' => 'core_comments', + ]); + } + } $this->sumReactions($reaction->getParentId()); }