mirror of
https://github.com/sasjs/server.git
synced 2025-12-11 19:44:35 +00:00
feat: implemented api for renaming file/folder
This commit is contained in:
@@ -250,6 +250,21 @@ components:
|
|||||||
- folderPath
|
- folderPath
|
||||||
type: object
|
type: object
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
RenamePayload:
|
||||||
|
properties:
|
||||||
|
oldPath:
|
||||||
|
type: string
|
||||||
|
description: 'Old path of file/folder'
|
||||||
|
example: /Public/someFolder
|
||||||
|
newPath:
|
||||||
|
type: string
|
||||||
|
description: 'New path of file/folder'
|
||||||
|
example: /Public/newFolder
|
||||||
|
required:
|
||||||
|
- oldPath
|
||||||
|
- newPath
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
TreeNode:
|
TreeNode:
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
@@ -1034,6 +1049,41 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/AddFolderPayload'
|
$ref: '#/components/schemas/AddFolderPayload'
|
||||||
|
/SASjsApi/drive/rename:
|
||||||
|
post:
|
||||||
|
operationId: Rename
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Ok
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/FileFolderResponse'
|
||||||
|
examples:
|
||||||
|
'Example 1':
|
||||||
|
value: {status: success}
|
||||||
|
'409':
|
||||||
|
description: 'Folder already exists'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/FileFolderResponse'
|
||||||
|
examples:
|
||||||
|
'Example 1':
|
||||||
|
value: {status: failure, message: 'rename request failed.'}
|
||||||
|
summary: 'Renames a file/folder in SASjs Drive'
|
||||||
|
tags:
|
||||||
|
- Drive
|
||||||
|
security:
|
||||||
|
-
|
||||||
|
bearerAuth: []
|
||||||
|
parameters: []
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/RenamePayload'
|
||||||
/SASjsApi/drive/filetree:
|
/SASjsApi/drive/filetree:
|
||||||
get:
|
get:
|
||||||
operationId: GetFileTree
|
operationId: GetFileTree
|
||||||
|
|||||||
@@ -72,6 +72,19 @@ interface AddFolderPayload {
|
|||||||
folderPath: string
|
folderPath: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface RenamePayload {
|
||||||
|
/**
|
||||||
|
* Old path of file/folder
|
||||||
|
* @example "/Public/someFolder"
|
||||||
|
*/
|
||||||
|
oldPath: string
|
||||||
|
/**
|
||||||
|
* New path of file/folder
|
||||||
|
* @example "/Public/newFolder"
|
||||||
|
*/
|
||||||
|
newPath: string
|
||||||
|
}
|
||||||
|
|
||||||
const fileTreeExample = getTreeExample()
|
const fileTreeExample = getTreeExample()
|
||||||
|
|
||||||
const successDeployResponse: DeployResponse = {
|
const successDeployResponse: DeployResponse = {
|
||||||
@@ -241,6 +254,24 @@ export class DriveController {
|
|||||||
return updateFile((_filePath ?? filePath)!, file)
|
return updateFile((_filePath ?? filePath)!, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @summary Renames a file/folder in SASjs Drive
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Example<FileFolderResponse>({
|
||||||
|
status: 'success'
|
||||||
|
})
|
||||||
|
@Response<FileFolderResponse>(409, 'Folder already exists', {
|
||||||
|
status: 'failure',
|
||||||
|
message: 'rename request failed.'
|
||||||
|
})
|
||||||
|
@Post('/rename')
|
||||||
|
public async rename(
|
||||||
|
@Body() body: RenamePayload
|
||||||
|
): Promise<FileFolderResponse> {
|
||||||
|
return rename(body.oldPath, body.newPath)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @summary Fetch file tree within SASjs Drive.
|
* @summary Fetch file tree within SASjs Drive.
|
||||||
*
|
*
|
||||||
@@ -418,6 +449,46 @@ const addFolder = async (folderPath: string): Promise<FileFolderResponse> => {
|
|||||||
return { status: 'success' }
|
return { status: 'success' }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const rename = async (
|
||||||
|
oldPath: string,
|
||||||
|
newPath: string
|
||||||
|
): Promise<FileFolderResponse> => {
|
||||||
|
const drivePath = getFilesFolder()
|
||||||
|
|
||||||
|
const oldPathFull = path
|
||||||
|
.join(drivePath, oldPath)
|
||||||
|
.replace(new RegExp('/', 'g'), path.sep)
|
||||||
|
|
||||||
|
const newPathFull = path
|
||||||
|
.join(drivePath, newPath)
|
||||||
|
.replace(new RegExp('/', 'g'), path.sep)
|
||||||
|
|
||||||
|
if (!oldPathFull.includes(drivePath)) {
|
||||||
|
throw new Error('Old path is outside drive.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newPathFull.includes(drivePath)) {
|
||||||
|
throw new Error('New path is outside drive.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await folderExists(oldPathFull)) {
|
||||||
|
if (await folderExists(newPathFull)) {
|
||||||
|
throw new Error('Folder already exists.')
|
||||||
|
} else moveFile(oldPathFull, newPathFull)
|
||||||
|
|
||||||
|
return { status: 'success' }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await fileExists(oldPathFull)) {
|
||||||
|
if (await fileExists(newPathFull)) {
|
||||||
|
throw new Error('File already exists.')
|
||||||
|
} else moveFile(oldPath, newPathFull)
|
||||||
|
return { status: 'success' }
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('No file/folder found for provided path.')
|
||||||
|
}
|
||||||
|
|
||||||
const updateFile = async (
|
const updateFile = async (
|
||||||
filePath: string,
|
filePath: string,
|
||||||
multerFile: Express.Multer.File
|
multerFile: Express.Multer.File
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ import {
|
|||||||
fileParamValidation,
|
fileParamValidation,
|
||||||
folderBodyValidation,
|
folderBodyValidation,
|
||||||
folderParamValidation,
|
folderParamValidation,
|
||||||
isZipFile
|
isZipFile,
|
||||||
|
renameBodyValidation
|
||||||
} from '../../utils'
|
} from '../../utils'
|
||||||
|
|
||||||
const controller = new DriveController()
|
const controller = new DriveController()
|
||||||
@@ -232,6 +233,19 @@ driveRouter.patch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
driveRouter.post('/rename', async (req, res) => {
|
||||||
|
const { error, value: body } = renameBodyValidation(req.body)
|
||||||
|
|
||||||
|
if (error) return res.status(400).send(error.details[0].message)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await controller.rename(body)
|
||||||
|
res.send(response)
|
||||||
|
} catch (err: any) {
|
||||||
|
res.status(403).send(err.toString())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
driveRouter.get('/fileTree', async (req, res) => {
|
driveRouter.get('/fileTree', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const response = await controller.getFileTree()
|
const response = await controller.getFileTree()
|
||||||
|
|||||||
@@ -140,12 +140,18 @@ export const fileParamValidation = (data: any): Joi.ValidationResult =>
|
|||||||
|
|
||||||
export const folderParamValidation = (data: any): Joi.ValidationResult =>
|
export const folderParamValidation = (data: any): Joi.ValidationResult =>
|
||||||
Joi.object({
|
Joi.object({
|
||||||
_folderPath: Joi.string()
|
_folderPath: Joi.string().required()
|
||||||
}).validate(data)
|
}).validate(data)
|
||||||
|
|
||||||
export const folderBodyValidation = (data: any): Joi.ValidationResult =>
|
export const folderBodyValidation = (data: any): Joi.ValidationResult =>
|
||||||
Joi.object({
|
Joi.object({
|
||||||
folderPath: Joi.string()
|
folderPath: Joi.string().required()
|
||||||
|
}).validate(data)
|
||||||
|
|
||||||
|
export const renameBodyValidation = (data: any): Joi.ValidationResult =>
|
||||||
|
Joi.object({
|
||||||
|
oldPath: Joi.string().required(),
|
||||||
|
newPath: Joi.string().required()
|
||||||
}).validate(data)
|
}).validate(data)
|
||||||
|
|
||||||
export const runCodeValidation = (data: any): Joi.ValidationResult =>
|
export const runCodeValidation = (data: any): Joi.ValidationResult =>
|
||||||
|
|||||||
Reference in New Issue
Block a user