Skip to content

Commit

Permalink
feat: split env and env spec
Browse files Browse the repository at this point in the history
  • Loading branch information
Geoffroy Empain committed Dec 9, 2020
1 parent 3cfe66a commit 7be1864
Show file tree
Hide file tree
Showing 41 changed files with 123 additions and 120 deletions.
2 changes: 1 addition & 1 deletion src/auth/auth.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../env';
import { env } from '../env/env';

export const authCookieName = 'auth';

Expand Down
2 changes: 1 addition & 1 deletion src/auth/authenticate.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextFunction, Request, Response } from 'express';
import { createOrUpdateUser, PassportUser } from './create-or-update-user';
import { env } from '../env';
import { env } from '../env/env';
import { authCookieName, getCookieOptions, JwtToken } from './auth';
import jwt from 'jsonwebtoken';
import { wrapAsyncMiddleware } from '../commons/utils/wrap-async-middleware';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/handlers/redirect-to-ui.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Request, Response } from 'express';
import { env } from '../../env';
import { env } from '../../env/env';
import { Logger } from '../../commons/logger/logger';

const logger = new Logger('meli.api:redirectToUi');
Expand Down
2 changes: 1 addition & 1 deletion src/auth/passport/gitea.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import passport from 'passport';
import { Gitea } from './providers/gitea/gitea';
import { PassportUser } from '../create-or-update-user';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/passport/github.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import passport from 'passport';
import { Github } from './providers/github/github';
import { PassportUser } from '../create-or-update-user';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/passport/gitlab.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import passport from 'passport';
import { IncomingMessage } from 'http';
import { Gitlab } from './providers/gitlab/gitlab';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/passport/google.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import passport from 'passport';
import { PassportUser } from '../create-or-update-user';
import chalk from 'chalk';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/passport/in-memory.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import passport from 'passport';
import { Logger } from '../../commons/logger/logger';
import { authMethods } from './auth-methods';
Expand Down
2 changes: 1 addition & 1 deletion src/auth/utils/verify-token.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { User, Users } from '../../entities/users/user';
import { env } from '../../env';
import { env } from '../../env/env';
import { JwtToken } from '../auth';
import jwt from 'jsonwebtoken';
import { promisify } from 'util';
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/api-route.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import { getReverseProxyDial } from '../utils/get-reverse-proxy-dial';
import { URL } from 'url';

Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/fallback.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getReverseProxyDial } from '../utils/get-reverse-proxy-dial';
import { env } from '../../env';
import { env } from '../../env/env';

