Skip to content

Commit

Permalink
fix(Documents): Do not throw UnableToMoveFile when document `filena…
Browse files Browse the repository at this point in the history
…me` changes because we update the whole file
  • Loading branch information
ambroisemaupate committed Sep 24, 2024
1 parent 8b06427 commit da5386e
Showing 1 changed file with 26 additions and 14 deletions.
40 changes: 26 additions & 14 deletions lib/Documents/src/Events/DocumentLifeCycleSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
use Doctrine\Persistence\Event\LifecycleEventArgs;
use League\Flysystem\FilesystemException;
use League\Flysystem\FilesystemOperator;
use League\Flysystem\UnableToMoveFile;
use League\Flysystem\Visibility;
use RZ\Roadiz\Documents\Exceptions\DocumentWithoutFileException;
use RZ\Roadiz\Documents\Models\DocumentInterface;
Expand Down Expand Up @@ -52,19 +51,9 @@ public function preUpdate(PreUpdateEventArgs $args): void
&& is_string($args->getNewValue('filename'))
&& $args->getOldValue('filename') !== ''
) {
$oldPath = $this->getDocumentMountPathForFilename($document, $args->getOldValue('filename'));
$newPath = $this->getDocumentMountPathForFilename($document, $args->getNewValue('filename'));

if ($oldPath !== $newPath) {
if ($this->documentsStorage->fileExists($oldPath) && !$this->documentsStorage->fileExists($newPath)) {
/*
* Only perform IO rename if old file exists and new path is free.
*/
$this->documentsStorage->move($oldPath, $newPath);
} else {
throw new UnableToMoveFile('Cannot rename file from ' . $oldPath . ' to ' . $newPath);
}
}
// This method must not throw any exception
// because filename WILL change if document file is updated too.
$this->renameDocumentFilename($document, $args);
}
if ($document instanceof DocumentInterface && $args->hasChangedField('private')) {
if ($document->isPrivate() === true) {
Expand All @@ -75,6 +64,29 @@ public function preUpdate(PreUpdateEventArgs $args): void
}
}

private function renameDocumentFilename(DocumentInterface $document, PreUpdateEventArgs $args): void
{
$oldPath = $this->getDocumentMountPathForFilename($document, $args->getOldValue('filename'));
$newPath = $this->getDocumentMountPathForFilename($document, $args->getNewValue('filename'));

if ($oldPath === $newPath) {
return;
}

if (!$this->documentsStorage->fileExists($oldPath)) {
// Do not throw, just return
return;
}
if ($this->documentsStorage->fileExists($newPath)) {
// Do not throw, just return
return;
}
/*
* Only perform IO rename if old file exists and new path is free.
*/
$this->documentsStorage->move($oldPath, $newPath);
}

/**
* @param DocumentInterface $document
* @param PreUpdateEventArgs $args
Expand Down

0 comments on commit da5386e

Please sign in to comment.