1
0
mirror of https://github.com/sasjs/server.git synced 2025-12-10 11:24:35 +00:00

fix(upload): added query param as well for filepath

This commit is contained in:
Saad Jutt
2022-02-28 22:34:18 +05:00
parent 8c1941a87b
commit feeec4eb14
5 changed files with 56 additions and 13 deletions

View File

@@ -669,7 +669,13 @@ paths:
security:
-
bearerAuth: []
parameters: []
parameters:
-
in: query
name: _filePath
required: false
schema:
type: string
requestBody:
required: true
content:
@@ -677,13 +683,12 @@ paths:
schema:
type: object
properties:
filePath:
type: string
file:
type: string
format: binary
filePath:
type: string
required:
- filePath
- file
patch:
operationId: UpdateFile

View File

@@ -129,10 +129,11 @@ export class DriveController {
})
@Post('/file')
public async saveFile(
@FormField() filePath: string,
@UploadedFile() file: Express.Multer.File
@UploadedFile() file: Express.Multer.File,
@Query() _filePath?: string,
@FormField() filePath?: string
): Promise<UpdateFileResponse> {
return saveFile(filePath, file)
return saveFile((_filePath ?? filePath)!, file)
}
/**

View File

@@ -3,7 +3,12 @@ import { deleteFile } from '@sasjs/utils'
import { multerSingle } from '../../middlewares/multer'
import { DriveController } from '../../controllers/'
import { getFileDriveValidation, updateFileDriveValidation } from '../../utils'
import {
getFileDriveValidation,
updateFileDriveValidation,
uploadFileBodyValidation,
uploadFileParamValidation
} from '../../utils'
const controller = new DriveController()
@@ -42,16 +47,22 @@ driveRouter.post(
'/file',
(...arg) => multerSingle('file', arg),
async (req, res) => {
const { error, value: body } = updateFileDriveValidation(req.body)
if (error) {
const { error: errQ, value: query } = uploadFileParamValidation(req.query)
const { error: errB, value: body } = uploadFileBodyValidation(req.body)
if (errQ && errB) {
if (req.file) await deleteFile(req.file.path)
return res.status(400).send(error.details[0].message)
return res.status(400).send(errB.details[0].message)
}
if (!req.file) return res.status(400).send('"file" is not present.')
try {
const response = await controller.saveFile(body.filePath, req.file)
const response = await controller.saveFile(
req.file,
query._filePath,
body.filePath
)
res.send(response)
} catch (err: any) {
await deleteFile(req.file.path)

View File

@@ -172,7 +172,7 @@ describe('files', () => {
describe('file', () => {
describe('create', () => {
it('should create a SAS file on drive', async () => {
it('should create a SAS file on drive having filePath as form field', async () => {
const res = await request(app)
.post('/SASjsApi/drive/file')
.auth(accessToken, { type: 'bearer' })
@@ -185,6 +185,19 @@ describe('files', () => {
})
})
it('should create a SAS file on drive having _filePath as query param', async () => {
const res = await request(app)
.post('/SASjsApi/drive/file')
.auth(accessToken, { type: 'bearer' })
.query({ _filePath: '/my/path/code1.sas' })
.attach('file', path.join(__dirname, 'files', 'sample.sas'))
expect(res.statusCode).toEqual(200)
expect(res.body).toEqual({
status: 'success'
})
})
it('should respond with Unauthorized if access token is not present', async () => {
const res = await request(app)
.post('/SASjsApi/drive/file')

View File

@@ -72,12 +72,25 @@ export const getFileDriveValidation = (data: any): Joi.ValidationResult =>
}).validate(data)
export const updateFileDriveValidation = (data: any): Joi.ValidationResult =>
Joi.object({
filePath: Joi.string().required(),
fileContent: Joi.string().required()
}).validate(data)
export const uploadFileBodyValidation = (data: any): Joi.ValidationResult =>
Joi.object({
filePath: Joi.string().pattern(/.sas$/).required().messages({
'string.pattern.base': `Valid extensions for filePath: .sas`
})
}).validate(data)
export const uploadFileParamValidation = (data: any): Joi.ValidationResult =>
Joi.object({
_filePath: Joi.string().pattern(/.sas$/).required().messages({
'string.pattern.base': `Valid extensions for filePath: .sas`
})
}).validate(data)
export const runSASValidation = (data: any): Joi.ValidationResult =>
Joi.object({
code: Joi.string().required()