From 198224bf7a18903fb9e55d621604befa788f542c Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 1 Jul 2022 15:53:37 +0200 Subject: [PATCH] Allow to expire comments of multiple objects with one call Signed-off-by: Joas Schilling --- lib/private/Comments/Manager.php | 14 +++++--- lib/public/Comments/ICommentsManager.php | 4 +-- tests/lib/Comments/ManagerTest.php | 43 ++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php index f21f9ec76b2..50b5fabc6a2 100644 --- a/lib/private/Comments/Manager.php +++ b/lib/private/Comments/Manager.php @@ -1650,14 +1650,18 @@ class Manager implements ICommentsManager { /** * @inheritDoc */ - public function deleteMessageExpiredAtObject(string $objectType, string $objectId): bool { + public function deleteCommentsExpiredAtObject(string $objectType, string $objectId = ''): bool { $qb = $this->dbConn->getQueryBuilder(); - $affectedRows = $qb->delete('comments') + $qb->delete('comments') ->where($qb->expr()->lt('expire_date', $qb->createNamedParameter($this->timeFactory->getDateTime(), IQueryBuilder::PARAM_DATE))) - ->andWhere($qb->expr()->eq('object_type', $qb->createNamedParameter($objectType))) - ->andWhere($qb->expr()->eq('object_id', $qb->createNamedParameter($objectId))) - ->executeStatement(); + ->andWhere($qb->expr()->eq('object_type', $qb->createNamedParameter($objectType))); + + if ($objectId !== '') { + $qb->andWhere($qb->expr()->eq('object_id', $qb->createNamedParameter($objectId))); + } + + $affectedRows = $qb->executeStatement(); $this->commentsCache = []; diff --git a/lib/public/Comments/ICommentsManager.php b/lib/public/Comments/ICommentsManager.php index 814ca3e8f9c..da9e4d76a38 100644 --- a/lib/public/Comments/ICommentsManager.php +++ b/lib/public/Comments/ICommentsManager.php @@ -488,9 +488,9 @@ interface ICommentsManager { * Only will delete the message related with the object. * * @param string $objectType the object type (e.g. 'files') - * @param string $objectId e.g. the file id + * @param string $objectId e.g. the file id, leave empty to expire on all objects of this type * @return boolean true if at least one row was deleted * @since 25.0.0 */ - public function deleteMessageExpiredAtObject(string $objectType, string $objectId): bool; + public function deleteCommentsExpiredAtObject(string $objectType, string $objectId = ''): bool; } diff --git a/tests/lib/Comments/ManagerTest.php b/tests/lib/Comments/ManagerTest.php index 7c6971476c7..ae91efb8498 100644 --- a/tests/lib/Comments/ManagerTest.php +++ b/tests/lib/Comments/ManagerTest.php @@ -703,7 +703,7 @@ class ManagerTest extends TestCase { $this->assertTrue($wasSuccessful); } - public function testDeleteMessageExpiredAtObject(): void { + public function testDeleteCommentsExpiredAtObjectTypeAndId(): void { $ids = []; $ids[] = $this->addDatabaseEntry(0, 0, null, null, null, new \DateTime('+2 hours')); $ids[] = $this->addDatabaseEntry(0, 0, null, null, null, new \DateTime('+2 hours')); @@ -726,7 +726,7 @@ class ManagerTest extends TestCase { $this->assertSame($comment->getObjectType(), 'files'); $this->assertSame($comment->getObjectId(), 'file64'); - $deleted = $manager->deleteMessageExpiredAtObject('files', 'file64'); + $deleted = $manager->deleteCommentsExpiredAtObject('files', 'file64'); $this->assertTrue($deleted); $deleted = 0; @@ -744,7 +744,44 @@ class ManagerTest extends TestCase { // actor info is gone from DB, but when database interaction is alright, // we still expect to get true back - $deleted = $manager->deleteMessageExpiredAtObject('files', 'file64'); + $deleted = $manager->deleteCommentsExpiredAtObject('files', 'file64'); + $this->assertFalse($deleted); + } + + public function testDeleteCommentsExpiredAtObjectType(): void { + $ids = []; + $ids[] = $this->addDatabaseEntry(0, 0, null, null, 'file1', new \DateTime('-2 hours')); + $ids[] = $this->addDatabaseEntry(0, 0, null, null, 'file2', new \DateTime('-2 hours')); + $ids[] = $this->addDatabaseEntry(0, 0, null, null, 'file3', new \DateTime('-2 hours')); + + $manager = new Manager( + $this->connection, + $this->createMock(LoggerInterface::class), + $this->createMock(IConfig::class), + Server::get(ITimeFactory::class), + new EmojiHelper($this->connection), + $this->createMock(IInitialStateService::class) + ); + + $deleted = $manager->deleteCommentsExpiredAtObject('files'); + $this->assertTrue($deleted); + + $deleted = 0; + $exists = 0; + foreach ($ids as $id) { + try { + $manager->get((string) $id); + $exists++; + } catch (NotFoundException $e) { + $deleted++; + } + } + $this->assertSame($exists, 0); + $this->assertSame($deleted, 3); + + // actor info is gone from DB, but when database interaction is alright, + // we still expect to get true back + $deleted = $manager->deleteCommentsExpiredAtObject('files'); $this->assertFalse($deleted); } -- 2.39.5