Skip to content

Commit 4740f1e

Browse files
committed
rename file API and test cases
1 parent 2570ab8 commit 4740f1e

File tree

7 files changed

+458
-37
lines changed

7 files changed

+458
-37
lines changed

index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import {
3232
CreateCustomMetadataFieldOptions,
3333
CustomMetadataField,
3434
UpdateCustomMetadataFieldOptions,
35+
RenameFileOptions,
36+
RenameFileResponse,
3537
} from "./libs/interfaces";
3638
import { IKCallback } from "./libs/interfaces/IKCallback";
3739
import manage from "./libs/manage";
@@ -365,6 +367,19 @@ class ImageKit {
365367
return promisify(this, manage.moveFile)(moveFileOptions, this.options, callback);
366368
}
367369

370+
/**
371+
* You can programmatically rename an already existing file in the media library using rename file API. This operation would rename all file versions of the file. Note: The old URLs will stop working. The file/file version URLs cached on CDN will continue to work unless a purge is requested.
372+
*
373+
* @see {@link https://docs.imagekit.io/api-reference/media-api/rename-file}
374+
*
375+
* @param renameFileOptions
376+
*/
377+
renameFile(renameFileOptions: RenameFileOptions): Promise<RenameFileResponse>;
378+
renameFile(renameFileOptions: RenameFileOptions, callback: IKCallback<RenameFileResponse>): void;
379+
renameFile(renameFileOptions: RenameFileOptions, callback?: IKCallback<RenameFileResponse>): void | Promise<RenameFileResponse> {
380+
return promisify<RenameFileResponse>(this, manage.renameFile)(renameFileOptions, this.options, callback);
381+
}
382+
368383
/**
369384
* This will create a new folder. This method accepts folder name and parent folder path.
370385
*

libs/constants/errorMessages.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ export default {
66
"INVALID_TRANSFORMATION_POSITION": { message: "Invalid transformationPosition parameter", help: "" },
77
"CACHE_PURGE_URL_MISSING": { message: "Missing URL parameter for this request", help: "" },
88
"CACHE_PURGE_STATUS_ID_MISSING": { message: "Missing Request ID parameter for this request", help: "" },
9-
"FILE_ID_MISSING": { message: "Missing File ID parameter for this request", help: "" },
10-
"FILE_VERSION_ID_MISSING": { message: "Missing File version ID parameter for this request", help: "" },
11-
"FILE_ID_OR_URL_MISSING": { message: "Pass either File ID or remote URL of the image as first parameter", help: "" },
9+
"FILE_ID_MISSING": { message: "Missing fileId parameter for this request", help: "" },
10+
"FILE_VERSION_ID_MISSING": { message: "Missing versionId parameter for this request", help: "" },
11+
"FILE_ID_OR_URL_MISSING": { message: "Pass either fileId or remote URL of the image as first parameter", help: "" },
1212
"INVALID_LIST_OPTIONS": { message: "Pass a valid JSON list options e.g. {skip: 10, limit: 100}.", help: "" },
1313
"UPDATE_DATA_MISSING": { message: "Missing file update data for this request", help: "" },
1414
"UPDATE_DATA_TAGS_INVALID": { message: "Invalid tags parameter for this request", help: "tags should be passed as null or an array like ['tag1', 'tag2']" },
@@ -18,13 +18,13 @@ export default {
1818
"MISSING_UPLOAD_FILE_PARAMETER": { message: "Missing file parameter for upload", help: "" },
1919
"MISSING_UPLOAD_FILENAME_PARAMETER": { message: "Missing fileName parameter for upload", help: "" },
2020
"JOB_ID_MISSING": { message: "Missing jobId parameter", help: "" },
21-
"INVALID_DESTINATION_FOLDER_PATH": { messages: "Invalid destinationPath value", help: "It should be a string like '/path/to/folder'" },
22-
"INVALID_INCLUDE_VERSION": { messages: "Invalid includeFileVersions value", help: "It should be a boolean" },
23-
"INVALID_SOURCE_FILE_PATH": { messages: "Invalid sourceFilePath value", help: "It should be a string like /path/to/file.jpg'" },
24-
"INVALID_SOURCE_FOLDER_PATH": { messages: "Invalid sourceFolderPath value", help: "It should be a string like '/path/to/folder'" },
25-
"INVALID_FOLDER_NAME": { messages: "Invalid folderName value", help: "" },
26-
"INVALID_PARENT_FOLDER_PATH": { messages: "Invalid parentFolderPath value", help: "It should be a string like '/path/to/folder'" },
27-
"INVALID_FOLDER_PATH": { messages: "Invalid folderPath value", help: "It should be a string like '/path/to/folder'" },
21+
"INVALID_DESTINATION_FOLDER_PATH": { message: "Invalid destinationPath value", help: "It should be a string like '/path/to/folder'" },
22+
"INVALID_INCLUDE_VERSION": { message: "Invalid includeFileVersions value", help: "It should be a boolean" },
23+
"INVALID_SOURCE_FILE_PATH": { message: "Invalid sourceFilePath value", help: "It should be a string like /path/to/file.jpg'" },
24+
"INVALID_SOURCE_FOLDER_PATH": { message: "Invalid sourceFolderPath value", help: "It should be a string like '/path/to/folder'" },
25+
"INVALID_FOLDER_NAME": { message: "Invalid folderName value", help: "" },
26+
"INVALID_PARENT_FOLDER_PATH": { message: "Invalid parentFolderPath value", help: "It should be a string like '/path/to/folder'" },
27+
"INVALID_FOLDER_PATH": { message: "Invalid folderPath value", help: "It should be a string like '/path/to/folder'" },
2828
// pHash errors
2929
"INVALID_PHASH_VALUE": { message: "Invalid pHash value", help: "Both pHash strings must be valid hexadecimal numbers" },
3030
"MISSING_PHASH_VALUE": { message: "Missing pHash value", help: "Please pass two pHash values" },
@@ -39,4 +39,7 @@ export default {
3939
"CMF_SCHEMA_INVALID": { message: "Invalid value for schema", help: "schema should have a mandatory type field." },
4040
"CMF_LABEL_SCHEMA_MISSING": { message: "Both label and schema is missing", help: "" },
4141
"CMF_FIELD_ID_MISSING": { message: "Missing fieldId parameter for this request", help: "" },
42+
"INVALID_FILE_PATH": { message: "Invalid value for filePath", help: "Pass the full path of the file. For example - /path/to/file.jpg" },
43+
"INVALID_NEW_FILE_NAME": { message: "Invalid value for newFileName. It should be a string.", help: "" },
44+
"INVALID_PURGE_CACHE": { message: "Invalid value for purgeCache. It should be boolean.", help: "" },
4245
};

libs/interfaces/Rename.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Response when rename file
3+
*
4+
* @see {@link https://docs.imagekit.io/api-reference/media-api/rename-file}
5+
*/
6+
export interface RenameFileResponse {
7+
/**
8+
* When purgeCache is set to true
9+
*/
10+
purgeRequestId?: string;
11+
}
12+
13+
/**
14+
* Response when rename file
15+
*
16+
* @see {@link https://docs.imagekit.io/api-reference/media-api/rename-file}
17+
*/
18+
export interface RenameFileOptions {
19+
/**
20+
* The full path of the file you want to rename. For example - /path/to/file.jpg
21+
*/
22+
filePath: string;
23+
/**
24+
* The new name of the file. A filename can contain:
25+
- Alphanumeric Characters: a-z, A-Z, 0-9 (including Unicode letters, marks, and numerals in other languages).
26+
- Special Characters: ., _, and -. Any other character, including space, will be replaced by _.
27+
*/
28+
newFileName: string
29+
/**
30+
* Option to purge cache for the old file URL. When set to true, it will internally issue a purge cache request on CDN to remove cached content on the old URL.
31+
*/
32+
purgeCache: boolean
33+
}

