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

chore: mocker architecture fix, env validation

This commit is contained in:
2022-08-31 13:31:28 +02:00
parent 572fe22d50
commit 7633608318
7 changed files with 181 additions and 125 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 = '<html><head></head><body>Web Build is not present</body></html>'
} finally {
const codeToInject = `<script>document.cookie = 'XSRF-TOKEN=${req.csrfToken()}; Max-Age=86400; SameSite=Strict; Path=/;'</script>`
const injectedContent = response?.replace(
'</head>',
`${codeToInject}</head>`
)
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

View File

@@ -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 = '<html><head></head><body>Web Build is not present</body></html>'
} finally {
const codeToInject = `<script>document.cookie = 'XSRF-TOKEN=${req.csrfToken()}; Max-Age=86400; SameSite=Strict; Path=/;'</script>`
const injectedContent = response?.replace(
'</head>',
`${codeToInject}</head>`
)
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

View File

@@ -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

View File

@@ -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