From 380d5b90e6c83d10a7f5d0682da13225fb849706 Mon Sep 17 00:00:00 2001 From: Jonas Date: Wed, 11 Sep 2024 10:22:25 +0200 Subject: [PATCH] fix: Reset session if file rename changes mimetype from/to markdown For the event target file, we cannot use `getMimetype()` or `getExtension()` as it's a node of type `NonExistingFile`. Fixes: #5736 Signed-off-by: Jonas --- lib/Listeners/BeforeNodeRenamedListener.php | 33 ++++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/Listeners/BeforeNodeRenamedListener.php b/lib/Listeners/BeforeNodeRenamedListener.php index 7b95cb54a39..9f56f7a77fe 100644 --- a/lib/Listeners/BeforeNodeRenamedListener.php +++ b/lib/Listeners/BeforeNodeRenamedListener.php @@ -8,20 +8,23 @@ namespace OCA\Text\Listeners; +use Exception; use OCA\Text\Service\AttachmentService; +use OCA\Text\Service\DocumentService; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Files\Events\Node\BeforeNodeRenamedEvent; use OCP\Files\File; +use Psr\Log\LoggerInterface; /** * @template-implements IEventListener */ class BeforeNodeRenamedListener implements IEventListener { - private AttachmentService $attachmentService; - - public function __construct(AttachmentService $attachmentService) { - $this->attachmentService = $attachmentService; + public function __construct( + private readonly AttachmentService $attachmentService, + private readonly DocumentService $documentService, + private readonly LoggerInterface $logger) { } public function handle(Event $event): void { @@ -30,10 +33,24 @@ public function handle(Event $event): void { } $source = $event->getSource(); $target = $event->getTarget(); - if ($source instanceof File - && $source->getMimeType() === 'text/markdown' - && $target instanceof File - ) { + + if (!($source instanceof File && $target instanceof File)) { + return; + } + + $sourceIsMarkdown = $source->getMimeType() === 'text/markdown'; + $targetIsMarkdown = pathinfo($target->getPath(), PATHINFO_EXTENSION) === 'md'; // NonExistingFile has no `getMimetype()` + + // Reset document state if mimetype changes from/to markdown as this means another editor is loaded + if ($sourceIsMarkdown xor $targetIsMarkdown) { + try { + $this->documentService->resetDocument($source->getId(), true); + } catch (Exception $e) { + $this->logger->error($e->getMessage(), ['exception' => $e]); + } + } + + if ($sourceIsMarkdown) { $this->attachmentService->moveAttachments($source, $target); } }