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

102 lines
2.7 KiB
PHP

<?php
/**
* SPDX-FileCopyrightText: 2025 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Notes\Reference;
use OCA\Notes\Service\NoteDoesNotExistException;
use OCA\Notes\Service\NotesService;
use OCP\Collaboration\Reference\ADiscoverableReferenceProvider;
use OCP\Collaboration\Reference\IReference;
use OCP\Collaboration\Reference\Reference;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUserSession;
use OCP\L10N\IFactory;
use Psr\Log\LoggerInterface;
class NoteReferenceProvider extends ADiscoverableReferenceProvider {
private const RICH_OBJECT_TYPE = 'notes_note';
private ?string $userId;
private IL10N $l10n;
private LoggerInterface $logger;
public function __construct(
private IURLGenerator $urlGenerator,
private NotesService $notesService,
IUserSession $userSession,
IFactory $l10n,
LoggerInterface $logger,
) {
$this->userId = $userSession->getUser()?->getUID();
$this->l10n = $l10n->get('notes');
$this->logger = $logger;
}
public function matchReference(string $referenceText): bool {
return $this->getNoteLinkId($referenceText) !== null;
}
private function getNoteLinkId(string $referenceText): ?int {
$start = $this->urlGenerator->getAbsoluteURL('/apps/notes/note/');
$startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/notes/note/');
foreach ([$start, $startIndex] as $url) {
preg_match('/^' . preg_quote($url, '/') . '([0-9]+)$/', $referenceText, $matches);
if ($matches && count($matches) > 1) {
return (int)$matches[1];
}
}
return null;
}
public function resolveReference(string $referenceText): ?IReference {
$noteId = $this->getNoteLinkId($referenceText);
$reference = new Reference($referenceText);
if ($this->userId !== null && $noteId !== null) {
try {
$note = $this->notesService->get($this->userId, $noteId);
} catch (NoteDoesNotExistException) {
$this->logger->warning('Could not find a note with id: ' . $noteId);
return null;
}
$reference->setTitle($note->getTitle());
$reference->setDescription($note->getCategory());
$reference->setImageUrl($this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreviewByFileId', ['x' => 600, 'y' => 300, 'fileId' => $note->getId()]));
return $reference;
}
return null;
}
public function getCachePrefix(string $referenceId): string {
return $referenceId;
}
public function getCacheKey(string $referenceId): string {
return $this->userId ?? '';
}
public function getId(): string {
return 'notes' ;
}
public function getTitle(): string {
return $this->l10n->t('Notes');
}
public function getOrder(): int {
return 10;
}
public function getIconUrl(): string {
return $this->urlGenerator->imagePath('notes', 'notes.svg');
}
}