|
24 | 24 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
25 | 25 | * |
26 | 26 | */ |
| 27 | + |
27 | 28 | namespace OCA\Files_Versions\Versions; |
28 | 29 |
|
29 | 30 | use OC\Files\View; |
@@ -103,64 +104,70 @@ public function getVersionsForFile(IUser $user, FileInfo $file): array { |
103 | 104 | throw new NotFoundException("File not found ($fileId)"); |
104 | 105 | } |
105 | 106 |
|
106 | | - $versions = $this->getVersionsForFileFromDB($file, $user); |
107 | | - |
108 | | - // Early exit if we find any version in the database. |
109 | | - // Else we continue to populate the DB from what's on disk. |
110 | | - if (count($versions) > 0) { |
111 | | - return $versions; |
112 | | - } |
113 | | - |
114 | | - // Insert the entry in the DB for the current version. |
115 | | - $versionEntity = new VersionEntity(); |
116 | | - $versionEntity->setFileId($fileId); |
117 | | - $versionEntity->setTimestamp($file->getMTime()); |
118 | | - $versionEntity->setSize($file->getSize()); |
119 | | - $versionEntity->setMimetype($this->mimeTypeLoader->getId($file->getMimetype())); |
120 | | - $versionEntity->setMetadata([]); |
121 | | - $this->versionsMapper->insert($versionEntity); |
122 | | - |
123 | 107 | // Insert entries in the DB for existing versions. |
124 | 108 | $relativePath = $userFolder->getRelativePath($file->getPath()); |
125 | 109 | if ($relativePath === null) { |
126 | 110 | throw new NotFoundException("Relative path not found for file $fileId (" . $file->getPath() . ')'); |
127 | 111 | } |
128 | 112 |
|
129 | | - $versionsOnFS = Storage::getVersions($user->getUID(), $relativePath); |
130 | | - foreach ($versionsOnFS as $version) { |
131 | | - $versionEntity = new VersionEntity(); |
132 | | - $versionEntity->setFileId($fileId); |
133 | | - $versionEntity->setTimestamp((int)$version['version']); |
134 | | - $versionEntity->setSize((int)$version['size']); |
135 | | - $versionEntity->setMimetype($this->mimeTypeLoader->getId($version['mimetype'])); |
136 | | - $versionEntity->setMetadata([]); |
137 | | - $this->versionsMapper->insert($versionEntity); |
| 113 | + $currentVersion = [ |
| 114 | + 'version' => (string)$file->getMtime(), |
| 115 | + 'size' => $file->getSize(), |
| 116 | + 'mimetype' => $file->getMimetype(), |
| 117 | + ]; |
| 118 | + |
| 119 | + $versionsInDB = $this->versionsMapper->findAllVersionsForFileId($file->getId()); |
| 120 | + /** @var array<int, array> */ |
| 121 | + $versionsInFS = array_values(Storage::getVersions($user->getUID(), $relativePath)); |
| 122 | + |
| 123 | + /** @var array<int, array{db: ?VersionEntity, fs: ?mixed}> */ |
| 124 | + $groupedVersions = []; |
| 125 | + $davVersions = []; |
| 126 | + |
| 127 | + foreach ($versionsInDB as $version) { |
| 128 | + $revisionId = $version->getTimestamp(); |
| 129 | + $groupedVersions[$revisionId] = $groupedVersions[$revisionId] ?? []; |
| 130 | + $groupedVersions[$revisionId]['db'] = $version; |
138 | 131 | } |
139 | 132 |
|
140 | | - return $this->getVersionsForFileFromDB($file, $user); |
141 | | - } |
| 133 | + foreach ([$currentVersion, ...$versionsInFS] as $version) { |
| 134 | + $revisionId = $version['version']; |
| 135 | + $groupedVersions[$revisionId] = $groupedVersions[$revisionId] ?? []; |
| 136 | + $groupedVersions[$revisionId]['fs'] = $version; |
| 137 | + } |
142 | 138 |
|
143 | | - /** |
144 | | - * @return IVersion[] |
145 | | - */ |
146 | | - private function getVersionsForFileFromDB(FileInfo $file, IUser $user): array { |
147 | | - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); |
| 139 | + /** @var array<string, array{db: ?VersionEntity, fs: ?mixed}> $groupedVersions */ |
| 140 | + foreach ($groupedVersions as $versions) { |
| 141 | + if (empty($versions['db']) && !empty($versions['fs'])) { |
| 142 | + $versions['db'] = new VersionEntity(); |
| 143 | + $versions['db']->setFileId($fileId); |
| 144 | + $versions['db']->setTimestamp((int)$versions['fs']['version']); |
| 145 | + $versions['db']->setSize((int)$versions['fs']['size']); |
| 146 | + $versions['db']->setMimetype($this->mimeTypeLoader->getId($versions['fs']['mimetype'])); |
| 147 | + $versions['db']->setMetadata([]); |
| 148 | + $this->versionsMapper->insert($versions['db']); |
| 149 | + } elseif (!empty($versions['db']) && empty($versions['fs'])) { |
| 150 | + $this->versionsMapper->delete($versions['db']); |
| 151 | + continue; |
| 152 | + } |
148 | 153 |
|
149 | | - return array_map( |
150 | | - fn (VersionEntity $versionEntity) => new Version( |
151 | | - $versionEntity->getTimestamp(), |
152 | | - $versionEntity->getTimestamp(), |
| 154 | + $version = new Version( |
| 155 | + $versions['db']->getTimestamp(), |
| 156 | + $versions['db']->getTimestamp(), |
153 | 157 | $file->getName(), |
154 | | - $versionEntity->getSize(), |
155 | | - $this->mimeTypeLoader->getMimetypeById($versionEntity->getMimetype()), |
| 158 | + $versions['db']->getSize(), |
| 159 | + $this->mimeTypeLoader->getMimetypeById($versions['db']->getMimetype()), |
156 | 160 | $userFolder->getRelativePath($file->getPath()), |
157 | 161 | $file, |
158 | 162 | $this, |
159 | 163 | $user, |
160 | | - $versionEntity->getLabel(), |
161 | | - ), |
162 | | - $this->versionsMapper->findAllVersionsForFileId($file->getId()) |
163 | | - ); |
| 164 | + $versions['db']->getLabel(), |
| 165 | + ); |
| 166 | + |
| 167 | + array_push($davVersions, $version); |
| 168 | + } |
| 169 | + |
| 170 | + return $davVersions; |
164 | 171 | } |
165 | 172 |
|
166 | 173 | public function createVersion(IUser $user, FileInfo $file) { |
|
0 commit comments