Browse Source

feat(file-versions): #53151 add VersionCreatedEvent event

Signed-off-by: Borja Domínguez Vázquez <bdominguez@virtualwareco.com>
Signed-off-by: provokateurin <kate@provokateurin.de>
pull/53746/head
Borja Domínguez Vázquez 5 months ago
committed by provokateurin
parent
commit
d0de83be10
Failed to extract signature
  1. 1
      apps/files_versions/composer/composer/autoload_classmap.php
  2. 1
      apps/files_versions/composer/composer/autoload_static.php
  3. 39
      apps/files_versions/lib/Events/VersionCreatedEvent.php
  4. 7
      apps/files_versions/lib/Versions/INeedSyncVersionBackend.php
  5. 7
      apps/files_versions/lib/Versions/LegacyVersionsBackend.php
  6. 13
      apps/files_versions/lib/Versions/VersionManager.php

1
apps/files_versions/composer/composer/autoload_classmap.php

@ -17,6 +17,7 @@ return array(
'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',

1
apps/files_versions/composer/composer/autoload_static.php

@ -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',

39
apps/files_versions/lib/Events/VersionCreatedEvent.php

@ -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;
}
}

7
apps/files_versions/lib/Versions/INeedSyncVersionBackend.php

@ -8,13 +8,18 @@ declare(strict_types=1);
*/
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
apps/files_versions/lib/Versions/LegacyVersionsBackend.php

@ -229,7 +229,7 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
$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());
@ -241,8 +241,7 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
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,
@ -257,6 +256,8 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
$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 {

13
apps/files_versions/lib/Versions/VersionManager.php

@ -8,6 +8,8 @@ declare(strict_types=1);
*/
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;
@ -129,7 +131,16 @@ class VersionManager implements IVersionManager, IDeletableVersionBackend, INeed
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;
}
}
}
}
}

Loading…
Cancel
Save