Skip to content

Commit eb5832b

Browse files
committed
refactor: depricate getNumberOfUnreadCommentsForFolder and redo it's implementation based on getNumberOfUnreadCommentsForObjects
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent be3449c commit eb5832b

3 files changed

Lines changed: 52 additions & 81 deletions

File tree

lib/private/Comments/Manager.php

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,17 @@
2929
namespace OC\Comments;
3030

3131
use Doctrine\DBAL\Exception\DriverException;
32+
use OCA\DAV\Connector\Sabre\File;
3233
use OCP\AppFramework\Utility\ITimeFactory;
3334
use OCP\Comments\CommentsEvent;
3435
use OCP\Comments\IComment;
3536
use OCP\Comments\ICommentsEventHandler;
3637
use OCP\Comments\ICommentsManager;
3738
use OCP\Comments\NotFoundException;
3839
use OCP\DB\QueryBuilder\IQueryBuilder;
40+
use OCP\Files\FileInfo;
41+
use OCP\Files\Folder;
42+
use OCP\Files\IRootFolder;
3943
use OCP\IConfig;
4044
use OCP\IDBConnection;
4145
use OCP\IEmojiHelper;
@@ -46,12 +50,6 @@
4650
use Psr\Log\LoggerInterface;
4751

4852
class Manager implements ICommentsManager {
49-
protected IDBConnection $dbConn;
50-
protected LoggerInterface $logger;
51-
protected IConfig $config;
52-
protected ITimeFactory $timeFactory;
53-
protected IEmojiHelper $emojiHelper;
54-
protected IInitialStateService $initialStateService;
5553
/** @var IComment[] */
5654
protected array $commentsCache = [];
5755

@@ -64,18 +62,15 @@ class Manager implements ICommentsManager {
6462
/** @var \Closure[] */
6563
protected array $displayNameResolvers = [];
6664

67-
public function __construct(IDBConnection $dbConn,
68-
LoggerInterface $logger,
69-
IConfig $config,
70-
ITimeFactory $timeFactory,
71-
IEmojiHelper $emojiHelper,
72-
IInitialStateService $initialStateService) {
73-
$this->dbConn = $dbConn;
74-
$this->logger = $logger;
75-
$this->config = $config;
76-
$this->timeFactory = $timeFactory;
77-
$this->emojiHelper = $emojiHelper;
78-
$this->initialStateService = $initialStateService;
65+
public function __construct(
66+
protected IDBConnection $dbConn,
67+
protected LoggerInterface $logger,
68+
protected IConfig $config,
69+
protected ITimeFactory $timeFactory,
70+
protected IEmojiHelper $emojiHelper,
71+
protected IInitialStateService $initialStateService,
72+
protected IRootFolder $rootFolder,
73+
) {
7974
}
8075

8176
/**
@@ -820,54 +815,25 @@ public function getLastCommentDateByActor(
820815
/**
821816
* Get the number of unread comments for all files in a folder
822817
*
818+
* This is unused since 8bd39fccf411195839f2dadee085fad18ec52c23
819+
*
823820
* @param int $folderId
824821
* @param IUser $user
825822
* @return array [$fileId => $unreadCount]
826823
*/
827824
public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user) {
828-
$qb = $this->dbConn->getQueryBuilder();
829-
830-
$query = $qb->select('f.fileid')
831-
->addSelect($qb->func()->count('c.id', 'num_ids'))
832-
->from('filecache', 'f')
833-
->leftJoin('f', 'comments', 'c', $qb->expr()->andX(
834-
$qb->expr()->eq('f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT)),
835-
$qb->expr()->eq('c.object_type', $qb->createNamedParameter('files'))
836-
))
837-
->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->andX(
838-
$qb->expr()->eq('c.object_id', 'm.object_id'),
839-
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files'))
840-
))
841-
->where(
842-
$qb->expr()->andX(
843-
$qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)),
844-
$qb->expr()->orX(
845-
$qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
846-
$qb->expr()->isNull('c.object_type')
847-
),
848-
$qb->expr()->orX(
849-
$qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
850-
$qb->expr()->isNull('m.object_type')
851-
),
852-
$qb->expr()->orX(
853-
$qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID())),
854-
$qb->expr()->isNull('m.user_id')
855-
),
856-
$qb->expr()->orX(
857-
$qb->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
858-
$qb->expr()->isNull('m.marker_datetime')
859-
)
860-
)
861-
)->groupBy('f.fileid');
862-
863-
$resultStatement = $query->execute();
864-
865-
$results = [];
866-
while ($row = $resultStatement->fetch()) {
867-
$results[$row['fileid']] = (int) $row['num_ids'];
825+
$directory = $this->rootFolder->getFirstNodeById($folderId);
826+
if (!$directory instanceof Folder) {
827+
return [];
868828
}
869-
$resultStatement->closeCursor();
870-
return $results;
829+
$children = $directory->getDirectoryListing();
830+
$ids = array_map(fn (FileInfo $child) => (string) $child->getId(), $children);
831+
832+
$ids[] = (string) $directory->getId();
833+
$counts = $this->getNumberOfUnreadCommentsForObjects('files', $ids, $user);
834+
return array_filter($counts, function (int $count) {
835+
return $count > 0;
836+
});
871837
}
872838

