From 158f044363abf2576c8248f0ca9da4bc9cb7e9d8 Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Wed, 1 Mar 2023 01:41:08 +0500 Subject: [PATCH] feat: add new env config DB_TYPE --- README.md | 3 ++ api/.env.example | 1 + .../app-modules/configureExpressSession.ts | 20 +++++++++---- api/src/utils/verifyEnvVariables.ts | 28 ++++++++++++++++++- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2fa03b9..1bdf184 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,9 @@ CA_ROOT=fullchain.pem (optional) ## ENV variables required for MODE: `server` DB_CONNECT=mongodb+srv://:@/?retryWrites=true&w=majority +# options: [mongodb|cosmos_mongodb] default: mongodb +DB_TYPE= + # AUTH_PROVIDERS options: [ldap] default: `` AUTH_PROVIDERS= diff --git a/api/.env.example b/api/.env.example index e36399c..58212f0 100644 --- a/api/.env.example +++ b/api/.env.example @@ -14,6 +14,7 @@ HELMET_CSP_CONFIG_PATH=./csp.config.json if omitted HELMET default will be used HELMET_COEP=[true|false] if omitted HELMET default will be used DB_CONNECT=mongodb+srv://:@/?retryWrites=true&w=majority +DB_TYPE=[mongodb|cosmos_mongodb] default considered as mongodb AUTH_PROVIDERS=[ldap] diff --git a/api/src/app-modules/configureExpressSession.ts b/api/src/app-modules/configureExpressSession.ts index 0d2096b..92bf58f 100644 --- a/api/src/app-modules/configureExpressSession.ts +++ b/api/src/app-modules/configureExpressSession.ts @@ -3,19 +3,27 @@ import mongoose from 'mongoose' import session from 'express-session' import MongoStore from 'connect-mongo' -import { ModeType, ProtocolType } from '../utils' +import { DatabaseType, ModeType, ProtocolType } from '../utils' export const configureExpressSession = (app: Express) => { - const { MODE } = process.env + const { MODE, DB_TYPE } = process.env if (MODE === ModeType.Server) { let store: MongoStore | undefined if (process.env.NODE_ENV !== 'test') { - store = MongoStore.create({ - client: mongoose.connection!.getClient() as any, - collectionName: 'sessions' - }) + if (DB_TYPE === DatabaseType.COSMOS_MONGODB) { + store = MongoStore.create({ + client: mongoose.connection!.getClient() as any, + collectionName: 'sessions', + autoRemove: 'interval' + }) + } else { + store = MongoStore.create({ + client: mongoose.connection!.getClient() as any, + collectionName: 'sessions' + }) + } } const { PROTOCOL, ALLOWED_DOMAIN } = process.env diff --git a/api/src/utils/verifyEnvVariables.ts b/api/src/utils/verifyEnvVariables.ts index a36866f..043be7b 100644 --- a/api/src/utils/verifyEnvVariables.ts +++ b/api/src/utils/verifyEnvVariables.ts @@ -47,6 +47,11 @@ export enum ReturnCode { InvalidEnv } +export enum DatabaseType { + MONGO = 'mongodb', + COSMOS_MONGODB = 'cosmos_mongodb' +} + export const verifyEnvVariables = (): ReturnCode => { const errors: string[] = [] @@ -70,6 +75,8 @@ export const verifyEnvVariables = (): ReturnCode => { errors.push(...verifyLDAPVariables()) + errors.push(...verifyDbType()) + if (errors.length) { process.logger?.error( `Invalid environment variable(s) provided: \n${errors.join('\n')}` @@ -342,11 +349,30 @@ const verifyLDAPVariables = () => { return errors } +const verifyDbType = () => { + const errors: string[] = [] + + const { MODE, DB_TYPE } = process.env + + if (MODE === ModeType.Server) { + if (DB_TYPE) { + const dbTypes = Object.values(DatabaseType) + if (!dbTypes.includes(DB_TYPE as DatabaseType)) + errors.push(`- DB_TYPE '${DB_TYPE}'\n - valid options ${dbTypes}`) + } else { + process.env.DB_TYPE = DEFAULTS.DB_TYPE + } + } + + return errors +} + const DEFAULTS = { MODE: ModeType.Desktop, PROTOCOL: ProtocolType.HTTP, PORT: '5000', HELMET_COEP: HelmetCoepType.TRUE, LOG_FORMAT_MORGAN: LOG_FORMAT_MORGANType.Common, - RUN_TIMES: RunTimeType.SAS + RUN_TIMES: RunTimeType.SAS, + DB_TYPE: DatabaseType.MONGO }