Skip to content

Commit

Permalink
Merge tag v2.3.28 into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
roadiz-ci committed Sep 24, 2024
1 parent e3fd361 commit da0d04a
Showing 1 changed file with 28 additions and 16 deletions.
44 changes: 28 additions & 16 deletions src/Events/DocumentLifeCycleSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
use Doctrine\ORM\Events;
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 All @@ -20,9 +19,9 @@
*/
#[AsDoctrineListener(event: Events::postRemove)]
#[AsDoctrineListener(event: Events::preUpdate)]
final class DocumentLifeCycleSubscriber
final readonly class DocumentLifeCycleSubscriber
{
public function __construct(private readonly FilesystemOperator $documentsStorage)
public function __construct(private FilesystemOperator $documentsStorage)
{
}

Expand All @@ -43,19 +42,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 ($args->hasChangedField('private')) {
if ($document->isPrivate() === true) {
Expand All @@ -66,6 +55,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);
}

private function makePublic(DocumentInterface $document): void
{
$this->validateDocument($document);
Expand Down

0 comments on commit da0d04a

Please sign in to comment.