From 643412340162e854f31fba2f162d83b7ab1751d8 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Tue, 11 Oct 2022 18:37:20 +0200 Subject: [PATCH 1/5] feat: cli mock testing --- .gitignore | 2 - README.md | 4 + api/mocks/custom/.keep | 0 .../{generic/sas9 => sas9/generic}/logged-in | 0 .../{generic/sas9 => sas9/generic}/logged-out | 0 .../{generic/sas9 => sas9/generic}/login | 2 +- .../generic}/public-access-denied | 0 .../sas9 => sas9/generic}/sas-stored-process | 0 api/src/app.ts | 1 + api/src/controllers/mock-sas9.ts | 131 ++++++++++++++++-- api/src/routes/setupRoutes.ts | 2 +- api/src/routes/web/index.ts | 3 +- api/src/routes/web/sas9-web.ts | 39 +++++- 13 files changed, 166 insertions(+), 18 deletions(-) delete mode 100644 api/mocks/custom/.keep rename api/mocks/{generic/sas9 => sas9/generic}/logged-in (100%) rename api/mocks/{generic/sas9 => sas9/generic}/logged-out (100%) rename api/mocks/{generic/sas9 => sas9/generic}/login (91%) rename api/mocks/{generic/sas9 => sas9/generic}/public-access-denied (100%) rename api/mocks/{generic/sas9 => sas9/generic}/sas-stored-process (100%) diff --git a/.gitignore b/.gitignore index bb6d85e..9c567ce 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,6 @@ node_modules/ .env* sas/ sasjs_root/ -api/mocks/custom/* -!api/mocks/custom/.keep tmp/ build/ sasjsbuild/ diff --git a/README.md b/README.md index 7b1c173..174bd05 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,10 @@ PORT= # If not present, mocking function is disabled MOCK_SERVERTYPE= +# Path to mocking folder, it's sub directories should be: sas9, viya, sasjs +# Server will automatically use sub directory accordingly +STATIC_MOCK_LOCATION= + # ## Additional SAS Options # diff --git a/api/mocks/custom/.keep b/api/mocks/custom/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/api/mocks/generic/sas9/logged-in b/api/mocks/sas9/generic/logged-in similarity index 100% rename from api/mocks/generic/sas9/logged-in rename to api/mocks/sas9/generic/logged-in diff --git a/api/mocks/generic/sas9/logged-out b/api/mocks/sas9/generic/logged-out similarity index 100% rename from api/mocks/generic/sas9/logged-out rename to api/mocks/sas9/generic/logged-out diff --git a/api/mocks/generic/sas9/login b/api/mocks/sas9/generic/login similarity index 91% rename from api/mocks/generic/sas9/login rename to api/mocks/sas9/generic/login index a34b391..0e75b57 100644 --- a/api/mocks/generic/sas9/login +++ b/api/mocks/sas9/generic/login @@ -9,7 +9,7 @@
- + diff --git a/api/mocks/generic/sas9/public-access-denied b/api/mocks/sas9/generic/public-access-denied similarity index 100% rename from api/mocks/generic/sas9/public-access-denied rename to api/mocks/sas9/generic/public-access-denied diff --git a/api/mocks/generic/sas9/sas-stored-process b/api/mocks/sas9/generic/sas-stored-process similarity index 100% rename from api/mocks/generic/sas9/sas-stored-process rename to api/mocks/sas9/generic/sas-stored-process diff --git a/api/src/app.ts b/api/src/app.ts index 073b311..1e60be8 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -57,6 +57,7 @@ export default setProcessVariables().then(async () => { app.use(express.json({ limit: '100mb' })) app.use(express.static(path.join(__dirname, '../public'))) + app.use(express.urlencoded({ extended: true })) // Body parser is used for decoding the formdata on POST request. // Currently only place we use it is SAS9 Mock - POST /SASLogon/login diff --git a/api/src/controllers/mock-sas9.ts b/api/src/controllers/mock-sas9.ts index 8a78778..166daff 100644 --- a/api/src/controllers/mock-sas9.ts +++ b/api/src/controllers/mock-sas9.ts @@ -2,6 +2,11 @@ import { readFile } from '@sasjs/utils' import express from 'express' import path from 'path' import { Request, Post, Get } from 'tsoa' +import fs from 'fs' +import fse from 'fs-extra' +import dotenv from 'dotenv' + +dotenv.config() export interface Sas9Response { content: string @@ -16,9 +21,17 @@ export interface MockFileRead { export class MockSas9Controller { private loggedIn: string | undefined + private mocksPath = process.env.STATIC_MOCK_LOCATION || 'mocks' @Get('/SASStoredProcess') - public async sasStoredProcess(): Promise { + public async sasStoredProcess( + @Request() req: express.Request + ): Promise { + let username = req.query._username?.toString() || undefined + let password = req.query._password?.toString() || undefined + + if (username && password) this.loggedIn = req.body.username + if (!this.loggedIn) { return { content: '', @@ -26,17 +39,66 @@ export class MockSas9Controller { } } + let program = req.query._program?.toString() || undefined + let filePath: string[] = ['generic', 'sas-stored-process'] + + if (program) { + filePath = program.replace('/', '').split('/') + return await getMockResponseFromFile([ + process.cwd(), + this.mocksPath, + 'sas9', + ...filePath + ]) + } + return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', - 'sas-stored-process' + ...filePath + ]) + } + + @Get('/SASStoredProcess/do') + public async sasStoredProcessDoGet( + @Request() req: express.Request + ): Promise { + let username = req.query._username?.toString() || undefined + let password = req.query._password?.toString() || undefined + + if (username && password) this.loggedIn = username + + if (!this.loggedIn) { + return { + content: '', + redirect: '/SASLogon/login' + } + } + + let program = req.query._program?.toString() || undefined + let filePath: string[] = ['generic', 'sas-stored-process'] + + if (program) { + filePath = `${program}`.replace('/', '').split('/') + return await getMockResponseFromFile([ + process.cwd(), + this.mocksPath, + 'sas9', + ...filePath + ]) + } + + return await getMockResponseFromFile([ + process.cwd(), + 'mocks', + 'sas9', + ...filePath ]) } @Post('/SASStoredProcess/do/') - public async sasStoredProcessDo( + public async sasStoredProcessDoPost( @Request() req: express.Request ): Promise { if (!this.loggedIn) { @@ -55,13 +117,56 @@ export class MockSas9Controller { let program = req.query._program?.toString() || '' program = program.replace('/', '') + let debug = req.query._debug?.toString() + + let fileContents = '' + + if (program.includes('runner') && debug === 'log') { + if (req.files && req.files.length > 0) { + const regexRequest = /cli-tests-request-sas9-.*?\d*/g + const uploadFilePath = (req.files as any)[0].path + + fileContents = fs.readFileSync(uploadFilePath, 'utf8') + + let matched = fileContents.match(regexRequest)?.[0] + + if (matched) { + const testsFolderPath = path.join( + process.cwd(), + this.mocksPath, + 'sas9', + 'User Folders', + 'cli-tests', + 'sasdemo', + matched + ) + + if (!fs.existsSync(testsFolderPath)) fs.mkdirSync(testsFolderPath) + + fse.copySync( + path.join( + process.cwd(), + this.mocksPath, + 'sas9', + 'User Folders', + 'sasdemo', + 'services' + ), + path.join(testsFolderPath, 'services') + ) + } + } + } const content = await getMockResponseFromFile([ process.cwd(), - 'mocks', + this.mocksPath, + 'sas9', ...program.split('/') ]) + content.content += fileContents + if (content.error) { return content } @@ -85,8 +190,8 @@ export class MockSas9Controller { return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', + 'generic', 'logged-in' ]) } @@ -95,21 +200,27 @@ export class MockSas9Controller { return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', + 'generic', 'login' ]) } @Post('/SASLogon/login') public async loginPost(req: express.Request): Promise { + if (req.body.lt && req.body.lt !== 'validtoken') + return { + content: '', + redirect: '/SASLogon/login' + } + this.loggedIn = req.body.username return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', + 'generic', 'logged-in' ]) } @@ -122,8 +233,8 @@ export class MockSas9Controller { return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', + 'generic', 'public-access-denied' ]) } @@ -131,8 +242,8 @@ export class MockSas9Controller { return await getMockResponseFromFile([ process.cwd(), 'mocks', - 'generic', 'sas9', + 'generic', 'logged-out' ]) } diff --git a/api/src/routes/setupRoutes.ts b/api/src/routes/setupRoutes.ts index a31aae6..a189d1d 100644 --- a/api/src/routes/setupRoutes.ts +++ b/api/src/routes/setupRoutes.ts @@ -15,5 +15,5 @@ export const setupRoutes = (app: Express) => { appStreamRouter(req, res, next) }) - app.use('/', csrfProtection, webRouter) + app.use('/', webRouter) } diff --git a/api/src/routes/web/index.ts b/api/src/routes/web/index.ts index 7bd4b82..bcd3aa1 100644 --- a/api/src/routes/web/index.ts +++ b/api/src/routes/web/index.ts @@ -3,6 +3,7 @@ import sas9WebRouter from './sas9-web' import sasViyaWebRouter from './sasviya-web' import webRouter from './web' import { MOCK_SERVERTYPEType } from '../../utils' +import { csrfProtection } from '../../middlewares' const router = express.Router() @@ -18,7 +19,7 @@ switch (MOCK_SERVERTYPE) { break } default: { - router.use('/', webRouter) + router.use('/', csrfProtection, webRouter) } } diff --git a/api/src/routes/web/sas9-web.ts b/api/src/routes/web/sas9-web.ts index f48577a..797cedc 100644 --- a/api/src/routes/web/sas9-web.ts +++ b/api/src/routes/web/sas9-web.ts @@ -2,6 +2,12 @@ import express from 'express' import { generateCSRFToken } from '../../middlewares' import { WebController } from '../../controllers' import { MockSas9Controller } from '../../controllers/mock-sas9' +import fs from 'fs' +import multer from 'multer' +import path from 'path' +import dotenv from 'dotenv' + +dotenv.config() const sas9WebRouter = express.Router() const webController = new WebController() @@ -9,6 +15,12 @@ const webController = new WebController() // for example `isLoggedIn` and potentially more in future mocks const controller = new MockSas9Controller() +const mockPath = process.env.STATIC_MOCK_LOCATION || 'mocks' + +const upload = multer({ + dest: path.join(process.cwd(), mockPath, 'sas9', 'files-recieved') +}) + sas9WebRouter.get('/', async (req, res) => { let response try { @@ -27,7 +39,7 @@ sas9WebRouter.get('/', async (req, res) => { }) sas9WebRouter.get('/SASStoredProcess', async (req, res) => { - const response = await controller.sasStoredProcess() + const response = await controller.sasStoredProcess(req) if (response.redirect) { res.redirect(response.redirect) @@ -41,8 +53,29 @@ sas9WebRouter.get('/SASStoredProcess', async (req, res) => { } }) -sas9WebRouter.post('/SASStoredProcess/do/', async (req, res) => { - const response = await controller.sasStoredProcessDo(req) +sas9WebRouter.get('/SASStoredProcess/do/', async (req, res) => { + const response = await controller.sasStoredProcessDoGet(req) + + if (response.redirect) { + res.redirect(response.redirect) + return + } + + try { + res.send(response.content) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) + +sas9WebRouter.post('/SASStoredProcess/do/', upload.any(), async (req, res) => { + const response = await controller.sasStoredProcessDoPost(req) + + if (req.files) { + ;(req.files as any).forEach((file: any) => { + fs.renameSync(file.path, file.destination + '/' + file.fieldname) + }) + } if (response.redirect) { res.redirect(response.redirect) From 36be3a7d5e7df79f9a1f3f00c3661b925f462383 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Mon, 17 Oct 2022 18:31:08 +0200 Subject: [PATCH 2/5] feat: mocking sas9 responses with JS STP --- README.md | 5 +- api/src/controllers/internal/Execution.ts | 12 +- .../controllers/internal/processProgram.ts | 4 - api/src/controllers/mock-sas9.ts | 144 ++++++++---------- api/src/routes/web/sas9-web.ts | 36 ++--- api/src/utils/getPreProgramVariables.ts | 8 +- api/src/utils/setProcessVariables.ts | 1 - 7 files changed, 96 insertions(+), 114 deletions(-) diff --git a/README.md b/README.md index 174bd05..4a1d1a6 100644 --- a/README.md +++ b/README.md @@ -103,8 +103,9 @@ PORT= # If not present, mocking function is disabled MOCK_SERVERTYPE= -# Path to mocking folder, it's sub directories should be: sas9, viya, sasjs -# Server will automatically use sub directory accordingly +# default: /api/mocks +# Path to mocking folder, for generic responses, it's sub directories should be: sas9, viya, sasjs +# Server will automatically use subdirectory accordingly STATIC_MOCK_LOCATION= # diff --git a/api/src/controllers/internal/Execution.ts b/api/src/controllers/internal/Execution.ts index e96e7c4..b7df0ab 100644 --- a/api/src/controllers/internal/Execution.ts +++ b/api/src/controllers/internal/Execution.ts @@ -28,6 +28,7 @@ interface ExecuteFileParams { returnJson?: boolean session?: Session runTime: RunTimeType + forceStringResult?: boolean } interface ExecuteProgramParams extends Omit { @@ -42,7 +43,8 @@ export class ExecutionController { otherArgs, returnJson, session, - runTime + runTime, + forceStringResult }: ExecuteFileParams) { const program = await readFile(programPath) @@ -53,7 +55,8 @@ export class ExecutionController { otherArgs, returnJson, session, - runTime + runTime, + forceStringResult }) } @@ -63,7 +66,8 @@ export class ExecutionController { vars, otherArgs, session: sessionByFileUpload, - runTime + runTime, + forceStringResult }: ExecuteProgramParams): Promise { const sessionController = getSessionController(runTime) @@ -104,7 +108,7 @@ export class ExecutionController { const fileResponse: boolean = httpHeaders.hasOwnProperty('content-type') const webout = (await fileExists(weboutPath)) - ? fileResponse + ? fileResponse && !forceStringResult ? await readFileBinary(weboutPath) : await readFile(weboutPath) : '' diff --git a/api/src/controllers/internal/processProgram.ts b/api/src/controllers/internal/processProgram.ts index ca4a9d4..ff52c9d 100644 --- a/api/src/controllers/internal/processProgram.ts +++ b/api/src/controllers/internal/processProgram.ts @@ -110,17 +110,13 @@ export const processProgram = async ( // create a stream that will write to console outputs to log file const writeStream = fs.createWriteStream(logPath) - // waiting for the open event so that we can have underlying file descriptor await once(writeStream, 'open') - execFileSync(executablePath, [codePath], { stdio: ['ignore', writeStream, writeStream] }) - // copy the code file to log and end write stream writeStream.end(program) - session.completed = true console.log('session completed', session) } catch (err: any) { diff --git a/api/src/controllers/mock-sas9.ts b/api/src/controllers/mock-sas9.ts index 166daff..cff63c1 100644 --- a/api/src/controllers/mock-sas9.ts +++ b/api/src/controllers/mock-sas9.ts @@ -2,9 +2,14 @@ import { readFile } from '@sasjs/utils' import express from 'express' import path from 'path' import { Request, Post, Get } from 'tsoa' -import fs from 'fs' -import fse from 'fs-extra' import dotenv from 'dotenv' +import { ExecutionController } from './internal' +import { + getPreProgramVariables, + getRunTimeAndFilePath, + makeFilesNamesMap +} from '../utils' +import { MulterFile } from '../types/Upload' dotenv.config() @@ -76,17 +81,37 @@ export class MockSas9Controller { } } - let program = req.query._program?.toString() || undefined + const program = req.query._program ?? req.body?._program let filePath: string[] = ['generic', 'sas-stored-process'] if (program) { - filePath = `${program}`.replace('/', '').split('/') - return await getMockResponseFromFile([ - process.cwd(), - this.mocksPath, - 'sas9', - ...filePath - ]) + const vars = { ...req.query, ...req.body, _requestMethod: req.method } + const otherArgs = {} + + try { + const { codePath, runTime } = await getRunTimeAndFilePath( + program + '.js' + ) + + const result = await new ExecutionController().executeFile({ + programPath: codePath, + preProgramVariables: getPreProgramVariables(req), + vars: vars, + otherArgs: otherArgs, + runTime, + forceStringResult: true + }) + + return { + content: result.result as string + } + } catch (err) { + console.log('err', err) + } + + return { + content: 'No webout returned.' + } } return await getMockResponseFromFile([ @@ -115,66 +140,38 @@ export class MockSas9Controller { } } - let program = req.query._program?.toString() || '' - program = program.replace('/', '') - let debug = req.query._debug?.toString() + const program = req.query._program ?? req.body?._program + const vars = { + ...req.query, + ...req.body, + _requestMethod: req.method, + _driveLoc: process.driveLoc + } + const filesNamesMap = req.files?.length + ? makeFilesNamesMap(req.files as MulterFile[]) + : null + const otherArgs = { filesNamesMap: filesNamesMap } + const { codePath, runTime } = await getRunTimeAndFilePath(program + '.js') + try { + const result = await new ExecutionController().executeFile({ + programPath: codePath, + preProgramVariables: getPreProgramVariables(req), + vars: vars, + otherArgs: otherArgs, + runTime, + session: req.sasjsSession, + forceStringResult: true + }) - let fileContents = '' - - if (program.includes('runner') && debug === 'log') { - if (req.files && req.files.length > 0) { - const regexRequest = /cli-tests-request-sas9-.*?\d*/g - const uploadFilePath = (req.files as any)[0].path - - fileContents = fs.readFileSync(uploadFilePath, 'utf8') - - let matched = fileContents.match(regexRequest)?.[0] - - if (matched) { - const testsFolderPath = path.join( - process.cwd(), - this.mocksPath, - 'sas9', - 'User Folders', - 'cli-tests', - 'sasdemo', - matched - ) - - if (!fs.existsSync(testsFolderPath)) fs.mkdirSync(testsFolderPath) - - fse.copySync( - path.join( - process.cwd(), - this.mocksPath, - 'sas9', - 'User Folders', - 'sasdemo', - 'services' - ), - path.join(testsFolderPath, 'services') - ) - } + return { + content: result.result as string } + } catch (err) { + console.log('err', err) } - const content = await getMockResponseFromFile([ - process.cwd(), - this.mocksPath, - 'sas9', - ...program.split('/') - ]) - - content.content += fileContents - - if (content.error) { - return content - } - - const parsedContent = parseJsonIfValid(content.content) - return { - content: parsedContent + content: 'No webout returned.' } } @@ -263,23 +260,6 @@ export class MockSas9Controller { private isPublicAccount = () => this.loggedIn?.toLowerCase() === 'public' } -/** - * If JSON is valid it will be parsed otherwise will return text unaltered - * @param content string to be parsed - * @returns JSON or string - */ -const parseJsonIfValid = (content: string) => { - let fileContent = '' - - try { - fileContent = JSON.parse(content) - } catch (err: any) { - fileContent = content - } - - return fileContent -} - const getMockResponseFromFile = async ( filePath: string[] ): Promise => { diff --git a/api/src/routes/web/sas9-web.ts b/api/src/routes/web/sas9-web.ts index 797cedc..7294a94 100644 --- a/api/src/routes/web/sas9-web.ts +++ b/api/src/routes/web/sas9-web.ts @@ -2,10 +2,10 @@ import express from 'express' import { generateCSRFToken } from '../../middlewares' import { WebController } from '../../controllers' import { MockSas9Controller } from '../../controllers/mock-sas9' -import fs from 'fs' import multer from 'multer' import path from 'path' import dotenv from 'dotenv' +import { FileUploadController } from '../../controllers/internal' dotenv.config() @@ -14,6 +14,7 @@ const webController = new WebController() // Mock controller must be singleton because it keeps the states // for example `isLoggedIn` and potentially more in future mocks const controller = new MockSas9Controller() +const fileUploadController = new FileUploadController() const mockPath = process.env.STATIC_MOCK_LOCATION || 'mocks' @@ -68,26 +69,25 @@ sas9WebRouter.get('/SASStoredProcess/do/', async (req, res) => { } }) -sas9WebRouter.post('/SASStoredProcess/do/', upload.any(), async (req, res) => { - const response = await controller.sasStoredProcessDoPost(req) +sas9WebRouter.post( + '/SASStoredProcess/do/', + fileUploadController.preUploadMiddleware, + fileUploadController.getMulterUploadObject().any(), + async (req, res) => { + const response = await controller.sasStoredProcessDoPost(req) - if (req.files) { - ;(req.files as any).forEach((file: any) => { - fs.renameSync(file.path, file.destination + '/' + file.fieldname) - }) - } + if (response.redirect) { + res.redirect(response.redirect) + return + } - if (response.redirect) { - res.redirect(response.redirect) - return + try { + res.send(response.content) + } catch (err: any) { + res.status(403).send(err.toString()) + } } - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } -}) +) sas9WebRouter.get('/SASLogon/login', async (req, res) => { const response = await controller.loginGet() diff --git a/api/src/utils/getPreProgramVariables.ts b/api/src/utils/getPreProgramVariables.ts index 396fa9f..5e2d26a 100644 --- a/api/src/utils/getPreProgramVariables.ts +++ b/api/src/utils/getPreProgramVariables.ts @@ -18,10 +18,12 @@ export const getPreProgramVariables = (req: Request): PreProgramVars => { if (cookies.length) httpHeaders.push(`cookie: ${cookies.join('; ')}`) + //In desktop mode when mocking mode is enabled, user was undefined. + //So this is workaround. return { - username: user!.username, - userId: user!.userId, - displayName: user!.displayName, + username: user ? user.username : 'demo', + userId: user ? user.userId : 0, + displayName: user ? user.displayName : 'demo', serverUrl: protocol + host, httpHeaders } diff --git a/api/src/utils/setProcessVariables.ts b/api/src/utils/setProcessVariables.ts index 395e5fc..574508b 100644 --- a/api/src/utils/setProcessVariables.ts +++ b/api/src/utils/setProcessVariables.ts @@ -32,7 +32,6 @@ export const setProcessVariables = async () => { process.rLoc = process.env.R_PATH } else { const { sasLoc, nodeLoc, pythonLoc, rLoc } = await getDesktopFields() - process.sasLoc = sasLoc process.nodeLoc = nodeLoc process.pythonLoc = pythonLoc From fe5ae44aabf8bdf66126b11dacb5492dfd37da8f Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Mon, 17 Oct 2022 18:32:58 +0200 Subject: [PATCH 3/5] chore: typo --- api/src/routes/web/sas9-web.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/routes/web/sas9-web.ts b/api/src/routes/web/sas9-web.ts index 7294a94..ce9cddd 100644 --- a/api/src/routes/web/sas9-web.ts +++ b/api/src/routes/web/sas9-web.ts @@ -19,7 +19,7 @@ const fileUploadController = new FileUploadController() const mockPath = process.env.STATIC_MOCK_LOCATION || 'mocks' const upload = multer({ - dest: path.join(process.cwd(), mockPath, 'sas9', 'files-recieved') + dest: path.join(process.cwd(), mockPath, 'sas9', 'files-received') }) sas9WebRouter.get('/', async (req, res) => { From 81f0b03b0903448997ab73c793dd8fb0cb59e6d5 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Fri, 28 Oct 2022 11:53:25 +0200 Subject: [PATCH 4/5] chore: comments address --- api/src/app.ts | 1 - api/src/controllers/mock-sas9.ts | 13 ++++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/api/src/app.ts b/api/src/app.ts index 1e60be8..073b311 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -57,7 +57,6 @@ export default setProcessVariables().then(async () => { app.use(express.json({ limit: '100mb' })) app.use(express.static(path.join(__dirname, '../public'))) - app.use(express.urlencoded({ extended: true })) // Body parser is used for decoding the formdata on POST request. // Currently only place we use it is SAS9 Mock - POST /SASLogon/login diff --git a/api/src/controllers/mock-sas9.ts b/api/src/controllers/mock-sas9.ts index cff63c1..2393f83 100644 --- a/api/src/controllers/mock-sas9.ts +++ b/api/src/controllers/mock-sas9.ts @@ -32,8 +32,8 @@ export class MockSas9Controller { public async sasStoredProcess( @Request() req: express.Request ): Promise { - let username = req.query._username?.toString() || undefined - let password = req.query._password?.toString() || undefined + const username = req.query._username?.toString() || undefined + const password = req.query._password?.toString() || undefined if (username && password) this.loggedIn = req.body.username @@ -45,10 +45,9 @@ export class MockSas9Controller { } let program = req.query._program?.toString() || undefined - let filePath: string[] = ['generic', 'sas-stored-process'] + const filePath: string[] = program ? program.replace('/', '').split('/') : ['generic', 'sas-stored-process'] if (program) { - filePath = program.replace('/', '').split('/') return await getMockResponseFromFile([ process.cwd(), this.mocksPath, @@ -69,8 +68,8 @@ export class MockSas9Controller { public async sasStoredProcessDoGet( @Request() req: express.Request ): Promise { - let username = req.query._username?.toString() || undefined - let password = req.query._password?.toString() || undefined + const username = req.query._username?.toString() || undefined + const password = req.query._password?.toString() || undefined if (username && password) this.loggedIn = username @@ -82,7 +81,7 @@ export class MockSas9Controller { } const program = req.query._program ?? req.body?._program - let filePath: string[] = ['generic', 'sas-stored-process'] + const filePath: string[] = ['generic', 'sas-stored-process'] if (program) { const vars = { ...req.query, ...req.body, _requestMethod: req.method } From 418bf41e38f44837f2c7d6b16a45895df121173a Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Fri, 28 Oct 2022 11:53:42 +0200 Subject: [PATCH 5/5] style: lint --- api/src/controllers/mock-sas9.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/src/controllers/mock-sas9.ts b/api/src/controllers/mock-sas9.ts index 2393f83..d4f7282 100644 --- a/api/src/controllers/mock-sas9.ts +++ b/api/src/controllers/mock-sas9.ts @@ -45,7 +45,9 @@ export class MockSas9Controller { } let program = req.query._program?.toString() || undefined - const filePath: string[] = program ? program.replace('/', '').split('/') : ['generic', 'sas-stored-process'] + const filePath: string[] = program + ? program.replace('/', '').split('/') + : ['generic', 'sas-stored-process'] if (program) { return await getMockResponseFromFile([