From c5ad72c931ec8fbd7d5a6475838adcbd380c8aee Mon Sep 17 00:00:00 2001 From: Saad Jutt Date: Sun, 20 Feb 2022 04:50:09 +0500 Subject: [PATCH] feat: parse log to array --- api/public/swagger.yaml | 15 ++++++++-- api/src/controllers/code.ts | 3 +- api/src/controllers/stp.ts | 13 ++++++-- api/src/utils/index.ts | 1 + api/src/utils/parseLogToArray.ts | 9 ++++++ api/src/utils/specs/parseLogToArray.spec.ts | 33 +++++++++++++++++++++ 6 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 api/src/utils/parseLogToArray.ts create mode 100644 api/src/utils/specs/parseLogToArray.spec.ts diff --git a/api/public/swagger.yaml b/api/public/swagger.yaml index 55fa8fd..b4f9ebd 100644 --- a/api/public/swagger.yaml +++ b/api/public/swagger.yaml @@ -92,6 +92,14 @@ components: - clientSecret type: object additionalProperties: false + LogLine: + properties: + line: + type: string + required: + - line + type: object + additionalProperties: false HTTPHeaders: properties: {} type: object @@ -104,7 +112,9 @@ components: _webout: type: string log: - type: string + items: + $ref: '#/components/schemas/LogLine' + type: array message: type: string httpHeaders: @@ -112,6 +122,7 @@ components: required: - status - _webout + - log - httpHeaders type: object additionalProperties: false @@ -1070,7 +1081,7 @@ paths: $ref: '#/components/schemas/ExecuteReturnJsonResponse' examples: 'Example 1': - value: {status: success, _webout: 'webout content', httpHeaders: {Content-type: application/zip, Cache-Control: 'public, max-age=1000'}} + value: {status: success, _webout: 'webout content', log: [], httpHeaders: {Content-type: application/zip, Cache-Control: 'public, max-age=1000'}} description: "Trigger a SAS program using it's location in the _program parameter.\nEnable debugging using the _debug parameter.\nAdditional URL parameters are turned into SAS macro variables.\nAny files provided are placed into the session and\ncorresponding _WEBIN_XXX variables are created." summary: 'Execute Stored Program, return JSON' tags: diff --git a/api/src/controllers/code.ts b/api/src/controllers/code.ts index 68d523e..c5c8e65 100644 --- a/api/src/controllers/code.ts +++ b/api/src/controllers/code.ts @@ -3,6 +3,7 @@ import { Request, Security, Route, Tags, Post, Body } from 'tsoa' import { ExecuteReturnJson, ExecutionController } from './internal' import { PreProgramVars } from '../types' import { ExecuteReturnJsonResponse } from '.' +import { parseLogToArray } from '../utils' interface ExecuteSASCodePayload { /** @@ -43,7 +44,7 @@ const executeSASCode = async (req: any, { code }: ExecuteSASCodePayload) => { return { status: 'success', _webout: webout, - log, + log: parseLogToArray(log), httpHeaders } } catch (err: any) { diff --git a/api/src/controllers/stp.ts b/api/src/controllers/stp.ts index b8e0e99..f5fff74 100644 --- a/api/src/controllers/stp.ts +++ b/api/src/controllers/stp.ts @@ -18,7 +18,13 @@ import { ExecutionVars } from './internal' import { PreProgramVars } from '../types' -import { getTmpFilesFolderPath, HTTPHeaders, makeFilesNamesMap } from '../utils' +import { + getTmpFilesFolderPath, + HTTPHeaders, + LogLine, + makeFilesNamesMap, + parseLogToArray +} from '../utils' interface ExecuteReturnJsonPayload { /** @@ -30,7 +36,7 @@ interface ExecuteReturnJsonPayload { export interface ExecuteReturnJsonResponse { status: string _webout: string - log?: string + log: LogLine[] message?: string httpHeaders: HTTPHeaders } @@ -70,6 +76,7 @@ export class STPController { @Example({ status: 'success', _webout: 'webout content', + log: [], httpHeaders: { 'Content-type': 'application/zip', 'Cache-Control': 'public, max-age=1000' @@ -141,7 +148,7 @@ const executeReturnJson = async ( return { status: 'success', _webout: webout, - log, + log: parseLogToArray(log), httpHeaders } } catch (err: any) { diff --git a/api/src/utils/index.ts b/api/src/utils/index.ts index 4f78125..5b2b671 100644 --- a/api/src/utils/index.ts +++ b/api/src/utils/index.ts @@ -6,6 +6,7 @@ export * from './generateAuthCode' export * from './generateRefreshToken' export * from './getCertificates' export * from './getDesktopFields' +export * from './parseLogToArray' export * from './removeTokensInDB' export * from './saveTokensInDB' export * from './sleep' diff --git a/api/src/utils/parseLogToArray.ts b/api/src/utils/parseLogToArray.ts new file mode 100644 index 0000000..f28a35b --- /dev/null +++ b/api/src/utils/parseLogToArray.ts @@ -0,0 +1,9 @@ +export interface LogLine { + line: string +} + +export const parseLogToArray = (content?: string): LogLine[] => { + if (!content) return [] + + return content.split('\n').map((line) => ({ line: line })) +} diff --git a/api/src/utils/specs/parseLogToArray.spec.ts b/api/src/utils/specs/parseLogToArray.spec.ts new file mode 100644 index 0000000..3bd0de4 --- /dev/null +++ b/api/src/utils/specs/parseLogToArray.spec.ts @@ -0,0 +1,33 @@ +import { parseLogToArray } from '..' + +describe('parseLogToArray', () => { + it('should parse log to array type', () => { + const log = parseLogToArray(` +line 1 of log content +line 2 of log content +line 3 of log content +line 4 of log content + `) + + expect(log).toEqual([ + { line: '' }, + { line: 'line 1 of log content' }, + { line: 'line 2 of log content' }, + { line: 'line 3 of log content' }, + { line: 'line 4 of log content' }, + { line: ' ' } + ]) + }) + + it('should parse log to array type if empty', () => { + const log = parseLogToArray('') + + expect(log).toEqual([]) + }) + + it('should parse log to array type if not provided', () => { + const log = parseLogToArray() + + expect(log).toEqual([]) + }) +})