From 7c22020316c512715ab22da9eb9bba69fb61cb8a Mon Sep 17 00:00:00 2001 From: Luka Trovic Date: Wed, 28 May 2025 11:52:02 +0200 Subject: [PATCH] fix: update DeleteCron to remove deleted lists Signed-off-by: Luka Trovic --- lib/Cron/DeleteCron.php | 11 ++++++++++- lib/Db/StackMapper.php | 11 +++++++++++ tests/unit/Cron/DeleteCronTest.php | 28 +++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/lib/Cron/DeleteCron.php b/lib/Cron/DeleteCron.php index e7776d9d1..97854181f 100644 --- a/lib/Cron/DeleteCron.php +++ b/lib/Cron/DeleteCron.php @@ -10,6 +10,7 @@ namespace OCA\Deck\Cron; use OCA\Deck\Db\AttachmentMapper; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\CardMapper; +use OCA\Deck\Db\StackMapper; use OCA\Deck\InvalidAttachmentType; use OCA\Deck\Service\AttachmentService; use OCP\AppFramework\Utility\ITimeFactory; @@ -26,13 +27,16 @@ class DeleteCron extends TimedJob { private $attachmentService; /** @var AttachmentMapper */ private $attachmentMapper; + /** @var StackMapper */ + private $stackMapper; - public function __construct(ITimeFactory $time, BoardMapper $boardMapper, CardMapper $cardMapper, AttachmentService $attachmentService, AttachmentMapper $attachmentMapper) { + public function __construct(ITimeFactory $time, BoardMapper $boardMapper, CardMapper $cardMapper, AttachmentService $attachmentService, AttachmentMapper $attachmentMapper, StackMapper $stackMapper) { parent::__construct($time); $this->boardMapper = $boardMapper; $this->cardMapper = $cardMapper; $this->attachmentService = $attachmentService; $this->attachmentMapper = $attachmentMapper; + $this->stackMapper = $stackMapper; $this->setInterval(60 * 60 * 24); $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); @@ -64,5 +68,10 @@ class DeleteCron extends TimedJob { } $this->attachmentMapper->delete($attachment); } + + $stacks = $this->stackMapper->findToDelete(); + foreach ($stacks as $stack) { + $this->stackMapper->delete($stack); + } } } diff --git a/lib/Db/StackMapper.php b/lib/Db/StackMapper.php index 79d782190..1c4792336 100644 --- a/lib/Db/StackMapper.php +++ b/lib/Db/StackMapper.php @@ -163,4 +163,15 @@ class StackMapper extends DeckMapper implements IPermissionMapper { return $result !== false ? $result : null; } + + public function findToDelete(): array { + // add buffer of 5 min + $timeLimit = time() - (60 * 5); + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from($this->getTableName()) + ->where($qb->expr()->neq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->lt('deleted_at', $qb->createNamedParameter($timeLimit, IQueryBuilder::PARAM_INT))); + return $this->findEntities($qb); + } } diff --git a/tests/unit/Cron/DeleteCronTest.php b/tests/unit/Cron/DeleteCronTest.php index 88d73b8ab..1ed5f4472 100644 --- a/tests/unit/Cron/DeleteCronTest.php +++ b/tests/unit/Cron/DeleteCronTest.php @@ -29,6 +29,8 @@ use OCA\Deck\Db\Board; use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\Card; use OCA\Deck\Db\CardMapper; +use OCA\Deck\Db\Stack; +use OCA\Deck\Db\StackMapper; use OCA\Deck\InvalidAttachmentType; use OCA\Deck\Service\AttachmentService; use OCA\Deck\Service\IAttachmentService; @@ -48,6 +50,8 @@ class DeleteCronTest extends TestCase { private $attachmentService; /** @var AttachmentMapper|MockObject */ private $attachmentMapper; + /** @var StackMapper|MockObject */ + private $stackMapper; /** @var DeleteCron */ protected $deleteCron; @@ -58,7 +62,8 @@ class DeleteCronTest extends TestCase { $this->cardMapper = $this->createMock(CardMapper::class); $this->attachmentService = $this->createMock(AttachmentService::class); $this->attachmentMapper = $this->createMock(AttachmentMapper::class); - $this->deleteCron = new DeleteCron($this->timeFactory, $this->boardMapper, $this->cardMapper, $this->attachmentService, $this->attachmentMapper); + $this->stackMapper = $this->createMock(StackMapper::class); + $this->deleteCron = new DeleteCron($this->timeFactory, $this->boardMapper, $this->cardMapper, $this->attachmentService, $this->attachmentMapper, $this->stackMapper); } protected function getBoard($id) { @@ -73,6 +78,12 @@ class DeleteCronTest extends TestCase { return $card; } + protected function getStack($id) { + $stack = new Stack(); + $stack->setId($id); + return $stack; + } + public function testDeleteCron() { $boards = [ $this->getBoard(1), @@ -117,6 +128,21 @@ class DeleteCronTest extends TestCase { $this->attachmentMapper->expects($this->once()) ->method('delete') ->with($attachment); + + $stacks = [ + $this->getStack(100), + $this->getStack(101), + ]; + $this->stackMapper->expects($this->once()) + ->method('findToDelete') + ->willReturn($stacks); + $this->stackMapper->expects($this->exactly(count($stacks))) + ->method('delete') + ->withConsecutive( + [$stacks[0]], + [$stacks[1]] + ); + $this->invokePrivate($this->deleteCron, 'run', [null]); }