diff --git a/lib/Cron/DeleteCron.php b/lib/Cron/DeleteCron.php index 51c9ec469..e9991def8 100644 --- a/lib/Cron/DeleteCron.php +++ b/lib/Cron/DeleteCron.php @@ -11,6 +11,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; @@ -27,13 +28,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); @@ -65,5 +69,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 50c34d07c..5e4a43842 100644 --- a/lib/Db/StackMapper.php +++ b/lib/Db/StackMapper.php @@ -164,4 +164,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 e077a77f9..fe1037031 100644 --- a/tests/unit/Cron/DeleteCronTest.php +++ b/tests/unit/Cron/DeleteCronTest.php @@ -30,6 +30,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; @@ -49,6 +51,8 @@ class DeleteCronTest extends TestCase { private $attachmentService; /** @var AttachmentMapper|MockObject */ private $attachmentMapper; + /** @var StackMapper|MockObject */ + private $stackMapper; /** @var DeleteCron */ protected $deleteCron; @@ -59,7 +63,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) { @@ -74,6 +79,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), @@ -118,6 +129,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]); }