diff options
author | Christopher Ng <chrng8@gmail.com> | 2025-01-24 14:27:53 -0800 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2025-02-20 14:13:09 -0800 |
commit | c69cf92759a93e68a0d9b1ee63e5fde9a3e79dab (patch) | |
tree | 8c66b5a6f50dad12010af63ecb0afcdc497f738e | |
parent | e178e3f90211d93d6c296f32d2e4b2fe105eb98c (diff) | |
download | nextcloud-server-c69cf92759a93e68a0d9b1ee63e5fde9a3e79dab.tar.gz nextcloud-server-c69cf92759a93e68a0d9b1ee63e5fde9a3e79dab.zip |
perf(files_reminders): Pre-cache directory
Signed-off-by: Christopher Ng <chrng8@gmail.com>
-rw-r--r-- | apps/files_reminders/lib/Dav/PropFindPlugin.php | 19 | ||||
-rw-r--r-- | apps/files_reminders/lib/Db/ReminderMapper.php | 27 | ||||
-rw-r--r-- | apps/files_reminders/lib/Service/ReminderService.php | 15 |
3 files changed, 61 insertions, 0 deletions
diff --git a/apps/files_reminders/lib/Dav/PropFindPlugin.php b/apps/files_reminders/lib/Dav/PropFindPlugin.php index 1d0f32c164f..0f3b53c4861 100644 --- a/apps/files_reminders/lib/Dav/PropFindPlugin.php +++ b/apps/files_reminders/lib/Dav/PropFindPlugin.php @@ -10,8 +10,10 @@ declare(strict_types=1); namespace OCA\FilesReminders\Dav; use DateTimeInterface; +use OCA\DAV\Connector\Sabre\Directory; use OCA\DAV\Connector\Sabre\Node; use OCA\FilesReminders\Service\ReminderService; +use OCP\Files\Folder; use OCP\IUser; use OCP\IUserSession; use Sabre\DAV\INode; @@ -42,6 +44,15 @@ class PropFindPlugin extends ServerPlugin { return; } + if ( + $node instanceof Directory + && $propFind->getDepth() > 0 + && $propFind->getStatus(static::REMINDER_DUE_DATE_PROPERTY) !== null + ) { + $folder = $node->getNode(); + $this->cacheFolder($folder); + } + $propFind->handle( static::REMINDER_DUE_DATE_PROPERTY, function () use ($node) { @@ -60,4 +71,12 @@ class PropFindPlugin extends ServerPlugin { }, ); } + + private function cacheFolder(Folder $folder): void { + $user = $this->userSession->getUser(); + if (!($user instanceof IUser)) { + return; + } + $this->reminderService->cacheFolder($user, $folder); + } } diff --git a/apps/files_reminders/lib/Db/ReminderMapper.php b/apps/files_reminders/lib/Db/ReminderMapper.php index 92c668bacaf..0ba5cfc3ecd 100644 --- a/apps/files_reminders/lib/Db/ReminderMapper.php +++ b/apps/files_reminders/lib/Db/ReminderMapper.php @@ -13,6 +13,7 @@ use DateTime; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\Files\Folder; use OCP\Files\Node; use OCP\Files\NotFoundException; use OCP\IDBConnection; @@ -131,4 +132,30 @@ class ReminderMapper extends QBMapper { return $this->findEntities($qb); } + + /** + * @return Reminder[] + */ + public function findAllInFolder(IUser $user, Folder $folder) { + $fileIds = array_values(array_filter(array_map( + function (Node $node) { + try { + return $node->getId(); + } catch (NotFoundException $e) { + return null; + } + }, + $folder->getDirectoryListing(), + ))); + + $qb = $this->db->getQueryBuilder(); + + $qb->select('id', 'user_id', 'file_id', 'due_date', 'updated_at', 'created_at', 'notified') + ->from($this->getTableName()) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user->getUID(), IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->orderBy('due_date', 'ASC'); + + return $this->findEntities($qb); + } } diff --git a/apps/files_reminders/lib/Service/ReminderService.php b/apps/files_reminders/lib/Service/ReminderService.php index aaf0c11d3f3..1d6c644e2ce 100644 --- a/apps/files_reminders/lib/Service/ReminderService.php +++ b/apps/files_reminders/lib/Service/ReminderService.php @@ -19,6 +19,7 @@ use OCA\FilesReminders\Exception\ReminderNotFoundException; use OCA\FilesReminders\Exception\UserNotFoundException; use OCA\FilesReminders\Model\RichReminder; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Node; use OCP\ICache; @@ -46,6 +47,20 @@ class ReminderService { $this->cache = $this->cacheFactory->createDistributed('files_reminders'); } + public function cacheFolder(IUser $user, Folder $folder): void { + $reminders = $this->reminderMapper->findAllInFolder($user, $folder); + $reminderMap = []; + foreach ($reminders as $reminder) { + $reminderMap[$reminder->getFileId()] = $reminder; + } + + $nodes = $folder->getDirectoryListing(); + foreach ($nodes as $node) { + $reminder = $reminderMap[$node->getId()] ?? false; + $this->cache->set("{$user->getUID()}-{$node->getId()}", $reminder); + } + } + /** * @throws NodeNotFoundException */ |