From 16c7a007d574b471617a23ed60e8af22fd40b094 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 13 Dec 2025 16:58:30 +0000 Subject: [PATCH] env --- .../infrastructure/InfraMonitorsTable.tsx | 2 ++ .../src/controllers/DiagnosticController.ts | 11 +++++++- server/src/routes/diagnostic.ts | 8 ++++++ .../services/business/DiagnosticService.ts | 28 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/client/src/pages/infrastructure/InfraMonitorsTable.tsx b/client/src/pages/infrastructure/InfraMonitorsTable.tsx index 2b266ecd3..674867337 100644 --- a/client/src/pages/infrastructure/InfraMonitorsTable.tsx +++ b/client/src/pages/infrastructure/InfraMonitorsTable.tsx @@ -162,6 +162,7 @@ export const InfraMonitorsTable = ({ id: "name", content: ( void; getJobs(req: Request, res: Response, next: NextFunction): Promise; + getEnv(req: Request, res: Response, next: NextFunction): void; } class DiagnosticController implements IDiagnosticController { @@ -30,6 +30,15 @@ class DiagnosticController implements IDiagnosticController { next(error); } }; + + getEnv = (req: Request, res: Response, next: NextFunction) => { + try { + const data = this.diagnosticService.getEnv(); + res.status(200).json({ message: "OK", data }); + } catch (error) { + next(error); + } + }; } export default DiagnosticController; diff --git a/server/src/routes/diagnostic.ts b/server/src/routes/diagnostic.ts index d8742e11b..a153b475e 100644 --- a/server/src/routes/diagnostic.ts +++ b/server/src/routes/diagnostic.ts @@ -29,6 +29,14 @@ class DiagnosticRoutes { verifyOrgPermission([PERMISSIONS.master]), this.controller.getJobs ); + + this.router.get( + "/env", + verifyToken, + addUserContext, + verifyOrgPermission([PERMISSIONS.master]), + this.controller.getEnv + ); }; getRouter() { diff --git a/server/src/services/business/DiagnosticService.ts b/server/src/services/business/DiagnosticService.ts index eed8c573c..f43c25a46 100644 --- a/server/src/services/business/DiagnosticService.ts +++ b/server/src/services/business/DiagnosticService.ts @@ -4,6 +4,7 @@ import type { IJobMetrics, } from "@/services/infrastructure/JobQueue.js"; import { memoryTransport } from "@/logger/Logger.js"; +import { config, type IEnvConfig } from "@/config/index.js"; export interface IDiagnosticService { getLogs: () => any[]; @@ -11,6 +12,7 @@ export interface IDiagnosticService { jobs: IJobData[] | null; metrics: IJobMetrics | null; }>; + getEnv: () => IEnvConfig; } const SERVICE_NAME = "DiagnosticService"; @@ -32,6 +34,32 @@ class DiagnosticService implements IDiagnosticService { const metrics = await this.jobQueue.getMetrics(); return { jobs, metrics }; }; + + getEnv = (): IEnvConfig => { + const mask = (val: string | undefined | null): string => { + const isDev = (config.NODE_ENV || "").toLowerCase() === "development"; + if (isDev) return val ?? ""; + if (val === undefined || val === null) return ""; + if (val.length <= 4) return "***"; + return `${val.slice(0, 2)}***${val.slice(-2)}`; + }; + + return { + NODE_ENV: config.NODE_ENV, + DEPLOYMENT_MODE: config.DEPLOYMENT_MODE, + LOG_LEVEL: config.LOG_LEVEL, + ORIGIN: config.ORIGIN, + JWT_SECRET: mask(config.JWT_SECRET), + PORT: config.PORT, + PAGESPEED_API_KEY: mask(config.PAGESPEED_API_KEY), + SMTP_HOST: config.SMTP_HOST, + SMTP_PORT: config.SMTP_PORT, + SMTP_USER: mask(config.SMTP_USER), + SMTP_PASS: mask(config.SMTP_PASS), + STRIPE_SECRET: mask(config.STRIPE_SECRET), + STRIPE_WEBHOOK_SECRET: mask(config.STRIPE_WEBHOOK_SECRET), + }; + }; } export default DiagnosticService;