libs/interfaces/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CopyFolderOptions, CopyFolderResponse, CopyFolderError } from "./CopyFo
1616
import { MoveFolderOptions, MoveFolderResponse, MoveFolderError } from "./MoveFolder";
1717
import { DeleteFileVersionOptions, RestoreFileVersionOptions } from "./FileVersion"
1818
import { CreateCustomMetadataFieldOptions, CustomMetadataField, UpdateCustomMetadataFieldOptions } from "./CustomMetatadaField"
19+
import { RenameFileOptions, RenameFileResponse } from "./Rename"
1920

2021
type FinalUrlOptions = ImageKitOptions & UrlOptions; // actual options used to construct url
2122

@@ -52,5 +53,7 @@ export {
5253
CreateCustomMetadataFieldOptions,
5354
CustomMetadataField,
5455
UpdateCustomMetadataFieldOptions,
56+
RenameFileOptions,
57+
RenameFileResponse,
5558
};
5659
export { IKCallback } from "./IKCallback";

libs/manage/file.ts

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import {
3333
MoveFolderOptions,
3434
DeleteFileVersionOptions,
3535
RestoreFileVersionOptions,
36+
RenameFileOptions,
37+
RenameFileResponse,
3638
} from "../interfaces/";
3739
import ImageKit from "../..";
3840

