f7cloud_client/apps/spreed/lib/Share/Helper/Preloader.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

57 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2022 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Talk\Share\Helper;
use OCA\Talk\Share\RoomShareProvider;
use OCP\Share\IShare;
/**
* Instead of doing a single query to get each share and file metadata
* we do a grouped query up front so the entries are cached
*/
class Preloader {
public function __construct(
protected RoomShareProvider $shareProvider,
protected FilesMetadataCache $filesMetadataCache,
) {
}
/*
* Gather share IDs from the comments and preload share definitions
* and files metadata to avoid separate database query for each
* individual share/node later on.
*
* @param IComment[] $comments
*/
public function preloadShares(array $comments): void {
// Scan messages for share IDs
$shareIds = [];
foreach ($comments as $comment) {
$verb = $comment->getVerb();
if ($verb === 'object_shared') {
$message = $comment->getMessage();
$data = json_decode($message, true);
if (isset($data['parameters']['share'])) {
$shareIds[] = $data['parameters']['share'];
}
}
}
if (!empty($shareIds)) {
// Retrieved Share objects will be cached by
// the RoomShareProvider and returned from the cache to
// the Parser\SystemMessage without additional database queries.
$shares = $this->shareProvider->getSharesByIds($shareIds);
// Preload files metadata as well
$fileIds = array_filter(array_map(static fn (IShare $share) => $share->getNodeId(), $shares));
$this->filesMetadataCache->preloadMetadata($fileIds);
}
}
}