export const fallback = {
/*
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/generate-site-routes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AcmeSslConfiguration, Site, SiteDomain } from '../../entities/sites/site';
import { env } from '../../env';
import { env } from '../../env/env';
import { unique } from '../../utils/arrays-utils';
import { RedirectType, ReverseProxyRedirectConfig } from '../../entities/sites/redirect';
import { relative, resolve } from 'path';
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/get-error-routes.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import { getReverseProxyDial } from '../utils/get-reverse-proxy-dial';
import { Site } from '../../entities/sites/site';
import { getSiteErrorRoutes } from './get-site-error-routes';
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/get-site-error-routes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Site } from '../../entities/sites/site';
import { URL } from 'url';
import { env } from '../../env';
import { env } from '../../env/env';
import { getBranchDirInCaddy } from '../utils/get-branch-dir-in-caddy';

const sitesUrl = new URL(env.MELI_SITES_URL);
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/config/ui-route.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../env';
import { env } from '../../env/env';
import { getReverseProxyDial } from '../utils/get-reverse-proxy-dial';
import { URL } from 'url';

Expand Down
2 changes: 1 addition & 1 deletion src/caddy/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import axios from 'axios';
import { Logger } from '../commons/logger/logger';
import { env } from '../env';
import { env } from '../env/env';
import { Site } from '../entities/sites/site';
import { Branch } from '../entities/sites/branch';
import { generateConfig } from './generate-config';
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/generate-config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Sites } from '../entities/sites/site';
import { env } from '../env';
import { env } from '../env/env';
import { generateSiteRoutes } from './config/generate-site-routes';
import { getErrorRoutes } from './config/get-error-routes';
import { generateManualCertificatesConfig, generateServerTlsConfig } from './config/ssl';
Expand Down
2 changes: 1 addition & 1 deletion src/caddy/utils/get-branch-dir-in-caddy.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { relative, resolve } from 'path';
import { env } from '../../env';
import { env } from '../../env/env';
import { getBranchStaticDir } from '../../entities/sites/get-site-dir';
import { Branch } from '../../entities/sites/branch';

Expand Down
2 changes: 1 addition & 1 deletion src/db/db.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Db, MongoClient } from 'mongodb';
import { env } from '../env';
import { env } from '../env/env';

const client = new MongoClient(env.MELI_MONGO_URI, {
useNewUrlParser: true,
Expand Down
2 changes: 1 addition & 1 deletion src/db/migrate/migrate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Db, MongoClient } from 'mongodb';
import { migrate } from './migrate';
import * as _rollback from './roll-backwards';
import * as _rollup from './roll-forward';
import { env } from '../../env';
import { env } from '../../env/env';

jest.mock('../../env', () => ({ env: {} }));
import SpyInstance = jest.SpyInstance;
Expand Down
2 changes: 1 addition & 1 deletion src/db/migrate/migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Db, MongoClient } from 'mongodb';
import { rollBackwards } from './roll-backwards';
import { rollForward } from './roll-forward';
import { Logger } from '../../commons/logger/logger';
import { env } from '../../env';
import { env } from '../../env/env';

const logger = new Logger('meli.api:migrate.migrate');

Expand Down
2 changes: 1 addition & 1 deletion src/emails/emails.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import nodemailer, { SentMessageInfo, TransportOptions } from 'nodemailer';
import { env } from '../env';
import { env } from '../env/env';
import Mail from 'nodemailer/lib/mailer';
import { Logger } from '../commons/logger/logger';
import chalk from 'chalk';
Expand Down
2 changes: 1 addition & 1 deletion src/emails/send-email.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { promises } from 'fs';
import { AppError } from '../commons/errors/app-error';
import { emails } from './emails';
import { compile, TemplateDelegate } from 'handlebars';
import { env } from '../env';
import { env } from '../env/env';
import { Logger } from '../commons/logger/logger';

const logger = new Logger('meli.api:sendEmailTemplate');
Expand Down
2 changes: 1 addition & 1 deletion src/entities/orgs/guards/max-org-guard.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { guard } from '../../../commons/express/guard';
import { Orgs } from '../org';
import { env } from '../../../env';
import { env } from '../../../env/env';

export const maxOrgsGuard = guard(
async () => {
Expand Down
2 changes: 1 addition & 1 deletion src/entities/orgs/handlers/invites/add-invite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { $id } from '../../../../utils/id';
import { orgExistsGuard } from '../../guards/org-exists-guard';
import { body } from '../../../../commons/express-joi/body';
import { Orgs } from '../../org';
import { env } from '../../../../env';
import { env } from '../../../../env/env';
import { sendInvite } from '../../../../emails/methods/send-invite';
import { serializeInvite } from '../../serialize-invite';
import { emitEvent } from '../../../../events/emit-event';
Expand Down
2 changes: 1 addition & 1 deletion src/entities/sites/get-branch-url.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Branch } from './branch';
import { env } from '../../env';
import { env } from '../../env/env';
import { Site } from './site';
import { URL } from 'url';

Expand Down
2 changes: 1 addition & 1 deletion src/entities/sites/get-site-dir.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { join } from 'path';
import { env } from '../../env';
import { env } from '../../env/env';
import { Branch } from './branch';
import { Release } from '../releases/release';
import { Redirect } from './redirect';
Expand Down
2 changes: 1 addition & 1 deletion src/entities/sites/get-site-url.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Site } from './site';
import { env } from '../../env';
import { env } from '../../env/env';
import { URL } from 'url';

const sitesUrl = new URL(env.MELI_SITES_URL);
Expand Down
2 changes: 1 addition & 1 deletion src/entities/sites/hash-password.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { genSalt, hash } from 'bcrypt';
import { env } from '../../env';
import { env } from '../../env/env';
import { BranchPassword } from './branch';

export async function hashPassword(plain: string): Promise<BranchPassword> {
Expand Down
90 changes: 9 additions & 81 deletions src/env.ts → src/env/env-spec.ts
Original file line number Diff line number Diff line change
@@ -1,84 +1,17 @@
import { EnvSpec } from '../commons/env/parse-env';
import { array, boolean, number, string } from 'joi';
import { commaSeparatedStringToArray, stringToBoolean, stringToInt } from '../commons/env/transformers';
import { isUrl } from '../commons/validators/is-url';
import { AppError } from '../commons/errors/app-error';
import chalk from 'chalk';
import { join } from 'path';
import { cidrSubnet } from 'ip';
import { array, boolean, number, string } from 'joi';
import { tmpdir } from 'os';
import { EnvSpec, parseEnv } from './commons/env/parse-env';
import { commaSeparatedStringToArray, stringToBoolean, stringToInt } from './commons/env/transformers';
import { AppError } from './commons/errors/app-error';
import { isUrl } from './commons/validators/is-url';
import { Logger } from './commons/logger/logger';
import { join } from 'path';

export interface Env {
DEBUG: string;
MELI_PORT: number;
MELI_URL: string;
MELI_URL_INTERNAL: string;
MELI_UI_URL: string;
MELI_UI_URL_INTERNAL: string;
MELI_SITES_URL: string;
MELI_STANDALONE: boolean;
MELI_UI_DIR: string;
MELI_JWT_SECRET: string;
MELI_JWT_TOKEN_EXPIRATION: number;
MELI_MONGO_URI: string;
MELI_GITLAB_URL: string;
MELI_GITLAB_CLIENT_ID: string;
MELI_GITLAB_CLIENT_SECRET: string;
MELI_GITLAB_GROUPS: string[];
MELI_GITEA_URL: string;
MELI_GITEA_CLIENT_ID: string;
MELI_GITEA_CLIENT_SECRET: string;
MELI_GITEA_ORGS: string[];
MELI_GITHUB_URL: string;
MELI_GITHUB_CLIENT_ID: string;
MELI_GITHUB_CLIENT_SECRET: string;
MELI_GITHUB_ORGS: string[];
MELI_GOOGLE_CLIENT_ID: string;
MELI_GOOGLE_CLIENT_SECRET: string;
MELI_MIGRATE_ROLLBACK: boolean;
MELI_SSL_KEY: string;
MELI_SSL_CERT: string;
MELI_COOKIE_SAMESITE: boolean;
MELI_COOKIE_SECURE: boolean;
MELI_RATE_LIMIT_WINDOW: number;
MELI_RATE_LIMIT_MAX_PER_WINDOW: number;
MELI_PROMETHEUS_HOST: string;
MELI_PROMETHEUS_PORT: number;
MELI_PROMETHEUS_REFRESH_RATE: number;
MELI_PROMETHEUS_METRICS_PREFIX: string;
MELI_REDIS_URL: string;
MELI_HOOK_TIMEOUT: number;
MELI_MAIL_HOST: string;
MELI_MAIL_PORT: number;
MELI_MAIL_USERNAME: number;
MELI_MAIL_PASSWORD: number;
MELI_MAIL_FROM: string;
MELI_MAIL_TEMPLATE_DIR: string;
MELI_MAIL_SUBJECT_PREFIX: string;
MELI_SENTRY_ENABLED: boolean;
MELI_RESTRICTED_IPS: string[];
MELI_RESTRICTED_DOMAINS: string[];
MELI_CADDY_DOCKER: boolean;
MELI_CADDY_ADMIN_API_URL: string;
// Caddy content path
MELI_CADDY_DIR: string;
MELI_TMP_DIRECTORY: string;
MELI_SITES_DIR: string;
MELI_INVITE_EXPIRATION_TIME: number;
MELI_STATIC_DIR: string;
MELI_BCRYPT_SALTROUNDS: number;
MELI_ACME_SERVER: string;
MELI_ACME_CA_PATH: string;
MELI_AXIOS_TIMEOUT: number;
MELI_USER: string;
MELI_PASSWORD: string;
MELI_MAX_ORGS: number;
}
import { Env } from './env';

const envSpec: EnvSpec<Env> = {
export const envSpec: EnvSpec<Env> = {
DEBUG: {
schema: string(),
schema: string().optional(),
},
MELI_PORT: {
transform: stringToInt(),
Expand Down Expand Up @@ -319,8 +252,3 @@ const envSpec: EnvSpec<Env> = {
schema: number().optional().default(1),
},
};

export const env: Env = parseEnv(envSpec);

const logger = new Logger('meli.api:env');
logger.debug('loaded env', env);
75 changes: 75 additions & 0 deletions src/env/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { parseEnv } from '../commons/env/parse-env';
import { Logger } from '../commons/logger/logger';
import { envSpec } from './env-spec';

export interface Env {
DEBUG: string;
MELI_PORT: number;
MELI_URL: string;
MELI_URL_INTERNAL: string;
MELI_UI_URL: string;
MELI_UI_URL_INTERNAL: string;
MELI_SITES_URL: string;
MELI_STANDALONE: boolean;
MELI_UI_DIR: string;
MELI_JWT_SECRET: string;
MELI_JWT_TOKEN_EXPIRATION: number;
MELI_MONGO_URI: string;
MELI_GITLAB_URL: string;
MELI_GITLAB_CLIENT_ID: string;
MELI_GITLAB_CLIENT_SECRET: string;
MELI_GITLAB_GROUPS: string[];
MELI_GITEA_URL: string;
MELI_GITEA_CLIENT_ID: string;
MELI_GITEA_CLIENT_SECRET: string;
MELI_GITEA_ORGS: string[];
MELI_GITHUB_URL: string;
MELI_GITHUB_CLIENT_ID: string;
MELI_GITHUB_CLIENT_SECRET: string;
MELI_GITHUB_ORGS: string[];
MELI_GOOGLE_CLIENT_ID: string;
MELI_GOOGLE_CLIENT_SECRET: string;
MELI_MIGRATE_ROLLBACK: boolean;
MELI_SSL_KEY: string;
MELI_SSL_CERT: string;
MELI_COOKIE_SAMESITE: boolean;
MELI_COOKIE_SECURE: boolean;
MELI_RATE_LIMIT_WINDOW: number;
MELI_RATE_LIMIT_MAX_PER_WINDOW: number;
MELI_PROMETHEUS_HOST: string;
MELI_PROMETHEUS_PORT: number;
MELI_PROMETHEUS_REFRESH_RATE: number;
MELI_PROMETHEUS_METRICS_PREFIX: string;
MELI_REDIS_URL: string;
MELI_HOOK_TIMEOUT: number;
MELI_MAIL_HOST: string;
MELI_MAIL_PORT: number;
MELI_MAIL_USERNAME: number;
MELI_MAIL_PASSWORD: number;
MELI_MAIL_FROM: string;
MELI_MAIL_TEMPLATE_DIR: string;
MELI_MAIL_SUBJECT_PREFIX: string;
MELI_SENTRY_ENABLED: boolean;
MELI_RESTRICTED_IPS: string[];
MELI_RESTRICTED_DOMAINS: string[];
MELI_CADDY_DOCKER: boolean;
MELI_CADDY_ADMIN_API_URL: string;
// Caddy content path
MELI_CADDY_DIR: string;
MELI_TMP_DIRECTORY: string;
MELI_SITES_DIR: string;
MELI_INVITE_EXPIRATION_TIME: number;
MELI_STATIC_DIR: string;
MELI_BCRYPT_SALTROUNDS: number;
MELI_ACME_SERVER: string;
MELI_ACME_CA_PATH: string;
MELI_AXIOS_TIMEOUT: number;
MELI_USER: string;
MELI_PASSWORD: string;
MELI_MAX_ORGS: number;
}

export const env: Env = parseEnv(envSpec);

const logger = new Logger('meli.api:env');
logger.debug('loaded env', env);
2 changes: 1 addition & 1 deletion src/hooks/handlers/email/send-email-hook.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { env } from '../../../env';
import { env } from '../../../env/env';
import { emails } from '../../../emails/emails';
import { HookDeliveryResult } from '../get-hook-handler';
import { object, string } from 'joi';
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/handlers/mattermost/send-mattermost-message.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import axios from 'axios';
import { env } from '../../../env';
import { env } from '../../../env/env';
import { object, string } from 'joi';
import { EventType } from '../../../events/event-type';

Expand Down

0 comments on commit 7be1864

Please sign in to comment.