Skip to content

Commit d35afcb

Browse files
authored
centralized env load and validation
1 parent 28636d7 commit d35afcb

File tree

5 files changed

+79
-7
lines changed

5 files changed

+79
-7
lines changed

.github/workflows/pre-commit-tests.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: pre-merge-checks
22
on:
3-
pull_request:
4-
branches: [main, develop]
3+
push:
4+
branches: test/issue#257-2
55
jobs:
66
Run-Tests:
77
runs-on: ubuntu-latest

.github/workflows/register-commands-staging.yaml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
name: Register and deploy Slash Commands
22
on:
33
push:
4-
branches: develop
4+
branches: test/issue#257-2
55
jobs:
6+
Environment-Variables-Check:
7+
runs-on: ubuntu-latest
8+
environment: staging
9+
steps:
10+
- uses: actions/checkout@v2
11+
- uses: actions/setup-node@v3
12+
with:
13+
node-version: 18.18.2
14+
- run: npm install
15+
- run: npm run env-var-check
16+
env:
17+
DISCORD_APPLICATION_ID: ${{secrets.DISCORD_APPLICATION_ID}}
18+
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}
19+
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
20+
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
21+
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
22+
CLOUDFLARE_ACCOUNT_ID: ${{secrets.CLOUDFLARE_ACCOUNT_ID}}
23+
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
24+
RDS_SERVERLESS_PUBLIC_KEY: ${{secrets.RDS_SERVERLESS_PUBLIC_KEY}}
25+
CRON_JOBS_PUBLIC_KEY: ${{secrets.CRON_JOBS_PUBLIC_KEY}}
26+
IDENTITY_SERVICE_PUBLIC_KEY: ${{secrets.IDENTITY_SERVICE_PUBLIC_KEY}}
27+
628
Register-Commands:
29+
needs: [Environment-Variables-Check]
730
runs-on: ubuntu-latest
831
environment: staging
932
steps:

config/envVarCheck.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { env } from "../src/typeDefinitions/default.types";
2+
import { config } from "dotenv";
3+
4+
export function loadEnv (
5+
env: env,
6+
fromWorkerEnv: boolean
7+
): env {
8+
const Env:env = {
9+
CURRENT_ENVIRONMENT: fromWorkerEnv ? env.CURRENT_ENVIRONMENT : process.env.CURRENT_ENVIRONMENT || '',
10+
DISCORD_APPLICATION_ID: fromWorkerEnv ? env.DISCORD_APPLICATION_ID : process.env.DISCORD_APPLICATION_ID || '',
11+
DISCORD_GUILD_ID: fromWorkerEnv ? env.DISCORD_GUILD_ID : process.env.DISCORD_GUILD_ID || '',
12+
DISCORD_TOKEN: fromWorkerEnv ? env.DISCORD_TOKEN : process.env.DISCORD_TOKEN || '',
13+
DISCORD_PUBLIC_KEY: fromWorkerEnv ? env.DISCORD_PUBLIC_KEY : process.env.DISCORD_PUBLIC_KEY || '',
14+
CLOUDFLARE_API_TOKEN: fromWorkerEnv ? env.CLOUDFLARE_API_TOKEN : process.env.CLOUDFLARE_API_TOKEN || '',
15+
CLOUDFLARE_ACCOUNT_ID: fromWorkerEnv ? env.CLOUDFLARE_ACCOUNT_ID : process.env.CLOUDFLARE_ACCOUNT_ID || '',
16+
BOT_PRIVATE_KEY: fromWorkerEnv ? env.BOT_PRIVATE_KEY : process.env.BOT_PRIVATE_KEY || '',
17+
RDS_SERVERLESS_PUBLIC_KEY: fromWorkerEnv ? env.RDS_SERVERLESS_PUBLIC_KEY : process.env.RDS_SERVERLESS_PUBLIC_KEY || '',
18+
CRON_JOBS_PUBLIC_KEY: fromWorkerEnv ? env.CRON_JOBS_PUBLIC_KEY : process.env.CRON_JOBS_PUBLIC_KEY || '',
19+
IDENTITY_SERVICE_PUBLIC_KEY: fromWorkerEnv ? env.IDENTITY_SERVICE_PUBLIC_KEY : process.env.IDENTITY_SERVICE_PUBLIC_KEY || ''
20+
}
21+
return Env;
22+
}
23+
24+
25+
config();
26+
validateEnv();
27+
28+
29+
30+
/**
31+
* Validate if all the required environment variables defined in the schema above are set
32+
* and are in the correct format else throw an error
33+
* ---
34+
*/
35+
export default function validateEnv (){
36+
const env: env = loadEnv({}, false);
37+
const missingEnvVars = Object.keys(env).filter((key) => env[key] !== "");
38+
39+
// Logging missing environment variables and exit if any are missing
40+
if (missingEnvVars.length > 0) {
41+
console.error(`Missing environment variables: ${missingEnvVars.join(', ')}`);
42+
process.exit(1); // Exit with code 1 if any required env var is missing
43+
} else {
44+
console.log('All required environment variables are set.');
45+
}
46+
}

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"format-fix": "prettier --write .",
1616
"fix": "npm run lint-fix && npm run format-fix",
1717
"ngrok": "ngrok http 8787",
18-
"register": "ts-node-esm src/register.ts"
18+
"register": "ts-node-esm src/register.ts",
19+
"env-var-check": "ts-node-esm config/envVarCheck.ts"
1920
},
2021
"keywords": [],
2122
"author": "",
@@ -35,7 +36,8 @@
3536
"ts-jest": "^29.0.5",
3637
"ts-node": "^10.9.1",
3738
"typescript": "^4.9.4",
38-
"wrangler": "^3.1.1"
39+
"wrangler": "^3.1.1",
40+
"zod": "^3.23.8"
3941
},
4042
"dependencies": {
4143
"@tsndr/cloudflare-worker-jwt": "^2.2.1",

src/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { sendProfileBlockedMessage } from "./controllers/profileHandler";
2323
import { sendTaskUpdatesHandler } from "./controllers/taskUpdatesHandler";
2424

2525
import config from "./../config/config";
26+
import { loadEnv } from "../config/envVarCheck";
2627

2728
const router = Router();
2829

@@ -107,10 +108,10 @@ export default {
107108
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
108109
}
109110
}
110-
return router.handle(request, env, ctx);
111+
return router.handle(request, loadEnv(env,true), ctx);
111112
},
112113

113114
async scheduled(req: Request, env: env, ctx: ExecutionContext) {
114-
ctx.waitUntil(send(env));
115+
ctx.waitUntil(send(loadEnv(env,true)));
115116
},
116117
};

0 commit comments

Comments
 (0)