mirror of
https://github.com/sasjs/server.git
synced 2026-04-09 23:23:13 +00:00
chore: Merge branch 'main' into issue-184
This commit is contained in:
6
api/src/utils/extractName.ts
Normal file
6
api/src/utils/extractName.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import path from 'path'
|
||||
|
||||
export const extractName = (filePath: string) => {
|
||||
const extension = path.extname(filePath)
|
||||
return path.basename(filePath, extension)
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import path from 'path'
|
||||
import { homedir } from 'os'
|
||||
import fs from 'fs-extra'
|
||||
|
||||
export const apiRoot = path.join(__dirname, '..', '..')
|
||||
export const codebaseRoot = path.join(apiRoot, '..')
|
||||
@@ -47,3 +48,6 @@ export const generateUniqueFileName = (fileName: string, extension = '') =>
|
||||
new Date().getTime(),
|
||||
extension
|
||||
].join('')
|
||||
|
||||
export const createReadStream = async (filePath: string) =>
|
||||
fs.createReadStream(filePath)
|
||||
|
||||
@@ -3,6 +3,7 @@ export * from './connectDB'
|
||||
export * from './copySASjsCore'
|
||||
export * from './desktopAutoExec'
|
||||
export * from './extractHeaders'
|
||||
export * from './extractName'
|
||||
export * from './file'
|
||||
export * from './generateAccessToken'
|
||||
export * from './generateAuthCode'
|
||||
@@ -14,6 +15,7 @@ export * from './getRunTimeAndFilePath'
|
||||
export * from './getServerUrl'
|
||||
export * from './instantiateLogger'
|
||||
export * from './isDebugOn'
|
||||
export * from './zipped'
|
||||
export * from './parseLogToArray'
|
||||
export * from './removeTokensInDB'
|
||||
export * from './saveTokensInDB'
|
||||
|
||||
@@ -3,6 +3,7 @@ import { RunTimeType } from '.'
|
||||
|
||||
const usernameSchema = Joi.string().lowercase().alphanum().min(3).max(16)
|
||||
const passwordSchema = Joi.string().min(6).max(1024)
|
||||
const groupnameSchema = Joi.string().lowercase().alphanum().min(3).max(16)
|
||||
|
||||
export const blockFileRegex = /\.(exe|sh|htaccess)$/i
|
||||
|
||||
@@ -30,11 +31,16 @@ export const tokenValidation = (data: any): Joi.ValidationResult =>
|
||||
|
||||
export const registerGroupValidation = (data: any): Joi.ValidationResult =>
|
||||
Joi.object({
|
||||
name: Joi.string().min(6).required(),
|
||||
name: groupnameSchema.required(),
|
||||
description: Joi.string(),
|
||||
isActive: Joi.boolean()
|
||||
}).validate(data)
|
||||
|
||||
export const getGroupValidation = (data: any): Joi.ValidationResult =>
|
||||
Joi.object({
|
||||
name: groupnameSchema.required()
|
||||
}).validate(data)
|
||||
|
||||
export const registerUserValidation = (data: any): Joi.ValidationResult =>
|
||||
Joi.object({
|
||||
displayName: Joi.string().min(6).required(),
|
||||
|
||||
40
api/src/utils/zipped.ts
Normal file
40
api/src/utils/zipped.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import path from 'path'
|
||||
import unZipper from 'unzipper'
|
||||
import { extractName } from './extractName'
|
||||
import { createReadStream } from './file'
|
||||
|
||||
export const isZipFile = (
|
||||
file: Express.Multer.File
|
||||
): { error?: string; value?: Express.Multer.File } => {
|
||||
const fileExtension = path.extname(file.originalname)
|
||||
if (fileExtension.toUpperCase() !== '.ZIP')
|
||||
return { error: `"file" has invalid extension ${fileExtension}` }
|
||||
|
||||
const allowedMimetypes = ['application/zip', 'application/x-zip-compressed']
|
||||
|
||||
if (!allowedMimetypes.includes(file.mimetype))
|
||||
return { error: `"file" has invalid type ${file.mimetype}` }
|
||||
|
||||
return { value: file }
|
||||
}
|
||||
|
||||
export const extractJSONFromZip = async (zipFile: Express.Multer.File) => {
|
||||
let fileContent: string = ''
|
||||
|
||||
const fileInZip = extractName(zipFile.originalname)
|
||||
const zip = (await createReadStream(zipFile.path)).pipe(
|
||||
unZipper.Parse({ forceStream: true })
|
||||
)
|
||||
|
||||
for await (const entry of zip) {
|
||||
const fileName = entry.path as string
|
||||
if (fileName.toUpperCase().endsWith('.JSON') && fileName === fileInZip) {
|
||||
fileContent = await entry.buffer()
|
||||
break
|
||||
} else {
|
||||
entry.autodrain()
|
||||
}
|
||||
}
|
||||
|
||||
return fileContent
|
||||
}
|
||||
Reference in New Issue
Block a user