From 763360831810bb7868e73e58624d2113552d7d83 Mon Sep 17 00:00:00 2001 From: Mihajlo Medjedovic Date: Wed, 31 Aug 2022 13:31:28 +0200 Subject: [PATCH] chore: mocker architecture fix, env validation --- api/src/routes/api/mock-sas9.ts | 76 ------------------------- api/src/routes/api/mock-viya.ts | 13 ----- api/src/routes/web/index.ts | 20 ++++++- api/src/routes/web/sas9-web.ts | 88 +++++++++++++++++++++++++++++ api/src/routes/web/sasviya-web.ts | 32 +++++++++++ api/src/routes/web/web.ts | 53 ++++++----------- api/src/utils/verifyEnvVariables.ts | 24 ++++++++ 7 files changed, 181 insertions(+), 125 deletions(-) delete mode 100644 api/src/routes/api/mock-sas9.ts delete mode 100644 api/src/routes/api/mock-viya.ts create mode 100644 api/src/routes/web/sas9-web.ts create mode 100644 api/src/routes/web/sasviya-web.ts diff --git a/api/src/routes/api/mock-sas9.ts b/api/src/routes/api/mock-sas9.ts deleted file mode 100644 index 3421eba..0000000 --- a/api/src/routes/api/mock-sas9.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { readFile } from '@sasjs/utils' -import express from 'express' -import path from 'path' -import { MockSas9Controller } from '../../controllers/mock-sas9' - -const mockSas9Router = express.Router() - -const { MOCK_SERVERTYPE } = process.env - -// Mock controller must be singleton because it keeps the states -// for example `isLoggedIn` and potentially more in future mocks -const mockSas9Controller = new MockSas9Controller() - -mockSas9Router.get('/SASStoredProcess', async (req, res) => { - const response = await mockSas9Controller.sasStoredProcess() - - if (response.redirect) { - res.redirect(response.redirect) - return - } - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } -}) - -mockSas9Router.post('/SASStoredProcess/do/', async (req, res) => { - const response = await mockSas9Controller.sasStoredProcessDo(req) - - if (response.redirect) { - res.redirect(response.redirect) - return - } - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } -}) - -if (MOCK_SERVERTYPE !== undefined) { - mockSas9Router.get('/SASLogon/login', async (req, res) => { - const response = await mockSas9Controller.loginGet() - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } - }) - - mockSas9Router.post('/SASLogon/login', async (req, res) => { - const response = await mockSas9Controller.loginPost() - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } - }) - - mockSas9Router.get('/SASLogon/logout', async (req, res) => { - const response = await mockSas9Controller.logout() - - try { - res.send(response.content) - } catch (err: any) { - res.status(403).send(err.toString()) - } - }) -} - -export default mockSas9Router diff --git a/api/src/routes/api/mock-viya.ts b/api/src/routes/api/mock-viya.ts deleted file mode 100644 index 8f999e9..0000000 --- a/api/src/routes/api/mock-viya.ts +++ /dev/null @@ -1,13 +0,0 @@ -import express from 'express' - -const mockViyaRouter = express.Router() - -mockViyaRouter.post('/SASJobExecution/', async (req, res) => { - try { - res.send({ test: 'test' }) - } catch (err: any) { - res.status(403).send(err.toString()) - } -}) - -export default mockViyaRouter diff --git a/api/src/routes/web/index.ts b/api/src/routes/web/index.ts index 6f75c11..1ddd4e0 100644 --- a/api/src/routes/web/index.ts +++ b/api/src/routes/web/index.ts @@ -1,8 +1,26 @@ import express from 'express' +import sas9WebRouter from './sas9-web' +import sasViyaWebRouter from './sasviya-web' import webRouter from './web' const router = express.Router() -router.use('/', webRouter) +const { MOCK_SERVERTYPE } = process.env + +console.log('MOCK_SERVERTYPE', MOCK_SERVERTYPE) + +switch (MOCK_SERVERTYPE?.toUpperCase()) { + case 'SAS9': { + router.use('/', sas9WebRouter) + break + } + case 'SASVIYA': { + router.use('/', sasViyaWebRouter) + break + } + default: { + router.use('/', webRouter) + } +} export default router diff --git a/api/src/routes/web/sas9-web.ts b/api/src/routes/web/sas9-web.ts new file mode 100644 index 0000000..09f5355 --- /dev/null +++ b/api/src/routes/web/sas9-web.ts @@ -0,0 +1,88 @@ +import express from 'express' +import { WebController } from '../../controllers' +import { MockSas9Controller } from '../../controllers/mock-sas9' + +const sas9WebRouter = express.Router() +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() + +sas9WebRouter.get('/', async (req, res) => { + let response + try { + response = await webController.home() + } catch (_) { + response = 'Web Build is not present' + } finally { + const codeToInject = `` + const injectedContent = response?.replace( + '', + `${codeToInject}` + ) + + return res.send(injectedContent) + } +}) + +sas9WebRouter.get('/SASStoredProcess', async (req, res) => { + const response = await controller.sasStoredProcess() + + 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/', async (req, res) => { + const response = await controller.sasStoredProcessDo(req) + + if (response.redirect) { + res.redirect(response.redirect) + return + } + + 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() + + try { + res.send(response.content) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) + +sas9WebRouter.post('/SASLogon/login', async (req, res) => { + const response = await controller.loginPost() + + try { + res.send(response.content) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) + +sas9WebRouter.get('/SASLogon/logout', async (req, res) => { + const response = await controller.logout() + + try { + res.send(response.content) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) + +export default sas9WebRouter diff --git a/api/src/routes/web/sasviya-web.ts b/api/src/routes/web/sasviya-web.ts new file mode 100644 index 0000000..9809319 --- /dev/null +++ b/api/src/routes/web/sasviya-web.ts @@ -0,0 +1,32 @@ +import express from 'express' +import { WebController } from '../../controllers/web' + +const sasViyaWebRouter = express.Router() +const controller = new WebController() + +sasViyaWebRouter.get('/', async (req, res) => { + let response + try { + response = await controller.home() + } catch (_) { + response = 'Web Build is not present' + } finally { + const codeToInject = `` + const injectedContent = response?.replace( + '', + `${codeToInject}` + ) + + return res.send(injectedContent) + } +}) + +sasViyaWebRouter.post('/SASJobExecution/', async (req, res) => { + try { + res.send({ test: 'test' }) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) + +export default sasViyaWebRouter diff --git a/api/src/routes/web/web.ts b/api/src/routes/web/web.ts index e53099b..03510b5 100644 --- a/api/src/routes/web/web.ts +++ b/api/src/routes/web/web.ts @@ -2,13 +2,10 @@ import express from 'express' import { WebController } from '../../controllers/web' import { authenticateAccessToken, desktopRestrict } from '../../middlewares' import { authorizeValidation, loginWebValidation } from '../../utils' -import mockSas9Router from '../api/mock-sas9' const webRouter = express.Router() const controller = new WebController() -const { MOCK_SERVERTYPE } = process.env - webRouter.get('/', async (req, res) => { let response try { @@ -26,22 +23,17 @@ webRouter.get('/', async (req, res) => { } }) -/** - * If any type of mock is enabled, we won't use regular working logon endpoints - */ -if (MOCK_SERVERTYPE === undefined) { - webRouter.post('/SASLogon/login', desktopRestrict, async (req, res) => { - const { error, value: body } = loginWebValidation(req.body) - if (error) return res.status(400).send(error.details[0].message) +webRouter.post('/SASLogon/login', desktopRestrict, async (req, res) => { + const { error, value: body } = loginWebValidation(req.body) + if (error) return res.status(400).send(error.details[0].message) - try { - const response = await controller.login(req, body) - res.send(response) - } catch (err: any) { - res.status(403).send(err.toString()) - } - }) -} + try { + const response = await controller.login(req, body) + res.send(response) + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) webRouter.post( '/SASLogon/authorize', @@ -60,22 +52,13 @@ webRouter.post( } ) -/** - * If any type of mock is enabled, we won't use regular working logon endpoints - */ -if (MOCK_SERVERTYPE === undefined) { - webRouter.get('/SASLogon/logout', desktopRestrict, async (req, res) => { - try { - await controller.logout(req) - res.status(200).send('OK!') - } catch (err: any) { - res.status(403).send(err.toString()) - } - }) -} - -webRouter.use('/', mockSas9Router) -// disabled for now -// webRouter.use('/', mockViyaRouter) +webRouter.get('/SASLogon/logout', desktopRestrict, async (req, res) => { + try { + await controller.logout(req) + res.status(200).send('OK!') + } catch (err: any) { + res.status(403).send(err.toString()) + } +}) export default webRouter diff --git a/api/src/utils/verifyEnvVariables.ts b/api/src/utils/verifyEnvVariables.ts index 023cf05..a783b0e 100644 --- a/api/src/utils/verifyEnvVariables.ts +++ b/api/src/utils/verifyEnvVariables.ts @@ -1,3 +1,8 @@ +export enum MOCK_SERVERTYPEType { + SAS9 = 'SAS9', + SASVIYA = 'SASVIYA' +} + export enum ModeType { Server = 'server', Desktop = 'desktop' @@ -40,6 +45,8 @@ export enum ReturnCode { export const verifyEnvVariables = (): ReturnCode => { const errors: string[] = [] + errors.push(...verifyMOCK_SERVERTYPE()) + errors.push(...verifyMODE()) errors.push(...verifyPROTOCOL()) @@ -66,6 +73,23 @@ export const verifyEnvVariables = (): ReturnCode => { return ReturnCode.Success } +const verifyMOCK_SERVERTYPE = (): string[] => { + const errors: string[] = [] + const { MOCK_SERVERTYPE } = process.env + + if (MOCK_SERVERTYPE) { + const modeTypes = Object.values(MOCK_SERVERTYPEType) + if (!modeTypes.includes(MOCK_SERVERTYPE as MOCK_SERVERTYPEType)) + errors.push( + `- MOCK_SERVERTYPE '${MOCK_SERVERTYPE}'\n - valid options ${modeTypes}` + ) + } else { + process.env.MOCK_SERVERTYPE = undefined + } + + return errors +} + const verifyMODE = (): string[] => { const errors: string[] = [] const { MODE } = process.env