From 9b5a5be62a0e5753e9c4800a522f99ae4ace6f4b Mon Sep 17 00:00:00 2001 From: nrusso Date: Mon, 11 Mar 2024 18:24:23 -0300 Subject: [PATCH] refactor: remove config package --- Dockerfile | 4 +- config/custom-environment-variables.json | 87 ------- config/default.json | 103 -------- config/development.json | 7 - config/info.json | 9 - config/production.json | 17 -- config/test.json | 13 - docker-compose.yml | 2 +- nodemon-worker.json | 13 + nodemon.json | 2 +- package.json | 12 +- pnpm-lock.yaml | 10 - .../Services/AuthorizeSupabaseService.ts | 16 +- .../Auth/AuthSupabaseRepository.ts | 7 +- .../Middlewares/AuthorizeFastifyMiddleware.ts | 7 +- src/Config/MainConfig.ts | 245 ++++++------------ src/Config/validateEnv.ts | 65 ----- src/Item/Tests/item.handler.spec.ts | 6 +- .../Database/CreateMikroORMConnection.ts | 7 +- .../Factories/DatabaseFactory.ts | 16 +- .../Repositories/RedisCacheDataAccess.ts | 8 +- .../Presentation/Http/FastifyBootstrapping.ts | 2 +- .../Presentation/Http/IExtendAppConfig.ts | 5 +- src/Notification/Shared/EmailStrategy.ts | 22 +- src/Notification/Shared/WebPushStrategy.ts | 10 +- src/Shared/DI/container.ts | 19 +- src/Shared/Factories/AxiosFactory.ts | 4 +- src/Shared/Factories/FilesystemFactory.ts | 18 +- src/Shared/Helpers/Logger.ts | 4 +- src/Shared/Infrastructure/IMessageBroker.ts | 5 +- .../Infrastructure/RabbitMQMessageBroker.ts | 3 +- src/Shared/Tests/MockMessageBroker.ts | 3 +- src/Shared/Tests/messageBroker.spec.ts | 6 +- src/Shared/Utils/Pagination.ts | 5 +- src/command.ts | 3 - src/index.ts | 21 +- src/initCommand.ts | 4 +- src/initTestServer.ts | 10 +- src/worker.ts | 9 +- 39 files changed, 222 insertions(+), 587 deletions(-) delete mode 100644 config/custom-environment-variables.json delete mode 100644 config/default.json delete mode 100644 config/development.json delete mode 100644 config/info.json delete mode 100644 config/production.json delete mode 100644 config/test.json create mode 100644 nodemon-worker.json delete mode 100644 src/Config/validateEnv.ts diff --git a/Dockerfile b/Dockerfile index 71a02c7d..d3d51149 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM digichanges/nexp:1.3 AS dev +FROM digichanges/nexp:1.4 AS dev WORKDIR /home/node @@ -28,7 +28,7 @@ RUN pnpm install --production --ignore-scripts \ && cd node_modules/bcrypt \ && npm rebuild bcrypt --build-from-source -FROM digichanges/nexp:1.3 AS prod +FROM digichanges/nexp:1.4 AS prod ENV NODE_ENV production diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json deleted file mode 100644 index cb620d9b..00000000 --- a/config/custom-environment-variables.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "env": "NODE_ENV", - "app": { - "default": "APP_DEFAULT", - "path": "APP_PATH", - "serverPort": "APP_PORT", - "setAppProxy": "APP_SET_APP_PROXY", - "setCookieSecure": "APP_SET_COOKIE_SECURE", - "setCookieSameSite": "APP_SET_COOKIE_SAME_SITE" - }, - "auth": { - "apiKey": "AUTH_API_KEY", - "host": "AUTH_HOST", - "secret": "AUTH_SECRET", - "authorization": "AUTH_AUTHORIZATION" - }, - "dbConfig": { - "Mongoose": { - "uri": "DB_URI" - }, - "MikroORM": { - "host": "DB_HOST", - "port": "DB_PORT", - "user": "DB_USER", - "password": "DB_PASSWORD", - "dbName": "DB_DATABASE", - "type": "DB_TYPE" - }, - "default" : "DB_ORM_DEFAULT" - }, - "cache": { - "redis": { - "port": "CACHE_PORT", - "host": "CACHE_HOST", - "user": "CACHE_USER", - "password": "CACHE_PASSWORD" - }, - "enable": "CACHE_ENABLE" - }, - "messageBroker": { - "uri": "MESSAGE_BROKER_URI" - }, - "filesystem": { - "minio": { - "endPoint": "MINIO_HOST", - "accessKey": "MINIO_ACCESS_KEY", - "secretKey": "MINIO_SECRET_KEY", - "useSSL": "MINIO_USE_SSL", - "port": "MINIO_PORT", - "publicBucket": "MINIO_PUBLIC_BUCKET", - "privateBucket": "MINIO_PRIVATE_BUCKET", - "rootPath": "MINIO_ROOT_PATH", - "region": "MINIO_REGION" - }, - "default": "FILESYSTEM_DEFAULT" - }, - "jwt": { - "secret": "JWT_SECRET", - "expires": "JWT_EXPIRES", - "iss": "JWT_ISS", - "aud": "JWT_AUD" - }, - "mail": { - "host": "SMTP_HOST", - "port": "SMTP_PORT", - "username": "SMTP_USERNAME", - "password": "SMTP_PASSWORD", - "secure": "SMTP_SECURE_SSL", - "senderName": "SMTP_SENDER_NAME", - "senderEmailDefault": "SMTP_SENDER_EMAIL_DEFAULT" - }, - "push": { - "privateKey": "PUSH_PRIVATE_KEY", - "publicKey": "PUSH_PUBLIC_KEY" - }, - "productInfo":{ - "productName": "PRODUCT_NAME" - }, - "encryption": { - "default": "ENCRYPTION_DEFAULT" - }, - "url": { - "urlApi": "URL_API", - "urlWeb": "URL_WEB" - }, - "executeCrons": "EXECUTE_CRONS" -} diff --git a/config/default.json b/config/default.json deleted file mode 100644 index 95468c34..00000000 --- a/config/default.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "env": "local", - "app": { - "default": "FastifyBootstrapping", - "path": "/home/node/app", - "serverPort": 8089, - "setAppProxy": false, - "setCookieSecure": false, - "setCookieSameSite": "Lax" - }, - "auth": { - "apiKey": "experience", - "host": "http://localhost:8080", - "secret": "mySecret", - "authorization": false - }, - "service": { - "uri": "http://localhost:8080" - }, - "dbConfig": { - "Mongoose": { - "uri": "DB_URI" - }, - "MikroORM": { - "type": "postgresql", - "host": "db", - "port": 5432, - "dbName": "experience", - "user": "experience", - "password": "experience" - }, - "default": "Mongoose" - }, - "cache": { - "redis": { - "port": 6379, - "host": "cache", - "user": "experience", - "password": "ewsua132435" - }, - "enable": true - }, - "messageBroker": { - "uri": "amqps://user:password@rabbitmq/user" - }, - "filesystem": { - "minio": { - "endPoint": "minio", - "accessKey": "minio", - "secretKey": "12345678", - "useSSL": false, - "port": 9000, - "publicBucket": "experience", - "privateBucket": "experience", - "rootPath": "", - "region": "us-east-1" - }, - "default": "minio", - "expiry": 241920 - }, - "encryption": { - "bcrypt": { - "type": "bcrypt", - "saltRounds": 10, - "algorithm": "HS512" - }, - "default": "bcrypt" - }, - "jwt": { - "secret": "mySecretJWT", - "expires": 3600, - "iss": "digichanges", - "aud": "digichanges.com" - }, - "mail": { - "host": "mail", - "port": 1025, - "username": "", - "password": "", - "secure": false, - "senderName": "Notifications", - "senderEmailDefault": "notification@localhost.com", - "templateDir": "src/Shared/Infrastructure/templates/emails" - }, - "push": { - "privateKey": "BFbzNLYCWO7Ei0cmBco43ZCsEbhFAOzcfop1eHYiK8CVCBK_-xeWEWzHHlQiPEUPvuxwMHc1koGj40t2hcgiWvk", - "publicKey": "k8sGjPBnD8iabMkB6toD8payp9plozw4t4FSfjhUPhQ" - }, - "url":{ - "urlApi": "http://localhost:8089/api", - "urlWeb": "http://localhost:3000" - }, - "productInfo": { - "productName": "experience" - }, - "validationSettings": { - "password": { - "min": 3, - "max": 15 - } - }, - "executeCrons": false -} diff --git a/config/development.json b/config/development.json deleted file mode 100644 index 5b45312d..00000000 --- a/config/development.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "env": "development", - "url":{ - "urlApi": "https://nexp.com/api", - "urlWeb": "https://nexp.com:3000" - } -} diff --git a/config/info.json b/config/info.json deleted file mode 100644 index b7c3a662..00000000 --- a/config/info.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "http": [ - "Fastify" - ], - "orm": [ - "Mongoose", - "MikroORM" - ] -} diff --git a/config/production.json b/config/production.json deleted file mode 100644 index 90430b34..00000000 --- a/config/production.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "env": "production", - "app": { - "default": "FastifyBootstrapping", - "path": "/home/node/app", - "serverPort": 80, - "setAppProxy": true, - "setCookieSecure": false, - "setCookieSameSite": "None" - }, - "auth": { - "apiKey": "experience", - "host": "http://localhost:8080", - "secret": "mySecret", - "authorization": true - } -} diff --git a/config/test.json b/config/test.json deleted file mode 100644 index f3529021..00000000 --- a/config/test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "env": "test", - "auth": { - "apiKey": "experience", - "host": "http://localhost:8080", - "secret": "mySecret", - "authorization": false - }, - "url": { - "urlApi": "http://localhost:8088", - "urlWeb": "http://localhost:3000" - } -} diff --git a/docker-compose.yml b/docker-compose.yml index 9e0290fe..933a7bfd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,7 +26,7 @@ services: restart: always tty: false stdin_open: false - entrypoint: ["dumb-init", "pnpm", "worker-dev"] + entrypoint: ["dumb-init", "pnpm", "dev-worker"] build: context: . dockerfile: Dockerfile diff --git a/nodemon-worker.json b/nodemon-worker.json new file mode 100644 index 00000000..370d653a --- /dev/null +++ b/nodemon-worker.json @@ -0,0 +1,13 @@ +{ + "verbose": true, + "ignore": [ + ".git", + "node_modules/**/node_modules" + ], + "watch": [ + "src/*" + ], + "exec": "npm run build && node --inspect=0.0.0.0:9229 ./dist/src/worker.js", + "legacyWatch": true, + "ext": "js,ts,json,hbs" +} diff --git a/nodemon.json b/nodemon.json index 9cec7380..8a39621b 100644 --- a/nodemon.json +++ b/nodemon.json @@ -7,7 +7,7 @@ "watch": [ "src/*" ], - "exec": "npm run build && node --inspect=0.0.0.0:9229 ./dist/src/index.js", + "exec": "npm run build && node --env-file=.env --inspect=0.0.0.0:9229 ./dist/src/index.js", "legacyWatch": true, "ext": "js,ts,json,hbs" } diff --git a/package.json b/package.json index 404b82c8..304ac92e 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "cruiser": "depcruise src", "clean": "rimraf dist/src/*", "command": "ts-node src/command.ts", - "cpy-ci": "cp .env.dev .env", "dev": "nodemon", + "dev-worker": "nodemon -c nodemon-worker.json", "login-infisical": "infisical login", "pull:env": "infisical pull", "docker-command": "docker-compose exec node pnpm command", @@ -26,7 +26,6 @@ "test-watch": "jest --watch --silent --coverage=false", "tsc": "tsc", "ts-check": "tsc -p tsconfig.json --noEmit", - "worker-dev": "node dist/src/worker.js", "sync:db": "ts-node src/Main/Presentation/Commands/SynchronizeDbCommand.ts" }, "keywords": [], @@ -40,19 +39,18 @@ "@fastify/helmet": "^11.1.1", "@fastify/multipart": "^8.1.0", "@godaddy/terminus": "^4.12.1", - "@mikro-orm/core": "^6.1.5", - "@mikro-orm/postgresql": "^6.1.5", + "@mikro-orm/core": "^6.1.9", + "@mikro-orm/postgresql": "^6.1.9", "@supabase/supabase-js": "^2.39.7", "amqplib": "^0.10.3", "axios": "^1.6.7", "bcrypt": "^5.1.1", "commander": "^10.0.1", - "config": "^3.3.11", "dayjs": "^1.11.10", - "dependency-cruiser": "^16.2.1", + "dependency-cruiser": "^16.2.3", "dotenv": "^16.4.5", "envalid": "^8.0.0", - "fastify": "^4.26.1", + "fastify": "^4.26.2", "handlebars": "^4.7.8", "helmet": "^7.1.0", "jwt-simple": "^0.5.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c80e032..018bb6d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,6 @@ dependencies: commander: specifier: ^10.0.1 version: 10.0.1 - config: - specifier: ^3.3.11 - version: 3.3.11 cwebp: specifier: ^3.0.0 version: 3.0.0 @@ -2728,13 +2725,6 @@ packages: typedarray: 0.0.6 dev: false - /config@3.3.11: - resolution: {integrity: sha512-Dhn63ZoWCW5EMg4P0Sl/XNsj/7RLiUIA1x1npCy+m2cRwRHzLnt3UtYtxRDMZW/6oOMdWhCzaGYkOcajGgrAOA==} - engines: {node: '>= 10.0.0'} - dependencies: - json5: 2.2.3 - dev: false - /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false diff --git a/src/Auth/Domain/Services/AuthorizeSupabaseService.ts b/src/Auth/Domain/Services/AuthorizeSupabaseService.ts index 02ca9648..2e0b19b4 100644 --- a/src/Auth/Domain/Services/AuthorizeSupabaseService.ts +++ b/src/Auth/Domain/Services/AuthorizeSupabaseService.ts @@ -3,15 +3,16 @@ import utc from 'dayjs/plugin/utc'; import ForbiddenException from '../Exceptions/ForbiddenException'; import IAuthorizeService from './IAuthorizeService'; -import MainConfig from '../../../Config/MainConfig'; + import IDecodeToken from '../Models/IDecodeToken'; +import { MainConfig } from '../../../Config/MainConfig'; import jwt from 'jwt-simple'; import IAuthRepository from '../Repositories/IAuthRepository'; import IUserDomain from '../Entities/IUserDomain'; class AuthorizeSupabaseService implements IAuthorizeService { - #config = MainConfig.getInstance().getConfig(); + #config = MainConfig.getEnv(); readonly #repository: IAuthRepository; constructor(repository: IAuthRepository) @@ -22,26 +23,23 @@ class AuthorizeSupabaseService implements IAuthorizeService public getConfirmationToken(email: string): string { dayjs.extend(utc); - const { iss, secret, aud } = this.#config.jwt; const expires = dayjs.utc().add(5, 'minute').unix(); const payload = { - iss, - aud, + iss: this.#config.JWT_ISS, + aud: this.#config.JWT_AUD, sub: email, iat: expires, exp: expires, email }; - return jwt.encode(payload, secret, 'HS512'); + return jwt.encode(payload, this.#config.JWT_SECRET, 'HS512'); } public decodeToken(token: string): IDecodeToken { - const { secret } = this.#config.auth; - - return jwt.decode(token, secret, false); + return jwt.decode(token, this.#config.JWT_SECRET, false); } public async authorize(userId: string, permission: string): Promise diff --git a/src/Auth/Infrastructure/Repositories/Auth/AuthSupabaseRepository.ts b/src/Auth/Infrastructure/Repositories/Auth/AuthSupabaseRepository.ts index d26b0771..4fd9344d 100644 --- a/src/Auth/Infrastructure/Repositories/Auth/AuthSupabaseRepository.ts +++ b/src/Auth/Infrastructure/Repositories/Auth/AuthSupabaseRepository.ts @@ -2,7 +2,8 @@ import { createClient, SupabaseClient } from '@supabase/supabase-js'; import IAuthRepository from '../../../Domain/Repositories/IAuthRepository'; import PermissionPayload from '../../../Domain/Payload/PermissionPayload'; -import MainConfig, { AuthConfig } from '../../../../Config/MainConfig'; +import { MainConfig } from '../../../../Config/MainConfig'; + import { ErrorHttpException, StatusCode } from '@digichanges/shared-experience'; import IUserDomain from '../../../Domain/Entities/IUserDomain'; import IRoleDomain from '../../../Domain/Entities/IRoleDomain'; @@ -15,8 +16,8 @@ class AuthSupabaseRepository implements IAuthRepository constructor() { - const config: AuthConfig = MainConfig.getInstance().getConfig().auth; - this.#client = createClient(config.host, config.apiKey); + const config = MainConfig.getEnv(); + this.#client = createClient(config.AUTH_HOST, config.AUTH_API_KEY); } public async checkPermissions({ userId, permission }: PermissionPayload): Promise diff --git a/src/Auth/Presentation/Middlewares/AuthorizeFastifyMiddleware.ts b/src/Auth/Presentation/Middlewares/AuthorizeFastifyMiddleware.ts index 47d9a4e2..1b75030a 100644 --- a/src/Auth/Presentation/Middlewares/AuthorizeFastifyMiddleware.ts +++ b/src/Auth/Presentation/Middlewares/AuthorizeFastifyMiddleware.ts @@ -1,7 +1,7 @@ import { FastifyReply, FastifyRequest } from 'fastify'; import { StatusCode } from '@digichanges/shared-experience'; -import MainConfig from '../../../Config/MainConfig'; +import { MainConfig } from '../../../Config/MainConfig'; import container from '../../../Shared/DI/container'; import TokenNotFoundHttpException from '../Exceptions/TokenNotFoundHttpException'; import IAuthorizeService from '../../Domain/Services/IAuthorizeService'; @@ -11,10 +11,9 @@ const AuthorizeFastifyMiddleware = (...handlerPermissions: string[]) => { return async(request: FastifyRequest, reply: FastifyReply) => { - const config = MainConfig.getInstance().getConfig(); - const { authorization: hasActiveAuthorization } = config.auth; + const config = MainConfig.getEnv(); - if (hasActiveAuthorization) + if (config.AUTH_AUTHORIZATION) { try { diff --git a/src/Config/MainConfig.ts b/src/Config/MainConfig.ts index 70f4b8cb..907c1644 100644 --- a/src/Config/MainConfig.ts +++ b/src/Config/MainConfig.ts @@ -1,190 +1,115 @@ -import { readFile } from 'node:fs/promises'; -import { resolve } from 'path'; -import Config from 'config'; -import { TAlgorithm } from 'jwt-simple'; -import { validateEnv } from './validateEnv'; - -export type AuthConfig = { - apiKey: string; - host: string; - secret: string; - authorization: boolean; -}; - -export type AppConfig = { - default: string; - path: string; - setAppProxy: boolean; - setCookieSecure: boolean, - setCookieSameSite: boolean | 'None' | 'Lax' | 'Strict' | 'none' | 'lax' | 'strict', - serverPort: number, -} +import { cleanEnv, str, port, bool, num, url } from 'envalid'; -export type MongooseConfig = { - uri: string; +const APP = +{ + APP_DEFAULT: str(), + APP_PATH: str(), + APP_PORT: port(), + APP_SET_APP_PROXY: bool(), + APP_SET_COOKIE_SECURE: bool(), + APP_SET_COOKIE_SAME_SITE: str(), + APP_CORS: str() }; -export type MikroORMConfig = { - dbName: string, - host: string; - port: number; - type: 'mysql' | 'mariadb' | 'postgresql' | 'sqlite', - user: string; - password: string; +const AUTH = +{ + AUTH_API_KEY: str(), + AUTH_HOST: str(), + AUTH_SECRET: str(), + AUTH_AUTHORIZATION: bool() }; -export type DbConfigType = { - Mongoose: MongooseConfig, - MikroORM: MikroORMConfig, - default: string -} - -export type CacheConfig = { - host: string; - port: number; - user: string; - password: string; +const CACHE = +{ + CACHE_HOST: str({ default: 'redis' }), + CACHE_PORT: port({ default: 6379 }), + CACHE_USER: str({ default: 'experience' }), + CACHE_PASSWORD: str({ default: '12345678' }), + CACHE_ENABLE: bool({ default: false }) }; -export type MinioConfig = { - endPoint: string; - accessKey: string; - secretKey: string; - useSSL: boolean; - port: number; - publicBucket: string; - privateBucket: string; - rootPath: string; - region: string; +const MESSAGE_BROKER = +{ + MESSAGE_BROKER_URI: str() }; -export type JwtConfig = { - secret: string; - expires: number; - iss: string; - aud: string; +const DB = +{ + DB_URI: str(), + DB_ORM_DEFAULT: str() }; -export type MailConfig = { - host: string; - port: number; - username: string; - password: string; - secure: boolean; - senderName: string; - senderEmailDefault: string; - templateDir: string; +const FILESYSTEM = +{ + MINIO_HOST: str(), + MINIO_ACCESS_KEY: str(), + MINIO_SECRET_KEY: str(), + MINIO_USE_SSL: bool(), + MINIO_PORT: port(), + MINIO_PUBLIC_BUCKET: str(), + MINIO_PRIVATE_BUCKET: str(), + MINIO_REGION: str(), + FILESYSTEM_DEFAULT: str() }; -export type PushConfig = { - privateKey: string; - publicKey: string; +const JWT = +{ + JWT_SECRET: str(), + JWT_EXPIRES: num(), + JWT_ISS: str(), + JWT_AUD: str() }; -export type BCryptType = { - type: string; - saltRounds: number; - algorithm: TAlgorithm; +const SMTP = +{ + SMTP_HOST: str(), + SMTP_USERNAME: str({ default: '' }), + SMTP_PASSWORD: str({ default: '' }), + SMTP_PORT: num(), + SMTP_SECURE_SSL: bool(), + SMTP_SENDER_NAME: str(), + SMTP_SENDER_EMAIL_DEFAULT: str(), + SMTP_TEMPLATE_DIR: str({ default: 'src/Shared/Infrastructure/templates/emails' }) }; -export type ValidateSettingsType = { - password: { - minLength: number; - maxLength: number; - }; +const URL = +{ + URL_API: url(), + URL_WEB: url() }; -export type MessageBrokerConfig = { - uri: string -} - -export type ConfigType = { - env: string, - auth: AuthConfig; - app: AppConfig, - dbConfig: DbConfigType, - messageBroker: MessageBrokerConfig, - cache: { - redis: CacheConfig, - enable: boolean - }; - filesystem: { - minio: MinioConfig, - default: string, - expiry: number - }; - encryption: { - bcrypt: BCryptType, - default: string - }; - jwt: JwtConfig, - mail: MailConfig, - push: PushConfig, - url: { - urlApi: string, - urlWeb: string - }; - productInfo: { - name: string - }; - executeCrons: boolean, - validationSettings: ValidateSettingsType -} - -export type DomainInfoConfig = { - name: string, - fileInfra: string, - handlers: string[] -} - -export type ConfigInfoType = { - http: string[], - orm: string[], - domains: DomainInfoConfig[] -} - -class MainConfig +const PUSH = { - private readonly mainConfig: ConfigType; - private static instance: MainConfig = new MainConfig(); + PUSH_PUBLIC_KEY: str(), + PUSH_PRIVATE_KEY: str() +}; - private constructor() +export class MainConfig +{ + static getEnv() { - const cleanEnv: any = validateEnv(); - - process.env = { ...process.env, ...cleanEnv }; + return cleanEnv(process.env, { + NODE_ENV: str({ default: 'development' }), - this.mainConfig = Config.util.loadFileConfigs(); + ...APP, + ...AUTH, + ...CACHE, + ...MESSAGE_BROKER, + ...DB, + ...FILESYSTEM, - if (MainConfig.instance) - { - throw new Error('Error: Instantiation failed: Use getInstance() instead of new.'); - } + TZ: str(), - MainConfig.instance = this; - } - - public static getInstance(): MainConfig - { - if (!MainConfig.instance) - { - MainConfig.instance = new MainConfig(); - } + ...JWT, + ...SMTP, + ...URL, - return MainConfig.instance; - } + PRODUCT_NAME: str(), + ENCRYPTION_DEFAULT: str(), - public getConfig(): ConfigType - { - return this.mainConfig; - } + ...PUSH, - public async getConfigInfo(): Promise - { - const path = resolve('config/info.json'); - const file = await readFile(path); - return JSON.parse(file.toString()); + EXECUTE_CRONS: bool() + }); } } - -export default MainConfig; diff --git a/src/Config/validateEnv.ts b/src/Config/validateEnv.ts deleted file mode 100644 index e72e6518..00000000 --- a/src/Config/validateEnv.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { cleanEnv, str, port, bool, num, url } from 'envalid'; - -export function validateEnv() -{ - return cleanEnv(process.env, { - NODE_ENV: str({ default: 'development' }), - - APP_DEFAULT: str(), - APP_PATH: str(), - APP_PORT: port(), - APP_SET_APP_PROXY: bool(), - APP_SET_COOKIE_SECURE: bool(), - APP_SET_COOKIE_SAME_SITE: str(), - APP_CORS: str(), - - AUTH_API_KEY: str(), - AUTH_HOST: str(), - AUTH_SECRET: str(), - AUTH_AUTHORIZATION: bool(), - - CACHE_HOST: str({ default: 'redis' }), - CACHE_PORT: port({ default: 6379 }), - CACHE_USER: str({ default: 'experience' }), - CACHE_PASSWORD: str({ default: '12345678' }), - CACHE_ENABLE: bool({ default: false }), - - MESSAGE_BROKER_URI: str(), - - DB_URI: str(), - DB_ORM_DEFAULT: str(), - DB_TYPE: str(), - - MINIO_HOST: str(), - MINIO_ACCESS_KEY: str(), - MINIO_SECRET_KEY: str(), - MINIO_USE_SSL: bool(), - MINIO_PORT: port(), - MINIO_PUBLIC_BUCKET: str(), - MINIO_PRIVATE_BUCKET: str(), - MINIO_REGION: str(), - FILESYSTEM_DEFAULT: str(), - - TZ: str(), - - JWT_SECRET: str(), - JWT_EXPIRES: num(), - JWT_ISS: str(), - JWT_AUD: str(), - - SMTP_HOST: str(), - SMTP_PORT: num(), - SMTP_SECURE_SSL: bool(), - SMTP_SENDER_NAME: str(), - SMTP_SENDER_EMAIL_DEFAULT: str(), - - URL_API: url(), - URL_WEB: url(), - - PRODUCT_NAME: str(), - ENCRYPTION_DEFAULT: str(), - PUSH_PRIVATE_KEY: str(), - PUSH_PUBLIC_KEY: str(), - EXECUTE_CRONS: bool() - }); -} diff --git a/src/Item/Tests/item.handler.spec.ts b/src/Item/Tests/item.handler.spec.ts index f1054f2d..f8b62579 100644 --- a/src/Item/Tests/item.handler.spec.ts +++ b/src/Item/Tests/item.handler.spec.ts @@ -1,7 +1,7 @@ import { SuperAgentTest } from 'supertest'; import initTestServer from '../../initTestServer'; import { IItemResponse, IListItemsResponse } from './types'; -import MainConfig from '../../Config/MainConfig'; +import { MainConfig } from '../../Config/MainConfig'; import ICreateConnection from '../../Main/Infrastructure/Database/ICreateConnection'; describe('Start Item Test', () => @@ -106,7 +106,7 @@ describe('Start Item Test', () => test('Get Items /items with pagination', async() => { - const config = MainConfig.getInstance(); + const config = MainConfig.getEnv(); const response: IListItemsResponse = await request .get('/api/items?pagination[offset]=0&pagination[limit]=5') @@ -123,7 +123,7 @@ describe('Start Item Test', () => expect(pagination.lastPage).toStrictEqual(3); expect(pagination.from).toStrictEqual(0); expect(pagination.to).toStrictEqual(5); - expect(pagination.path).toContain(config.getConfig().url.urlApi); + expect(pagination.path).toContain(config.URL_API); expect(pagination.firstUrl).toContain('/api/items?pagination[offset]=0&pagination[limit]=5'); expect(pagination.lastUrl).toContain('/api/items?pagination[offset]=10&pagination[limit]=5'); expect(pagination.nextUrl).toContain('/api/items?pagination[offset]=5&pagination[limit]=5'); diff --git a/src/Main/Infrastructure/Database/CreateMikroORMConnection.ts b/src/Main/Infrastructure/Database/CreateMikroORMConnection.ts index b969de13..0c8ca796 100644 --- a/src/Main/Infrastructure/Database/CreateMikroORMConnection.ts +++ b/src/Main/Infrastructure/Database/CreateMikroORMConnection.ts @@ -25,12 +25,7 @@ class CreateMikroORMConnection implements ICreateConnection { orm = await MikroORM.init({ entities: this.entities, - clientUrl: '', - dbName: this.config.dbName, - host: this.config.host, - port: this.config.port, - user: this.config.user, - password: this.config.password, + clientUrl: this.config.DB_URI, allowGlobalContext: true }); diff --git a/src/Main/Infrastructure/Factories/DatabaseFactory.ts b/src/Main/Infrastructure/Factories/DatabaseFactory.ts index 95816226..3dd6dd47 100644 --- a/src/Main/Infrastructure/Factories/DatabaseFactory.ts +++ b/src/Main/Infrastructure/Factories/DatabaseFactory.ts @@ -1,4 +1,4 @@ -import MainConfig from '../../../Config/MainConfig'; +import { MainConfig } from '../../../Config/MainConfig'; import CreateMongooseConnection from '../Database/CreateMongooseConnection'; import CreateMikroORMConnection from '../Database/CreateMikroORMConnection'; import ICreateConnection from '../Database/ICreateConnection'; @@ -7,18 +7,20 @@ type DbValueProp = typeof CreateMongooseConnection | typeof CreateMikroORMConnec class DatabaseFactory { - #config = MainConfig.getInstance().getConfig().dbConfig; - - create(_db?: string): ICreateConnection + create(_db = 'Mongoose'): ICreateConnection { - const dbDefault = this.#config.default; - const db = _db ?? dbDefault; + const env = MainConfig.getEnv(); + const db = env.DB_ORM_DEFAULT; const strategy = new Map(); strategy.set('Mongoose', CreateMongooseConnection); strategy.set('MikroORM', CreateMikroORMConnection); - return new (strategy.get(db))(this.#config[db]); + const config = { + uri: env.DB_URI + }; + + return new (strategy.get(db))(config); } } diff --git a/src/Main/Infrastructure/Repositories/RedisCacheDataAccess.ts b/src/Main/Infrastructure/Repositories/RedisCacheDataAccess.ts index 2a5d4311..d8a8c3f5 100644 --- a/src/Main/Infrastructure/Repositories/RedisCacheDataAccess.ts +++ b/src/Main/Infrastructure/Repositories/RedisCacheDataAccess.ts @@ -1,6 +1,12 @@ import { Tedis } from 'tedis'; import ICacheDataAccess from './ICacheDataAccess'; -import { CacheConfig } from '../../../Config/MainConfig'; + +export type CacheConfig = { + host: string; + port: number; + user: string; + password: string; +}; class RedisCacheDataAccess implements ICacheDataAccess { diff --git a/src/Main/Presentation/Http/FastifyBootstrapping.ts b/src/Main/Presentation/Http/FastifyBootstrapping.ts index 07cdf530..b8745c44 100644 --- a/src/Main/Presentation/Http/FastifyBootstrapping.ts +++ b/src/Main/Presentation/Http/FastifyBootstrapping.ts @@ -18,7 +18,7 @@ const FastifyBootstrapping = async(config: IExtendAppConfig) => await app.addMiddleware(cors, { origin: (origin: string, cb: (err: Error, valid: boolean) => void) => { - const validDomain = [process.env.APP_CORS]; + const validDomain = [config.cors]; if (validDomain[0] === '*') { diff --git a/src/Main/Presentation/Http/IExtendAppConfig.ts b/src/Main/Presentation/Http/IExtendAppConfig.ts index 45c133d4..2908aef2 100644 --- a/src/Main/Presentation/Http/IExtendAppConfig.ts +++ b/src/Main/Presentation/Http/IExtendAppConfig.ts @@ -1,5 +1,8 @@ import { IAppConfig } from '@digichanges/shared-experience'; -type IExtendAppConfig = IAppConfig & { env: string, dbConfigDefault: string }; +type IExtendAppConfig = IAppConfig & { + env: string, + cors: string +}; export default IExtendAppConfig; diff --git a/src/Notification/Shared/EmailStrategy.ts b/src/Notification/Shared/EmailStrategy.ts index 1f395bde..7da68d66 100644 --- a/src/Notification/Shared/EmailStrategy.ts +++ b/src/Notification/Shared/EmailStrategy.ts @@ -4,13 +4,13 @@ import Fs from 'fs'; import { REPOSITORIES } from '../../Shared/DI/Injects'; import INotificationRepository from '../Infrastructure/Repositories/INotificationRepository'; import INotificationDomain from '../Domain/Entities/INotificationDomain'; -import MainConfig from '../../Config/MainConfig'; import AttachmentsFilesService from '../Domain/Services/AttachmentsFilesService'; import StatusNotificationEnum from '../Domain/Enum/StatusNotificationEnum'; import EmailNotification from '../Domain/Entities/EmailNotification'; import INotifierStrategy from './INotifierStrategy'; import { ErrorException } from '@digichanges/shared-experience'; import container from '../../Shared/DI/container'; +import { MainConfig } from '../../Config/MainConfig'; class EmailStrategy implements INotifierStrategy { @@ -73,32 +73,32 @@ class EmailStrategy implements INotifierStrategy throw new ErrorException({ message: 'You need set an emailNotification, templatePathNameFile and data' }, 'NotificatorException'); } - const config = MainConfig.getInstance().getConfig(); + const config = MainConfig.getEnv(); try { - const host: string = config.mail.host; - const port: number = config.mail.port; - const secure: boolean = config.mail.secure; - const templateRoot: string = config.mail.templateDir; + const host: string = config.SMTP_HOST; + const port: number = config.SMTP_PORT; + const secure: boolean = config.SMTP_SECURE_SSL; + const templateRoot: string = config.SMTP_TEMPLATE_DIR; this.#_templatePathNameFile = templatePathNameFile; const templateDir = `${process.cwd()}/${templateRoot}/${this.#_templatePathNameFile}`; const smtp_config = { host, port, secure }; - if (config.mail.username && config.mail.password) + if (config.SMTP_USERNAME && config.SMTP_PASSWORD) { const auth = { auth: { - user: String(config.mail.username), - pass: String(config.mail.password) + user: String(config.SMTP_USERNAME), + pass: String(config.SMTP_PASSWORD) } }; Object.assign(smtp_config, auth); } - this.#_emailNotification.senderName = config.mail.senderName; - this.#_emailNotification.from = config.mail.senderEmailDefault; + this.#_emailNotification.senderName = config.SMTP_SENDER_NAME; + this.#_emailNotification.from = config.SMTP_SENDER_EMAIL_DEFAULT; this.#_emailNotification.emailTemplatePath = templateDir; const transporter = nodemailer.createTransport(smtp_config); diff --git a/src/Notification/Shared/WebPushStrategy.ts b/src/Notification/Shared/WebPushStrategy.ts index dd954a06..7cae78db 100644 --- a/src/Notification/Shared/WebPushStrategy.ts +++ b/src/Notification/Shared/WebPushStrategy.ts @@ -1,7 +1,7 @@ import webPush from 'web-push'; -import MainConfig from '../../Config/MainConfig'; import INotifierStrategy from './INotifierStrategy'; import PushNotification from '../Domain/Entities/PushNotification'; +import { MainConfig } from '../../Config/MainConfig'; class WebPushStrategy implements INotifierStrategy { @@ -46,13 +46,13 @@ class WebPushStrategy implements INotifierStrategy public async send() { - const config = MainConfig.getInstance(); + const config = MainConfig.getEnv(); try { - const publicKey: string = config.getConfig().push.publicKey; - const privateKey: string = config.getConfig().push.privateKey; - const subject: string = config.getConfig().url.urlWeb; + const publicKey: string = config.PUSH_PUBLIC_KEY; + const privateKey: string = config.PUSH_PRIVATE_KEY; + const subject: string = config.URL_WEB; const pushSubscription = this._pushNotification.getSubscription(); diff --git a/src/Shared/DI/container.ts b/src/Shared/DI/container.ts index 1e00aed7..b7057d98 100644 --- a/src/Shared/DI/container.ts +++ b/src/Shared/DI/container.ts @@ -4,8 +4,6 @@ import { IEncryption, Md5EncryptionStrategy } from '@digichanges/shared-experien import { FACTORIES, SERVICES, REPOSITORIES } from './Injects'; -import MainConfig from '../../Config/MainConfig'; - import IAuthRepository from '../../Auth/Domain/Repositories/IAuthRepository'; import IItemRepository from '../../Item/Domain/Repositories/IItemRepository'; import INotificationRepository from '../../Notification/Infrastructure/Repositories/INotificationRepository'; @@ -28,6 +26,7 @@ import DatabaseFactory from '../../Main/Infrastructure/Factories/DatabaseFactory import { IMessageBroker } from '../Infrastructure/IMessageBroker'; import RabbitMQMessageBroker from '../Infrastructure/RabbitMQMessageBroker'; import CronService, { ICronService } from '../../Main/Infrastructure/Factories/CronService'; +import { MainConfig } from '../../Config/MainConfig'; import IFileVersionRepository from '../../File/Infrastructure/Repositories/IFileVersionRepository'; import IFileRepository from '../../File/Infrastructure/Repositories/IFileRepository'; @@ -36,15 +35,21 @@ import FileMongooseRepository from '../../File/Infrastructure/Repositories/FileM import EventHandler, { IEventHandler } from '../../Notification/Infrastructure/events/EventHandler'; -const config = MainConfig.getInstance().getConfig(); -const defaultDbConfig = config.dbConfig.default; -const cacheConfig = config.cache; +const config = MainConfig.getEnv(); +const defaultDbConfig = config.DB_ORM_DEFAULT; +const cacheConfig = { + host: config.CACHE_HOST, + port: config.CACHE_PORT, + enable: config.CACHE_ENABLE, + user: config.CACHE_USER, + password: config.CACHE_PASSWORD +}; // Data Access Objects container.register(REPOSITORIES.ICacheDataAccess, { // @ts-ignore - useFactory: instanceCachingFactory(() => new RedisCacheDataAccess(cacheConfig.redis)) + useFactory: instanceCachingFactory(() => new RedisCacheDataAccess(cacheConfig)) }, { lifecycle: Lifecycle.Transient } ); @@ -98,7 +103,7 @@ container.register('ICronService', { // @ts-ignore useFactory: instanceCachingFactory(() => { - return new CronService({ executeCrons: config.executeCrons }); + return new CronService({ executeCrons: config.EXECUTE_CRONS }); }) }, { lifecycle: Lifecycle.Transient }); diff --git a/src/Shared/Factories/AxiosFactory.ts b/src/Shared/Factories/AxiosFactory.ts index 13858674..9a2386f5 100644 --- a/src/Shared/Factories/AxiosFactory.ts +++ b/src/Shared/Factories/AxiosFactory.ts @@ -1,9 +1,7 @@ import axios, { AxiosInstance } from 'axios'; -import MainConfig from '../../Config/MainConfig'; import AxiosHandler from '../Infrastructure/AxiosHandler'; -const port = MainConfig.getInstance().getConfig().app.serverPort; -const baseURL = `http://localhost:${port}/api/`; +const baseURL = 'http://localhost:8080/api/'; const timeout = 3000; const headersPublic = { 'Content-Type': 'application/json', diff --git a/src/Shared/Factories/FilesystemFactory.ts b/src/Shared/Factories/FilesystemFactory.ts index 09b8d114..852185cb 100644 --- a/src/Shared/Factories/FilesystemFactory.ts +++ b/src/Shared/Factories/FilesystemFactory.ts @@ -1,5 +1,5 @@ -import MainConfig from '../../Config/MainConfig'; import { IFilesystem, MinioStrategy } from '@digichanges/shared-experience'; +import { MainConfig } from '../../Config/MainConfig'; type FilesystemValueProp = typeof MinioStrategy; @@ -7,9 +7,19 @@ class FilesystemFactory { static create(_default?: 'minio'): IFilesystem { - const config = MainConfig.getInstance().getConfig().filesystem; - const filesystemKey = _default ?? config.default; - const filesystemConfig = config[filesystemKey]; + const config = MainConfig.getEnv(); + const filesystemKey = _default ?? config.FILESYSTEM_DEFAULT; + const filesystemConfig = { + endPoint: config.MINIO_HOST, + accessKey: config.MINIO_ACCESS_KEY, + secretKey: config.MINIO_SECRET_KEY, + useSSL: config.MINIO_USE_SSL, + port: config.MINIO_PORT, + publicBucket: config.MINIO_PUBLIC_BUCKET, + privateBucket: config.MINIO_PRIVATE_BUCKET, + rootPath: '/data', + region: config.MINIO_REGION + }; const strategy = new Map(); strategy.set('minio', MinioStrategy); diff --git a/src/Shared/Helpers/Logger.ts b/src/Shared/Helpers/Logger.ts index 6dddc178..962eda18 100644 --- a/src/Shared/Helpers/Logger.ts +++ b/src/Shared/Helpers/Logger.ts @@ -1,5 +1,5 @@ -import MainConfig from '../../Config/MainConfig'; import PinoLogger from 'pino'; +import { MainConfig } from '../../Config/MainConfig'; class DgLogger { @@ -7,7 +7,7 @@ class DgLogger constructor() { - const env = MainConfig.getInstance().getConfig().env; + const env = MainConfig.getEnv().NODE_ENV; const prettyTransport = { transport: { diff --git a/src/Shared/Infrastructure/IMessageBroker.ts b/src/Shared/Infrastructure/IMessageBroker.ts index 2ad5aa9b..07f5acfc 100644 --- a/src/Shared/Infrastructure/IMessageBroker.ts +++ b/src/Shared/Infrastructure/IMessageBroker.ts @@ -1,6 +1,9 @@ -import { MessageBrokerConfig } from '../../Config/MainConfig'; import IJob from '../../Main/Infrastructure/Jobs/IJob'; +export type MessageBrokerConfig = { + uri: string +} + export interface PublishParams { exchange: string; diff --git a/src/Shared/Infrastructure/RabbitMQMessageBroker.ts b/src/Shared/Infrastructure/RabbitMQMessageBroker.ts index 53531e72..598379c5 100644 --- a/src/Shared/Infrastructure/RabbitMQMessageBroker.ts +++ b/src/Shared/Infrastructure/RabbitMQMessageBroker.ts @@ -1,8 +1,7 @@ import { Connection, Channel, connect } from 'amqplib'; import { ErrorException } from '@digichanges/shared-experience'; -import { IMessageBroker, PublishParams, SubscribeParams } from './IMessageBroker'; -import { MessageBrokerConfig } from '../../Config/MainConfig'; +import { IMessageBroker, PublishParams, SubscribeParams, MessageBrokerConfig } from './IMessageBroker'; class RabbitMQMessageBroker implements IMessageBroker { diff --git a/src/Shared/Tests/MockMessageBroker.ts b/src/Shared/Tests/MockMessageBroker.ts index 5819d197..70d6dd35 100644 --- a/src/Shared/Tests/MockMessageBroker.ts +++ b/src/Shared/Tests/MockMessageBroker.ts @@ -1,5 +1,4 @@ -import { IMessageBroker, PublishParams, SubscribeParams } from '../Infrastructure/IMessageBroker'; -import { MessageBrokerConfig } from '../../Config/MainConfig'; +import { IMessageBroker, PublishParams, SubscribeParams, MessageBrokerConfig } from '../Infrastructure/IMessageBroker'; import Logger from '../Helpers/Logger'; class MockMessageBroker implements IMessageBroker diff --git a/src/Shared/Tests/messageBroker.spec.ts b/src/Shared/Tests/messageBroker.spec.ts index 6cb288fd..3be17db0 100644 --- a/src/Shared/Tests/messageBroker.spec.ts +++ b/src/Shared/Tests/messageBroker.spec.ts @@ -3,9 +3,9 @@ import ICreateConnection from '../../Main/Infrastructure/Database/ICreateConnect import MockMessageBroker from './MockMessageBroker'; import DependencyInjector from '../DI/DependencyInjector'; import { IMessageBroker } from '../Infrastructure/IMessageBroker'; -import MainConfig from '../../Config/MainConfig'; import IJob from '../../Main/Infrastructure/Jobs/IJob'; import Logger from '../Helpers/Logger'; +import { MainConfig } from '../../Config/MainConfig'; jest.mock('../Infrastructure/RabbitMQMessageBroker', () => ({ __esModule: true, @@ -48,9 +48,9 @@ describe('Start Item Test', () => test('debería probar la lógica sin conectar a RabbitMQ', async() => { - const config = MainConfig.getInstance().getConfig().messageBroker; + const uri = MainConfig.getEnv().MESSAGE_BROKER_URI; const messageBroker = DependencyInjector.inject('IMessageBroker'); - await messageBroker.connect(config); + await messageBroker.connect({ uri }); await messageBroker.publish({ exchange: 'MyExchange', diff --git a/src/Shared/Utils/Pagination.ts b/src/Shared/Utils/Pagination.ts index 2060c4c8..2892a1cc 100644 --- a/src/Shared/Utils/Pagination.ts +++ b/src/Shared/Utils/Pagination.ts @@ -1,6 +1,6 @@ import qs from 'qs'; -import MainConfig from '../../Config/MainConfig'; import { IPagination } from '@digichanges/shared-experience'; +import { MainConfig } from '../../Config/MainConfig'; class Pagination implements IPagination { @@ -18,8 +18,7 @@ class Pagination implements IPagination this.limit = query?.pagination ? +this.pagination.limit : 10; this.offset = query?.pagination ? +this.pagination.offset : 0; this.exist = query?.pagination !== undefined; - const config = MainConfig.getInstance(); - this.host = config.getConfig().url.urlApi; + this.host = MainConfig.getEnv().URL_API; } getPath(): string diff --git a/src/command.ts b/src/command.ts index 75a58ce3..dfac74cc 100644 --- a/src/command.ts +++ b/src/command.ts @@ -1,9 +1,6 @@ import { exit } from 'shelljs'; import commander from 'commander'; -import dotenv from 'dotenv'; -dotenv.config(); // Need before get config - process.env.SUPPRESS_NO_CONFIG_WARNING = 'y'; import './Shared/DI/container'; diff --git a/src/index.ts b/src/index.ts index 4e115709..6dec6b3b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,9 @@ -import dotenv from 'dotenv'; -dotenv.config(); - import { EventHandler, IApp } from '@digichanges/shared-experience'; import DependencyInjector from './Shared/DI/DependencyInjector'; import { FACTORIES, REPOSITORIES } from './Shared/DI/Injects'; -import MainConfig from './Config/MainConfig'; +import { MainConfig } from './Config/MainConfig'; import DatabaseFactory from './Main/Infrastructure/Factories/DatabaseFactory'; import { ICronService } from './Main/Infrastructure/Factories/CronService'; @@ -25,16 +22,14 @@ void (async() => { try { - const config = MainConfig.getInstance().getConfig(); - // Init Application - const appBootstrap = AppBootstrapFactory.create(config.app.default); + const appBootstrap = AppBootstrapFactory.create(MainConfig.getEnv().APP_DEFAULT); const app: IApp = await appBootstrap({ - serverPort: config.app.serverPort, - proxy: config.app.setAppProxy, - env: config.env, - dbConfigDefault: config.dbConfig.default + serverPort: MainConfig.getEnv().APP_PORT, + proxy: MainConfig.getEnv().APP_SET_APP_PROXY, + env: MainConfig.getEnv().NODE_ENV, + cors: MainConfig.getEnv().APP_CORS }); await app.listen(); @@ -48,7 +43,7 @@ void (async() => // Create Cache connection let cache: ICacheDataAccess; - if (config.cache.enable) + if (MainConfig.getEnv().CACHE_ENABLE) { cache = DependencyInjector.inject(REPOSITORIES.ICacheDataAccess); await cache.cleanAll(); @@ -68,7 +63,7 @@ void (async() => // Message Broker const messageBroker = DependencyInjector.inject('IMessageBroker'); - await messageBroker.connect(config.messageBroker); + await messageBroker.connect({ uri: MainConfig.getEnv().MESSAGE_BROKER_URI }); // Close gracefully const server = await app.getServer(); diff --git a/src/initCommand.ts b/src/initCommand.ts index cf676b06..cbadbf44 100644 --- a/src/initCommand.ts +++ b/src/initCommand.ts @@ -1,9 +1,9 @@ import DatabaseFactory from './Main/Infrastructure/Factories/DatabaseFactory'; -import { validateEnv } from './Config/validateEnv'; +import { MainConfig } from './Config/MainConfig'; const initCommand = async() => { - validateEnv(); + MainConfig.getEnv(); const databaseFactory = new DatabaseFactory(); diff --git a/src/initTestServer.ts b/src/initTestServer.ts index 151c533c..70f6d313 100644 --- a/src/initTestServer.ts +++ b/src/initTestServer.ts @@ -7,9 +7,9 @@ import container from './Shared/DI/container'; import supertest from 'supertest'; +import { MainConfig } from './Config/MainConfig'; import DatabaseFactory from './Main/Infrastructure/Factories/DatabaseFactory'; import SeedFactory from './Shared/Factories/SeedFactory'; -import MainConfig from './Config/MainConfig'; import AppBootstrapFactory from './Main/Presentation/Factories/AppBootstrapFactory'; import ICreateConnection from './Main/Infrastructure/Database/ICreateConnection'; import IAuthRepository from './Auth/Domain/Repositories/IAuthRepository'; @@ -27,7 +27,7 @@ type TestServerData = { const initTestServer = async(): Promise => { - const config = MainConfig.getInstance().getConfig(); + const config = MainConfig.getEnv(); const databaseFactory: DatabaseFactory = new DatabaseFactory(); const dbConnection: ICreateConnection = databaseFactory.create(); @@ -43,13 +43,13 @@ const initTestServer = async(): Promise => container._registry._registryMap.delete('IAuthRepository'); container.register(REPOSITORIES.IAuthRepository, { useClass: AuthMockRepository }, { lifecycle: Lifecycle.Singleton }); - const appBootstrap = AppBootstrapFactory.create(config.app.default); + const appBootstrap = AppBootstrapFactory.create(config.APP_DEFAULT); const app: IApp = await appBootstrap({ serverPort: 8088, proxy: false, env: 'test', - dbConfigDefault: 'Mongoose' + cors: config.APP_CORS }); const application = await app.callback(); @@ -58,7 +58,7 @@ const initTestServer = async(): Promise => const seed = new SeedFactory(); await seed.init(); - await request.set({ Origin: config.url.urlWeb, Accept: 'application/json' }); + await request.set({ Origin: config.URL_WEB, Accept: 'application/json' }); return { request, dbConnection }; }; diff --git a/src/worker.ts b/src/worker.ts index 9407ff77..492e3f70 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -11,14 +11,15 @@ import Logger from './Shared/Helpers/Logger'; import closedApplication from './closed'; import ICacheDataAccess from './Main/Infrastructure/Repositories/ICacheDataAccess'; import { IMessageBroker } from './Shared/Infrastructure/IMessageBroker'; -import MainConfig from './Config/MainConfig'; import NotificationEmailJob from './Notification/Infrastructure/Jobs/NotificationEmailJob'; +import { MainConfig } from './Config/MainConfig'; + void (async() => { try { - const config = MainConfig.getInstance().getConfig(); + const config = MainConfig.getEnv(); // Init Application // Create DB connection @@ -29,7 +30,7 @@ void (async() => // Message Broker const messageBroker = DependencyInjector.inject('IMessageBroker'); - await messageBroker.connect(config.messageBroker); + await messageBroker.connect({ uri: MainConfig.getEnv().MESSAGE_BROKER_URI }); await messageBroker.subscribe({ queue: 'email', job: new NotificationEmailJob(), @@ -45,7 +46,7 @@ void (async() => // Create Cache connection let cache: ICacheDataAccess; - if (config.cache.enable) + if (MainConfig.getEnv().CACHE_ENABLE) { cache = DependencyInjector.inject(REPOSITORIES.ICacheDataAccess); await cache.cleanAll();