Allow to expire comments of multiple objects with one call

Signed-off-by: Joas Schilling <coding@schilljs.com>
pull/33086/head
Joas Schilling 4 years ago
parent 6222b702db
commit 198224bf7a
No known key found for this signature in database
GPG Key ID: 7076EA9751AACDDA
  1. 14
      lib/private/Comments/Manager.php
  2. 4
      lib/public/Comments/ICommentsManager.php
  3. 43
      tests/lib/Comments/ManagerTest.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 = [];

@ -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;
}

@ -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);
}

Loading…
Cancel
Save