|
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; |
@@ -102,62 +103,70 @@ public function getVersionsForFile(IUser $user, FileInfo $file): array { |
102 | 103 | throw new NotFoundException("File not found ($fileId)"); |
103 | 104 | } |
104 | 105 |
|
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 | | - |
120 | 106 | // Insert entries in the DB for existing versions. |
121 | 107 | $relativePath = $userFolder->getRelativePath($file->getPath()); |
122 | 108 | if ($relativePath === null) { |
123 | 109 | throw new NotFoundException("Relative path not found for file $fileId (" . $file->getPath() . ')'); |
124 | 110 | } |
125 | 111 |
|
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; |
135 | 130 | } |
136 | 131 |
|
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 | + } |
139 | 137 |
|
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 | + } |
145 | 152 |
|
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(), |
150 | 156 | $file->getName(), |
151 | | - $versionEntity->getSize(), |
152 | | - $this->mimeTypeLoader->getMimetypeById($versionEntity->getMimetype()), |
| 157 | + $versions['db']->getSize(), |
| 158 | + $this->mimeTypeLoader->getMimetypeById($versions['db']->getMimetype()), |
153 | 159 | $userFolder->getRelativePath($file->getPath()), |
154 | 160 | $file, |
155 | 161 | $this, |
156 | 162 | $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; |
161 | 170 | } |
162 | 171 |
|
163 | 172 | public function createVersion(IUser $user, FileInfo $file) { |
|
0 commit comments