Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions bundles/CoreBundle/src/Command/ThumbnailsVideoCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,6 @@ protected function fetchItems(InputInterface $input, OutputInterface $output): a

protected function runSingleCommand(string $item, InputInterface $input, OutputInterface $output): void
{
// disable versioning
Version::disable();

[$assetId, $thumbnailConfigName] = explode('~~~', $item, 2);

$video = Asset\Video::getById((int) $assetId);
Expand All @@ -121,20 +118,23 @@ protected function runSingleCommand(string $item, InputInterface $input, OutputI

$thumbnail = Asset\Video\Thumbnail\Config::getByName($thumbnailConfigName);

if ($output->isVerbose()) {
$this->output->writeln(' generating thumbnail for video: ' . $video->getRealFullPath() . ' | ' . $video->getId() . ' | Thumbnail: ' . $thumbnailConfigName . ' : ' . FileSystemHelper::formatBytes(memory_get_usage()));
}
$video->getThumbnail($thumbnail);
$this->waitTillFinished($video->getId(), $thumbnail);

if ($input->getOption('system')) {
// Use helper to ensure versioning is properly re-enabled even if exception occurs
Version::withDisabledVersioning(function () use ($video, $thumbnail, $input, $output, $thumbnailConfigName) {
if ($output->isVerbose()) {
$this->output->writeln(' generating thumbnail for video: ' . $video->getRealFullPath() . ' | ' . $video->getId() . ' | Thumbnail: System Preview : ' . FileSystemHelper::formatBytes(memory_get_usage()));
$this->output->writeln(' generating thumbnail for video: ' . $video->getRealFullPath() . ' | ' . $video->getId() . ' | Thumbnail: ' . $thumbnailConfigName . ' : ' . FileSystemHelper::formatBytes(memory_get_usage()));
}
$thumbnail = Asset\Video\Thumbnail\Config::getPreviewConfig();
$video->getThumbnail($thumbnail);
$this->waitTillFinished($video->getId(), $thumbnail);
}

if ($input->getOption('system')) {
if ($output->isVerbose()) {
$this->output->writeln(' generating thumbnail for video: ' . $video->getRealFullPath() . ' | ' . $video->getId() . ' | Thumbnail: System Preview : ' . FileSystemHelper::formatBytes(memory_get_usage()));
}
$thumbnail = Asset\Video\Thumbnail\Config::getPreviewConfig();
$video->getThumbnail($thumbnail);
$this->waitTillFinished($video->getId(), $thumbnail);
}
});
}

protected function waitTillFinished(int $videoId, string|Asset\Video\Thumbnail\Config $thumbnail): void
Expand Down
8 changes: 4 additions & 4 deletions lib/Messenger/Handler/AssetUpdateTasksHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ public function __invoke(AssetUpdateTasksMessage $message): void

private function saveAsset(Asset $asset, array $saveParams = []): void
{
Version::disable();
$asset->markFieldDirty('modificationDate'); // prevent modificationDate from being changed
$asset->save($saveParams);
Version::enable();
Version::withDisabledVersioning(function () use ($asset, $saveParams) {
$asset->markFieldDirty('modificationDate'); // prevent modificationDate from being changed
$asset->save($saveParams);
});
}

private function processDocument(Asset\Document $asset): void
Expand Down
8 changes: 2 additions & 6 deletions models/Asset/Video.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,7 @@ public function getDuration(): float|int|null
if ($duration) {
$this->setCustomSetting('duration', $duration);

Model\Version::disable();
$this->save(); // auto save
Model\Version::enable();
Model\Version::withDisabledVersioning($this->save(...)); // auto save
}
}

Expand All @@ -225,9 +223,7 @@ public function getDimensions(): ?array
$this->setCustomSetting(self::CUSTOM_SETTING_PROCESSING_FAILED, true);
}

Model\Version::disable();
$this->save(); // auto save
Model\Version::enable();
Model\Version::withDisabledVersioning($this->save(...)); // auto save
}

return $dimensions;
Expand Down
11 changes: 1 addition & 10 deletions models/Asset/Video/Thumbnail/Processor.php
Original file line number Diff line number Diff line change
Expand Up @@ -327,16 +327,7 @@ public function save(): bool

private static function saveWithoutVersion(Model\Asset $asset): void
{
$versioningEnabled = Model\Version::isEnabled();
if ($versioningEnabled) {
Model\Version::disable();
}

$asset->save();

if ($versioningEnabled) {
Model\Version::enable();
}
Model\Version::withDisabledVersioning($asset->save(...));
}

protected function getJobStoreId(?string $processId = null): string
Expand Down
28 changes: 14 additions & 14 deletions models/Element/Recyclebin/Item.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,20 +103,20 @@ public function restore(?Model\User $user = null): void
$element->setKey($element->getKey().'_restore');
}

// create an empty object first and clone it to prevent that unique key constraint is being ignored
// when restoring from recycle bin
Model\Version::disable();
$className = $element::class;
/** @var Document|Asset|AbstractObject $dummy */
$dummy = OpenDxp::getContainer()->get('opendxp.model.factory')->build($className);
$dummy->setId($element->getId());
$dummy->setParentId($element->getParentId() ?: 1);
$dummy->setKey($element->getKey());
if ($dummy instanceof DataObject\Concrete) {
$dummy->setOmitMandatoryCheck(true);
}
$dummy->save(['isRecycleBinRestore' => true]);
Model\Version::enable();
Model\Version::withDisabledVersioning(function () use ($element, &$dummy) {
// create an empty object first and clone it to prevent that unique key constraint is being ignored
// when restoring from recycle bin
$className = $element::class;
/** @var Document|Asset|AbstractObject $dummy */
$dummy = OpenDxp::getContainer()->get('opendxp.model.factory')->build($className);
$dummy->setId($element->getId());
$dummy->setParentId($element->getParentId() ?: 1);
$dummy->setKey($element->getKey());
if ($dummy instanceof DataObject\Concrete) {
$dummy->setOmitMandatoryCheck(true);
}
$dummy->save(['isRecycleBinRestore' => true]);
});
}

if (\OpenDxp\Tool\Admin::getCurrentUser()) {
Expand Down
18 changes: 18 additions & 0 deletions models/Version.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,24 @@ public static function isEnabled(): bool
return !self::$disabled;
}

/**
* Executes a callback with versioning disabled, ensuring versioning state is properly restored.
* This is a convenience method to ensure Version::enable() is always called,
* even if the callback throws an exception.
*/
public static function withDisabledVersioning(callable $callback): mixed
{
$versioningEnabled = self::isEnabled();
try {
self::disable();
return $callback();
} finally {
if ($versioningEnabled) {
self::enable();
}
}
}

public function save(): void
{
$this->dispatchEvent(new VersionEvent($this), VersionEvents::PRE_SAVE);
Expand Down