Skip to content

Commit 54fe8fe

Browse files
bdominguezprovokateurin
authored andcommitted
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>
1 parent 3b4a268 commit 54fe8fe

6 files changed

Lines changed: 72 additions & 5 deletions

File tree

apps/files_versions/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
'OCA\\Files_Versions\\Db\\VersionEntity' => $baseDir . '/../lib/Db/VersionEntity.php',
1818
'OCA\\Files_Versions\\Db\\VersionsMapper' => $baseDir . '/../lib/Db/VersionsMapper.php',
1919
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => $baseDir . '/../lib/Events/CreateVersionEvent.php',
20+
'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => $baseDir . '/../lib/Events/VersionCreatedEvent.php',
2021
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => $baseDir . '/../lib/Events/VersionRestoredEvent.php',
2122
'OCA\\Files_Versions\\Expiration' => $baseDir . '/../lib/Expiration.php',
2223
'OCA\\Files_Versions\\Listener\\FileEventsListener' => $baseDir . '/../lib/Listener/FileEventsListener.php',

apps/files_versions/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class ComposerStaticInitFiles_Versions
3232
'OCA\\Files_Versions\\Db\\VersionEntity' => __DIR__ . '/..' . '/../lib/Db/VersionEntity.php',
3333
'OCA\\Files_Versions\\Db\\VersionsMapper' => __DIR__ . '/..' . '/../lib/Db/VersionsMapper.php',
3434
'OCA\\Files_Versions\\Events\\CreateVersionEvent' => __DIR__ . '/..' . '/../lib/Events/CreateVersionEvent.php',
35+
'OCA\\Files_Versions\\Events\\VersionCreatedEvent' => __DIR__ . '/..' . '/../lib/Events/VersionCreatedEvent.php',
3536
'OCA\\Files_Versions\\Events\\VersionRestoredEvent' => __DIR__ . '/..' . '/../lib/Events/VersionRestoredEvent.php',
3637
'OCA\\Files_Versions\\Expiration' => __DIR__ . '/..' . '/../lib/Expiration.php',
3738
'OCA\\Files_Versions\\Listener\\FileEventsListener' => __DIR__ . '/..' . '/../lib/Listener/FileEventsListener.php',
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
namespace OCA\Files_Versions\Events;
10+
11+
use OCA\Files_Versions\Versions\IVersion;
12+
use OCP\EventDispatcher\Event;
13+
use OCP\Files\Node;
14+
15+
/**
16+
* Event dispatched after a successful creation of a version
17+
*/
18+
class VersionCreatedEvent extends Event {
19+
public function __construct(
20+
private Node $node,
21+
private IVersion $version,
22+
) {
23+
parent::__construct();
24+
}
25+
26+
/**
27+
* Node of the file that has been versioned
28+
*/
29+
public function getNode(): Node {
30+
return $this->node;
31+
}
32+
33+
/**
34+
* Version of the file that was created
35+
*/
36+
public function getVersion(): IVersion {
37+
return $this->version;
38+
}
39+
}

apps/files_versions/lib/Versions/INeedSyncVersionBackend.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88
*/
99
namespace OCA\Files_Versions\Versions;
1010

11+
use OCA\Files_Versions\Db\VersionEntity;
1112
use OCP\Files\File;
1213

1314
/**
1415
* @since 28.0.0
1516
*/
1617
interface INeedSyncVersionBackend {
17-
public function createVersionEntity(File $file): void;
18+
/**
19+
* TODO: Convert return type to strong type once all implementations are fixed.
20+
* @return null|VersionEntity
21+
*/
22+
public function createVersionEntity(File $file);
1823
public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void;
1924
public function deleteVersionsEntity(File $file): void;
2025
}

apps/files_versions/lib/Versions/LegacyVersionsBackend.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ public function deleteVersion(IVersion $version): void {
229229
$this->versionsMapper->delete($versionEntity);
230230
}
231231

232-
public function createVersionEntity(File $file): void {
232+
public function createVersionEntity(File $file): ?VersionEntity {
233233
$versionEntity = new VersionEntity();
234234
$versionEntity->setFileId($file->getId());
235235
$versionEntity->setTimestamp($file->getMTime());
@@ -241,8 +241,7 @@ public function createVersionEntity(File $file): void {
241241
while ($tries < 5) {
242242
try {
243243
$this->versionsMapper->insert($versionEntity);
244-
/* No errors, get out of the method */
245-
return;
244+
return $versionEntity;
246245
} catch (\OCP\DB\Exception $e) {
247246
if (!in_array($e->getReason(), [
248247
\OCP\DB\Exception::REASON_CONSTRAINT_VIOLATION,
@@ -257,6 +256,8 @@ public function createVersionEntity(File $file): void {
257256
$this->logger->warning('Constraint violation while inserting version, retrying with increased timestamp', ['exception' => $e]);
258257
}
259258
}
259+
260+
return null;
260261
}
261262

262263
public function updateVersionEntity(File $sourceFile, int $revision, array $properties): void {

apps/files_versions/lib/Versions/VersionManager.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88
*/
99
namespace OCA\Files_Versions\Versions;
1010

11+
use OCA\Files_Versions\Db\VersionEntity;
12+
use OCA\Files_Versions\Events\VersionCreatedEvent;
1113
use OCA\Files_Versions\Events\VersionRestoredEvent;
1214
use OCP\EventDispatcher\IEventDispatcher;
1315
use OCP\Files\File;
1416
use OCP\Files\FileInfo;
17+
use OCP\Files\IMimeTypeLoader;
1518
use OCP\Files\IRootFolder;
1619
use OCP\Files\Lock\ILock;
1720
use OCP\Files\Lock\ILockManager;
@@ -129,7 +132,24 @@ public function deleteVersion(IVersion $version): void {
129132
public function createVersionEntity(File $file): void {
130133
$backend = $this->getBackendForStorage($file->getStorage());
131134
if ($backend instanceof INeedSyncVersionBackend) {
132-
$backend->createVersionEntity($file);
135+
$versionEntity = $backend->createVersionEntity($file);
136+
137+
if ($versionEntity instanceof VersionEntity) {
138+
$version = new Version(
139+
$versionEntity->getTimestamp(),
140+
$versionEntity->getTimestamp(),
141+
$file->getName(),
142+
$versionEntity->getSize(),
143+
Server::get(IMimeTypeLoader::class)->getMimetypeById($versionEntity->getMimetype()),
144+
Server::get(IRootFolder::class)->getUserFolder($file->getOwner()->getUID())->getRelativePath($file->getPath()),
145+
$file,
146+
$this,
147+
$file->getOwner(),
148+
$versionEntity->getMetadata() ?? [],
149+
);
150+
151+
$this->dispatcher->dispatchTyped(new VersionCreatedEvent($file, $version));
152+
}
133153
}
134154
}
135155

0 commit comments

Comments
 (0)