* Renames a file within a given folder and updates folder metadata. * * @param string $folder The folder where the file is located (or "root" for the base directory). * @param string $oldName The current name of the file. * @param string $newName The new name for the file. * @return array An associative array with either "success" (and newName) or "error" message. */
($folder, $oldName, $newName)
| 1151 | * @return array An associative array with either "success" (and newName) or "error" message. |
| 1152 | */ |
| 1153 | public static function renameFile($folder, $oldName, $newName) |
| 1154 | { |
| 1155 | $storage = self::storage(); |
| 1156 | list($directory, $err) = self::resolveFolderPath($folder, false); |
| 1157 | if ($err) { |
| 1158 | return ["error" => $err]; |
| 1159 | } |
| 1160 | $directory .= DIRECTORY_SEPARATOR; |
| 1161 | |
| 1162 | // Sanitize file names. |
| 1163 | $oldName = basename(trim($oldName)); |
| 1164 | $newName = basename(trim($newName)); |
| 1165 | |
| 1166 | // Validate file names using REGEX_FILE_NAME. |
| 1167 | if (!preg_match(REGEX_FILE_NAME, $oldName) || !UploadNamePolicy::isAllowedForWrite($newName)) { |
| 1168 | return ["error" => "Invalid file name."]; |
| 1169 | } |
| 1170 | |
| 1171 | $oldPath = $directory . $oldName; |
| 1172 | $newPath = $directory . $newName; |
| 1173 | |
| 1174 | // Helper: Generate a unique file name if the new name already exists. |
| 1175 | if ($storage->stat($newPath) !== null) { |
| 1176 | $newName = self::getUniqueFileName($directory, $newName); |
| 1177 | $newPath = $directory . $newName; |
| 1178 | } |
| 1179 | |
| 1180 | // Check that the old file exists. |
| 1181 | if ($storage->stat($oldPath) === null) { |
| 1182 | return ["error" => "File does not exist"]; |
| 1183 | } |
| 1184 | |
| 1185 | // Perform the rename. |
| 1186 | if ($storage->move($oldPath, $newPath)) { |
| 1187 | // Update the metadata file. |
| 1188 | $metadataFile = self::getMetadataFilePath($folder); |
| 1189 | |
| 1190 | if (file_exists($metadataFile)) { |
| 1191 | $metadata = json_decode(file_get_contents($metadataFile), true); |
| 1192 | if (isset($metadata[$oldName])) { |
| 1193 | $metadata[$newName] = $metadata[$oldName]; |
| 1194 | unset($metadata[$oldName]); |
| 1195 | file_put_contents($metadataFile, json_encode($metadata, JSON_PRETTY_PRINT), LOCK_EX); |
| 1196 | } |
| 1197 | } |
| 1198 | return ["success" => "File renamed successfully", "newName" => $newName]; |
| 1199 | } else { |
| 1200 | return ["error" => "Error renaming file"]; |
| 1201 | } |
| 1202 | } |
| 1203 | |
| 1204 | /* |
| 1205 | * Save a file’s contents *and* record its metadata, including who uploaded it. |
no test coverage detected