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

Merge pull request #77 from sasjs/issue-65

fix: macros are available Sessions with SASAUTOS
This commit is contained in:
Muhammad Saad
2022-03-06 02:44:38 +05:00
committed by GitHub
10 changed files with 66 additions and 77 deletions

1
.gitignore vendored
View File

@@ -7,6 +7,7 @@ sas/
tmp/
build/
sasjsbuild/
sasjscore/
certificates/
executables/
.env

View File

@@ -4,7 +4,7 @@
"description": "Api of SASjs server",
"main": "./src/server.ts",
"scripts": {
"initial": "npm run swagger && npm run compileSysInit",
"initial": "npm run swagger && npm run compileSysInit && npm run copySASjsCore",
"prestart": "npm run initial",
"prebuild": "npm run initial",
"start": "nodemon ./src/server.ts",
@@ -16,11 +16,13 @@
"lint": "npx prettier --check \"src/**/*.{ts,tsx,js,jsx,html,css,sass,less,yml,md,graphql}\"",
"package:lib": "npm run build && cp ./package.json build && cp README.md build && cd build && npm version \"5.0.0\" && npm pack",
"exe": "npm run build && npm run exe:copy && pkg .",
"exe:copy": "npm run public:copy && npm run sasjsbuild:copy && npm run web:copy",
"exe:copy": "npm run public:copy && npm run sasjsbuild:copy && npm run sasjscore:copy && npm run web:copy",
"public:copy": "cp -r ./public/ ./build/public/",
"sasjsbuild:copy": "cp -r ./sasjsbuild/ ./build/sasjsbuild/",
"sasjscore:copy": "cp -r ./sasjscore/ ./build/sasjscore/",
"web:copy": "rimraf web && mkdir web && cp -r ../web/build/ ./web/build/",
"compileSysInit": "ts-node ./scripts/compileSysInit.ts"
"compileSysInit": "ts-node ./scripts/compileSysInit.ts",
"copySASjsCore": "ts-node ./scripts/copySASjsCore.ts"
},
"bin": "./build/src/server.js",
"pkg": {

View File

@@ -223,18 +223,6 @@ components:
- fileTree
type: object
additionalProperties: false
GetFileResponse:
properties:
status:
type: string
fileContent:
type: string
message:
type: string
required:
- status
type: object
additionalProperties: false
UpdateFileResponse:
properties:
status:
@@ -610,24 +598,8 @@ paths:
get:
operationId: GetFile
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/GetFileResponse'
examples:
'Example 1':
value: {status: success, fileContent: 'Contents of the File'}
'400':
description: 'Unable to get File'
content:
application/json:
schema:
$ref: '#/components/schemas/GetFileResponse'
examples:
'Example 1':
value: {status: failure, message: 'File request failed.'}
'204':
description: 'No content'
summary: 'Get file from SASjs Drive'
tags:
- Drive

View File

@@ -21,7 +21,6 @@ const compiledSystemInit = async (systemInit: string) =>
}))
const createSysInitFile = async () => {
console.log('macroCorePath', macroCorePath)
const systemInitContent = await readFile(
path.join(__dirname, 'systemInit.sas')
)

View File

@@ -0,0 +1,25 @@
import path from 'path'
import { asyncForEach, copy, createFolder, deleteFolder } from '@sasjs/utils'
import { apiRoot, sasJSCoreMacros } from '../src/utils'
const macroCorePath = path.join(apiRoot, 'node_modules', '@sasjs', 'core')
export const copySASjsCore = async () => {
await deleteFolder(sasJSCoreMacros)
await createFolder(sasJSCoreMacros)
console.log('Copying SASjs Core Macros...')
const foldersToCopy = ['base', 'ddl', 'fcmp', 'lua', 'server']
await asyncForEach(foldersToCopy, async (coreSubFolder) => {
const coreSubFolderPath = path.join(macroCorePath, coreSubFolder)
await copy(coreSubFolderPath, sasJSCoreMacros)
})
console.log('Macros available at: ', sasJSCoreMacros)
}
copySASjsCore()

View File

@@ -1,7 +1,8 @@
import path from 'path'
import { Express } from 'express'
import express, { Express } from 'express'
import {
Security,
Request,
Route,
Tags,
Example,
@@ -14,14 +15,7 @@ import {
UploadedFile,
FormField
} from 'tsoa'
import {
fileExists,
readFile,
createFile,
moveFile,
createFolder,
deleteFile
} from '@sasjs/utils'
import { fileExists, createFile, moveFile, createFolder } from '@sasjs/utils'
import { createFileTree, ExecutionController, getTreeExample } from './internal'
import { FileTree, isFileTree, TreeNode } from '../types'
@@ -103,17 +97,12 @@ export class DriveController {
* @query filePath Location of SAS program
* @example filePath "/Public/somefolder/some.file"
*/
@Example<GetFileResponse>({
status: 'success',
fileContent: 'Contents of the File'
})
@Response<GetFileResponse>(400, 'Unable to get File', {
status: 'failure',
message: 'File request failed.'
})
@Get('/file')
public async getFile(@Query() filePath: string): Promise<GetFileResponse> {
return getFile(filePath)
public async getFile(
@Request() request: express.Request,
@Query() filePath: string
) {
return getFile(request, filePath)
}
/**
@@ -190,24 +179,22 @@ const deploy = async (data: DeployPayload) => {
return successDeployResponse
}
const getFile = async (filePath: string): Promise<GetFileResponse> => {
try {
const filePathFull = path
.join(getTmpFilesFolderPath(), filePath)
.replace(new RegExp('/', 'g'), path.sep)
const getFile = async (req: express.Request, filePath: string) => {
const driveFilesPath = getTmpFilesFolderPath()
await validateFilePath(filePathFull)
const fileContent = await readFile(filePathFull)
const filePathFull = path
.join(getTmpFilesFolderPath(), filePath)
.replace(new RegExp('/', 'g'), path.sep)
return { status: 'success', fileContent: fileContent }
} catch (err: any) {
throw {
code: 400,
status: 'failure',
message: 'File request failed.',
error: typeof err === 'object' ? err.toString() : err
}
if (!filePathFull.includes(driveFilesPath)) {
throw new Error('Cannot get file outside drive.')
}
if (!(await fileExists(filePathFull))) {
throw new Error('File does not exist.')
}
req.res?.download(filePathFull)
}
const saveFile = async (

View File

@@ -13,7 +13,8 @@ import {
extractHeaders,
generateFileUploadSasCode,
getTmpFilesFolderPath,
HTTPHeaders
HTTPHeaders,
sasJSCoreMacros
} from '../../utils'
export interface ExecutionVars {
@@ -104,6 +105,8 @@ export class ExecutionController {
`
program = `
options insert=(SASAUTOS="${sasJSCoreMacros}");
/* runtime vars */
${varStatments}
filename _webout "${weboutPath}" mod;

View File

@@ -67,7 +67,10 @@ export class SessionController {
// the autoexec file is executed on SAS startup
const autoExecPath = path.join(sessionFolder, 'autoexec.sas')
const contentForAutoExec = `/* compiled systemInit */\n${compiledSystemInitContent}\n/* autoexec */\n${autoExecContent}`
const contentForAutoExec = `/* compiled systemInit */
${compiledSystemInitContent}
/* autoexec */
${autoExecContent}`
await createFile(autoExecPath, contentForAutoExec)
// create empty code.sas as SAS will not start without a SYSIN

View File

@@ -32,14 +32,9 @@ driveRouter.get('/file', async (req, res) => {
if (error) return res.status(400).send(error.details[0].message)
try {
const response = await controller.getFile(query.filePath)
res.send(response)
await controller.getFile(req, query.filePath)
} catch (err: any) {
const statusCode = err.code
delete err.code
res.status(statusCode).send(err)
res.status(403).send(err.toString())
}
})

View File

@@ -8,6 +8,8 @@ export const sysInitCompiledPath = path.join(
'systemInitCompiled.sas'
)
export const sasJSCoreMacros = path.join(apiRoot, 'sasjscore')
export const getWebBuildFolderPath = () =>
path.join(codebaseRoot, 'web', 'build')