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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
'OCA\\Files_Versions\\Db\\VersionEntity' => $baseDir . '/../lib/Db/VersionEntity.php',
'OCA\\Files_Versions\\Db\\VersionsMapper' => $baseDir . '/../lib/Db/VersionsMapper.php',
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => $baseDir . '/../lib/Events/CreateVersionEvent.php',
'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => $baseDir . '/../lib/Events/VersionCreatedEvent.php',
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => $baseDir . '/../lib/Events/VersionRestoredEvent.php',
'OCA\\Files_Versions\\Expiration' => $baseDir . '/../lib/Expiration.php',
'OCA\\Files_Versions\\Listener\\FileEventsListener' => $baseDir . '/../lib/Listener/FileEventsListener.php',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class ComposerStaticInitFiles_Versions
'OCA\\Files_Versions\\Db\\VersionEntity' => __DIR__ . '/..' . '/../lib/Db/VersionEntity.php',
'OCA\\Files_Versions\\Db\\VersionsMapper' => __DIR__ . '/..' . '/../lib/Db/VersionsMapper.php',
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => __DIR__ . '/..' . '/../lib/Events/CreateVersionEvent.php',
'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => __DIR__ . '/..' . '/../lib/Events/VersionCreatedEvent.php',
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => __DIR__ . '/..' . '/../lib/Events/VersionRestoredEvent.php',
'OCA\\Files_Versions\\Expiration' => __DIR__ . '/..' . '/../lib/Expiration.php',
'OCA\\Files_Versions\\Listener\\FileEventsListener' => __DIR__ . '/..' . '/../lib/Listener/FileEventsListener.php',
Expand Down
39 changes: 39 additions & 0 deletions apps/files_versions/lib/Events/VersionCreatedEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files_Versions\Events;

use OCA\Files_Versions\Versions\IVersion;
use OCP\EventDispatcher\Event;
use OCP\Files\Node;

/**
* Event dispatched after a successful creation of a version
*/
class VersionCreatedEvent extends Event {
public function __construct(
private Node $node,
private IVersion $version,
) {
parent::__construct();
}

/**
* Node of the file that has been versioned
*/
public function getNode(): Node {
return $this->node;
}

/**
* Version of the file that was created
*/
public function getVersion(): IVersion {
return $this->version;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,18 @@
*/
namespace OCA\Files_Versions\Versions;

use OCA\Files_Versions\Db\VersionEntity;
use OCP\Files\File;

/**
* @since 28.0.0
*/
interface INeedSyncVersionBackend {
public function createVersionEntity(File $file): void;
/**
* TODO: Convert return type to strong type once all implementations are fixed.
* @return null|VersionEntity
*/
public function createVersionEntity(File $file);
public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void;
public function deleteVersionsEntity(File $file): void;
}
7 changes: 4 additions & 3 deletions apps/files_versions/lib/Versions/LegacyVersionsBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public function deleteVersion(IVersion $version): void {
$this->versionsMapper->delete($versionEntity);
}

public function createVersionEntity(File $file): void {
public function createVersionEntity(File $file): ?VersionEntity {
$versionEntity = new VersionEntity();
$versionEntity->setFileId($file->getId());
$versionEntity->setTimestamp($file->getMTime());
Expand All @@ -241,8 +241,7 @@ public function createVersionEntity(File $file): void {
while ($tries < 5) {
try {
$this->versionsMapper->insert($versionEntity);
/* No errors, get out of the method */
return;
return $versionEntity;
} catch (\OCP\DB\Exception $e) {
if (!in_array($e->getReason(), [
\OCP\DB\Exception::REASON_CONSTRAINT_VIOLATION,
Expand All @@ -257,6 +256,8 @@ public function createVersionEntity(File $file): void {
$this->logger->warning('Constraint violation while inserting version, retrying with increased timestamp', ['exception' => $e]);
}
}

return null;
}

public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void {
Expand Down
13 changes: 12 additions & 1 deletion apps/files_versions/lib/Versions/VersionManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
*/
namespace OCA\Files_Versions\Versions;

use OCA\Files_Versions\Db\VersionEntity;
use OCA\Files_Versions\Events\VersionCreatedEvent;
use OCA\Files_Versions\Events\VersionRestoredEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\File;
Expand Down Expand Up @@ -129,7 +131,16 @@ public function deleteVersion(IVersion $version): void {
public function createVersionEntity(File $file): void {
$backend = $this->getBackendForStorage($file->getStorage());
if ($backend instanceof INeedSyncVersionBackend) {
$backend->createVersionEntity($file);
$versionEntity = $backend->createVersionEntity($file);

if ($versionEntity instanceof VersionEntity) {
foreach ($backend->getVersionsForFile($file->getOwner(), $file) as $version) {
if ($version->getRevisionId() === $versionEntity->getTimestamp()) {
$this->dispatcher->dispatchTyped(new VersionCreatedEvent($file, $version));
break;
}
}
}
}
}

Expand Down
Loading