873839
/**

lib/public/Comments/ICommentsManager.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ public function getLastCommentDateByActor(
271271
* @param IUser $user
272272
* @return array [$fileId => $unreadCount]
273273
* @since 12.0.0
274+
* @deprecated 29.0.0 use getNumberOfUnreadCommentsForObjects instead
274275
*/
275276
public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user);
276277

tests/lib/Comments/ManagerTest.php

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use OCP\Comments\ICommentsEventHandler;
1111
use OCP\Comments\ICommentsManager;
1212
use OCP\Comments\NotFoundException;
13+
use OCP\Files\Folder;
14+
use OCP\Files\IRootFolder;
1315
use OCP\IConfig;
1416
use OCP\IDBConnection;
1517
use OCP\IInitialStateService;
@@ -26,11 +28,14 @@
2628
class ManagerTest extends TestCase {
2729
/** @var IDBConnection */
2830
private $connection;
31+
/** @var \PHPUnit\Framework\MockObject\MockObject|IRootFolder */
32+
private $rootFolder;
2933

3034
protected function setUp(): void {
3135
parent::setUp();
3236

3337
$this->connection = \OC::$server->getDatabaseConnection();
38+
$this->rootFolder = $this->createMock(IRootFolder::class);
3439

3540
$sql = $this->connection->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`');
3641
$this->connection->prepare($sql)->execute();
@@ -80,7 +85,8 @@ protected function getManager() {
8085
$this->createMock(IConfig::class),
8186
$this->createMock(ITimeFactory::class),
8287
new EmojiHelper($this->connection),
83-
$this->createMock(IInitialStateService::class)
88+
$this->createMock(IInitialStateService::class),
89+
$this->rootFolder,
8490
);
8591
}
8692

@@ -329,23 +335,19 @@ public function testGetNumberOfCommentsForObject() {
329335
}
330336

331337
public function testGetNumberOfUnreadCommentsForFolder() {
332-
$query = $this->connection->getQueryBuilder();
333-
$query->insert('filecache')
334-
->values([
335-
'parent' => $query->createNamedParameter(1000),
336-
'size' => $query->createNamedParameter(10),
337-
'mtime' => $query->createNamedParameter(10),
338-
'storage_mtime' => $query->createNamedParameter(10),
339-
'path' => $query->createParameter('path'),
340-
'path_hash' => $query->createParameter('path'),
341-
]);
342-
343-
$fileIds = [];
344-
for ($i = 0; $i < 4; $i++) {
345-
$query->setParameter('path', 'path_' . $i);
346-
$query->execute();
347-
$fileIds[] = $query->getLastInsertId();
348-
}
338+
$folder = $this->createMock(Folder::class);
339+
$fileIds = range(1111, 1114);
340+
$children = array_map(function (int $id) {
341+
$file = $this->createMock(Folder::class);
342+
$file->method('getId')
343+
->willReturn($id);
344+
return $file;
345+
}, $fileIds);
346+
$folder->method('getId')->willReturn(1000);
347+
$folder->method('getDirectoryListing')->willReturn($children);
348+
$this->rootFolder->method('getFirstNodeById')
349+
->with($folder->getId())
350+
->willReturn($folder);
349351

350352
// 2 comment for 1111 with 1 before read marker
351353
// 2 comments for 1112 with no read marker
@@ -367,7 +369,7 @@ public function testGetNumberOfUnreadCommentsForFolder() {
367369
$manager->setReadMark('files', (string) $fileIds[0], (new \DateTime())->modify('-1 days'), $user);
368370
$manager->setReadMark('files', (string) $fileIds[2], (new \DateTime()), $user);
369371

370-
$amount = $manager->getNumberOfUnreadCommentsForFolder(1000, $user);
372+
$amount = $manager->getNumberOfUnreadCommentsForFolder($folder->getId(), $user);
371373
$this->assertEquals([
372374
$fileIds[0] => 1,
373375
$fileIds[1] => 2,
@@ -750,7 +752,8 @@ public function testDeleteCommentsExpiredAtObjectTypeAndId(): void {
750752
$this->createMock(IConfig::class),
751753
Server::get(ITimeFactory::class),
752754
new EmojiHelper($this->connection),
753-
$this->createMock(IInitialStateService::class)
755+
$this->createMock(IInitialStateService::class),
756+
$this->rootFolder,
754757
);
755758

756759
// just to make sure they are really set, with correct actor data
@@ -795,7 +798,8 @@ public function testDeleteCommentsExpiredAtObjectType(): void {
795798
$this->createMock(IConfig::class),
796799
Server::get(ITimeFactory::class),
797800
new EmojiHelper($this->connection),
798-
$this->createMock(IInitialStateService::class)
801+
$this->createMock(IInitialStateService::class),
802+
$this->rootFolder,
799803
);
800804

801805
$deleted = $manager->deleteCommentsExpiredAtObject('files');

0 commit comments

Comments
 (0)