@@ -58,7 +60,7 @@ const deleteFile = function (fileId: string, defaultOptions: ImageKitOptions, ca
5860
Delete a file version
5961
*/
6062
const deleteFileVersion = function (deleteFileVersionOptions: DeleteFileVersionOptions, defaultOptions: ImageKitOptions, callback?: IKCallback<void>) {
61-
const { fileId, versionId } = deleteFileVersionOptions;
63+
const { fileId, versionId } = deleteFileVersionOptions || {};
6264
if (!fileId) {
6365
respond(true, errorMessages.FILE_ID_MISSING, callback);
6466
return;
@@ -85,7 +87,7 @@ const restoreFileVersion = function (
8587
restoreFileVersionOptions: RestoreFileVersionOptions,
8688
defaultOptions: ImageKitOptions,
8789
callback?: IKCallback<FileDetailsResponse>) {
88-
const { fileId, versionId } = restoreFileVersionOptions;
90+
const { fileId, versionId } = restoreFileVersionOptions || {};
8991
if (!fileId) {
9092
respond(true, errorMessages.FILE_ID_MISSING, callback);
9193
return;
@@ -163,7 +165,7 @@ const getFileVersionDetails = function (
163165
defaultOptions: ImageKitOptions,
164166
callback?: IKCallback<FileDetailsResponse>,
165167
) {
166-
const { fileId, versionId } = fileDetailsOptions;
168+
const { fileId, versionId } = fileDetailsOptions || {};
167169
if (!fileId) {
168170
respond(true, errorMessages.FILE_ID_MISSING, callback);
169171
return;
@@ -479,6 +481,45 @@ const moveFile = function (
479481
request(requestOptions, defaultOptions, callback);
480482
};
481483

484+
/*
485+
Rename file
486+
*/
487+
const renameFile = function (
488+
renameFileOptions: RenameFileOptions,
489+
defaultOptions: ImageKitOptions,
490+
callback?: IKCallback<RenameFileResponse>,
491+
) {
492+
const { filePath, newFileName, purgeCache = false } = renameFileOptions;
493+
if (typeof filePath !== "string" || filePath.length === 0) {
494+
respond(true, errorMessages.INVALID_FILE_PATH, callback);
495+
return;
496+
}
497+
498+
if (typeof newFileName !== "string" || newFileName.length === 0) {
499+
respond(true, errorMessages.INVALID_NEW_FILE_NAME, callback);
500+
return;
501+
}
502+
503+
if (typeof purgeCache !== "boolean") {
504+
respond(true, errorMessages.INVALID_PURGE_CACHE, callback);
505+
return;
506+
}
507+
508+
const data = {
509+
filePath,
510+
newFileName,
511+
purgeCache
512+
};
513+
514+
const requestOptions = {
515+
url: "https://api.imagekit.io/v1/files/rename",
516+
method: "POST",
517+
json: data,
518+
};
519+
520+
request(requestOptions, defaultOptions, callback);
521+
};
522+
482523
/*
483524
Copy Folder
484525
*/
@@ -640,6 +681,7 @@ export default {
640681
bulkRemoveAITags,
641682
copyFile,
642683
moveFile,
684+
renameFile,
643685
copyFolder,
644686
moveFolder,
645687
createFolder,

libs/manage/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default {
1818
bulkRemoveAITags: file.bulkRemoveAITags,
1919
copyFile: file.copyFile,
2020
moveFile: file.moveFile,
21+
renameFile: file.renameFile,
2122
copyFolder: file.copyFolder,
2223
moveFolder: file.moveFolder,
2324
createFolder: file.createFolder,

0 commit comments

Comments
 (0)