Skip to content

Commit a07708e

Browse files
committed
fix(files_versions): Improve files version listing
Signed-off-by: Louis Chemineau <[email protected]>
1 parent cce4a78 commit a07708e

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

apps/files_versions/lib/Versions/LegacyVersionsBackend.php

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* along with this program. If not, see <http://www.gnu.org/licenses/>.
2525
*
2626
*/
27+
2728
namespace OCA\Files_Versions\Versions;
2829

2930
use OC\Files\View;
@@ -102,62 +103,70 @@ public function getVersionsForFile(IUser $user, FileInfo $file): array {
102103
throw new NotFoundException("File not found ($fileId)");
103104
}
104105

105-
$versions = $this->getVersionsForFileFromDB($file, $user);
106-
107-
if (count($versions) > 0) {
108-
return $versions;
109-
}
110-
111-
// Insert the entry in the DB for the current version.
112-
$versionEntity = new VersionEntity();
113-
$versionEntity->setFileId($fileId);
114-
$versionEntity->setTimestamp($file->getMTime());
115-
$versionEntity->setSize($file->getSize());
116-
$versionEntity->setMimetype($this->mimeTypeLoader->getId($file->getMimetype()));
117-
$versionEntity->setMetadata([]);
118-
$this->versionsMapper->insert($versionEntity);
119-
120106
// Insert entries in the DB for existing versions.
121107
$relativePath = $userFolder->getRelativePath($file->getPath());
122108
if ($relativePath === null) {
123109
throw new NotFoundException("Relative path not found for file $fileId (" . $file->getPath() . ')');
124110
}
125111

126-
$versionsOnFS = Storage::getVersions($user->getUID(), $relativePath);
127-
foreach ($versionsOnFS as $version) {
128-
$versionEntity = new VersionEntity();
129-
$versionEntity->setFileId($fileId);
130-
$versionEntity->setTimestamp((int)$version['version']);
131-
$versionEntity->setSize((int)$version['size']);
132-
$versionEntity->setMimetype($this->mimeTypeLoader->getId($version['mimetype']));
133-
$versionEntity->setMetadata([]);
134-
$this->versionsMapper->insert($versionEntity);
112+
$currentVersion = [
113+
'version' => (string)$file->getMtime(),
114+
'size' => $file->getSize(),
115+
'mimetype' => $file->getMimetype(),
116+
];
117+
118+
$versionsInDB = $this->versionsMapper->findAllVersionsForFileId($file->getId());
119+
/** @var array<int, array> */
120+
$versionsInFS = array_values(Storage::getVersions($user->getUID(), $relativePath));
121+
122+
/** @var array<int, array{db: ?VersionEntity, fs: ?mixed}> */
123+
$groupedVersions = [];
124+
$davVersions = [];
125+
126+
foreach ($versionsInDB as $version) {
127+
$revisionId = $version->getTimestamp();
128+
$groupedVersions[$revisionId] = $groupedVersions[$revisionId] ?? [];
129+
$groupedVersions[$revisionId]['db'] = $version;
135130
}
136131

137-
return $this->getVersionsForFileFromDB($file, $user);
138-
}
132+
foreach ([$currentVersion, ...$versionsInFS] as $version) {
133+
$revisionId = $version['version'];
134+
$groupedVersions[$revisionId] = $groupedVersions[$revisionId] ?? [];
135+
$groupedVersions[$revisionId]['fs'] = $version;
136+
}
139137

140-
/**
141-
* @return IVersion[]
142-
*/
143-
private function getVersionsForFileFromDB(FileInfo $file, IUser $user): array {
144-
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
138+
/** @var array<string, array{db: ?VersionEntity, fs: ?mixed}> $groupedVersions */
139+
foreach ($groupedVersions as $versions) {
140+
if (empty($versions['db']) && !empty($versions['fs'])) {
141+
$versions['db'] = new VersionEntity();
142+
$versions['db']->setFileId($fileId);
143+
$versions['db']->setTimestamp((int)$versions['fs']['version']);
144+
$versions['db']->setSize((int)$versions['fs']['size']);
145+
$versions['db']->setMimetype($this->mimeTypeLoader->getId($versions['fs']['mimetype']));
146+
$versions['db']->setMetadata([]);
147+
$this->versionsMapper->insert($versions['db']);
148+
} elseif (!empty($versions['db']) && empty($versions['fs'])) {
149+
$this->versionsMapper->delete($versions['db']);
150+
continue;
151+
}
145152

146-
return array_map(
147-
fn (VersionEntity $versionEntity) => new Version(
148-
$versionEntity->getTimestamp(),
149-
$versionEntity->getTimestamp(),
153+
$version = new Version(
154+
$versions['db']->getTimestamp(),
155+
$versions['db']->getTimestamp(),
150156
$file->getName(),
151-
$versionEntity->getSize(),
152-
$this->mimeTypeLoader->getMimetypeById($versionEntity->getMimetype()),
157+
$versions['db']->getSize(),
158+
$this->mimeTypeLoader->getMimetypeById($versions['db']->getMimetype()),
153159
$userFolder->getRelativePath($file->getPath()),
154160
$file,
155161
$this,
156162
$user,
157-
$versionEntity->getLabel(),
158-
),
159-
$this->versionsMapper->findAllVersionsForFileId($file->getId())
160-
);
163+
$versions['db']->getLabel(),
164+
);
165+
166+
array_push($davVersions, $version);
167+
}
168+
169+
return $davVersions;
161170
}
162171

163172
public function createVersion(IUser $user, FileInfo $file) {

0 commit comments

Comments
 (0)