Skip to content

Commit d94b71d

Browse files
committed
Lazy load env vars
1 parent 1d4fc0d commit d94b71d

File tree

7 files changed

+75
-40
lines changed

7 files changed

+75
-40
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ yarn-error.log*
2828
# local env files
2929
.env*.local
3030

31-
.env.prod
31+
.env.production
3232

3333
# vercel
3434
.vercel

app/api/interactions/route.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ import {
33
InteractionType,
44
} from "discord-api-types/v10";
55
import { Bot } from "@/app/lib/discord/bot";
6-
import { discordClientPublicKey, discordToken } from "@/app/envs";
6+
import { getEnvironment } from "../../../envs";
77
import createClient from "edgedb";
88
import { verifyInteractionRequest } from "@/app/lib/discord/verify-interaction-request";
99

10-
const bot = new Bot(createClient(), discordToken);
10+
const bot = new Bot(createClient(), getEnvironment().discordToken);
1111
await bot.initialize();
1212

1313
export async function POST(req: Request) {
1414
const verifyResult = await verifyInteractionRequest(
1515
req,
16-
discordClientPublicKey
16+
getEnvironment().discordClientPublicKey
1717
);
1818

1919
if (!verifyResult.isValid || !verifyResult.interaction) {

app/envs.ts

-30
This file was deleted.

app/lib/discord/auth.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { REST } from "@discordjs/rest";
44
import { Routes, APIGuildMember, APIUser } from "discord-api-types/v10";
55
import { client } from "../../lib/edgedb";
6-
import { discordGuildId, authorizedRoleIds } from "@/app/envs";
6+
import { getEnvironment } from "../../../envs";
77
import { getCurrentUser } from "./queries/getCurrentUser.query";
88

99
export async function discordSignin({
@@ -18,14 +18,18 @@ export async function discordSignin({
1818
);
1919

2020
const discordUser = (await discordClient.get(
21-
Routes.userGuildMember(discordGuildId)
21+
Routes.userGuildMember(getEnvironment().discordGuildId)
2222
)) as APIGuildMember;
2323

2424
if (!discordUser) {
2525
throw new Error("No guild member information for user");
2626
}
2727

28-
if (!discordUser.roles.some((role) => authorizedRoleIds.includes(role))) {
28+
if (
29+
!discordUser.roles.some((role) =>
30+
getEnvironment().authorizedRoleIds.includes(role)
31+
)
32+
) {
2933
throw new Error("Discord user does not have any authorized roles");
3034
}
3135

app/lib/discord/bot.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { REST, RESTOptions } from "@discordjs/rest";
1414
import { Client } from "edgedb";
1515
import { InteractionPromise } from "./interactionPromise";
1616
import { getHelpChannels } from "./queries/getHelpChannels.query";
17-
import { discordClientId } from "@/app/envs";
17+
import { getEnvironment } from "../../../envs";
1818

1919
export class Bot extends REST {
2020
public readonly edgedb: Client;
@@ -27,7 +27,7 @@ export class Bot extends REST {
2727
constructor(edgedb: Client, token: string, options?: Partial<RESTOptions>) {
2828
super(options);
2929

30-
this.applicationId = discordClientId;
30+
this.applicationId = getEnvironment().discordClientId;
3131

3232
this.edgedb = edgedb;
3333
this.token = token;

app/lib/discord/utils/reviewCard.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
} from "discord-api-types/v10";
77
import { Bot } from "../bot";
88
import { SuggestThreadReturns } from "../queries/suggestThread.query";
9-
import { reviewChannelId } from "@/app/envs";
9+
import { getEnvironment } from "../../../../envs";
1010

1111
const createReviewCard = async (
1212
bot: Bot,
@@ -34,6 +34,9 @@ const createReviewCard = async (
3434
],
3535
color: 0x0ccb93,
3636
};
37+
38+
const reviewChannelId = getEnvironment().reviewChannelId;
39+
3740
const message = (await bot.post(Routes.channelMessages(reviewChannelId), {
3841
body: {
3942
embeds: [embed],

envs.ts

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export interface Environment {
2+
discordClientId: string;
3+
discordClientPublicKey: string;
4+
discordToken: string;
5+
discordGuildId: string;
6+
authorizedRoleIds: string[];
7+
reviewChannelId: string;
8+
}
9+
10+
let environment: Environment | null = null;
11+
12+
export function getEnvironment(): Environment {
13+
if (environment) {
14+
return environment;
15+
}
16+
17+
if (!process.env.DISCORD_CLIENT_ID) {
18+
throw new Error("DISCORD_CLIENT_ID env var not configured");
19+
}
20+
const discordClientId = process.env.DISCORD_CLIENT_ID;
21+
22+
if (!process.env.DISCORD_CLIENT_PUBLIC_KEY) {
23+
throw new Error("DISCORD_CLIENT_PUBLIC_KEY env var not configured");
24+
}
25+
const discordClientPublicKey = process.env.DISCORD_CLIENT_PUBLIC_KEY;
26+
27+
if (!process.env.DISCORD_TOKEN) {
28+
throw new Error(`DISCORD_TOKEN env var not configured`);
29+
}
30+
const discordToken = process.env.DISCORD_TOKEN;
31+
32+
if (!process.env.DISCORD_GUILD_ID) {
33+
throw new Error("DISCORD_GUILD_ID env var not configured");
34+
}
35+
const discordGuildId = process.env.DISCORD_GUILD_ID;
36+
37+
if (!process.env.DISCORD_MODERATION_ACCESS_ROLES) {
38+
throw new Error("DISCORD_MODERATION_ACCESS_ROLES env var not configured");
39+
}
40+
const authorizedRoleIds =
41+
process.env.DISCORD_MODERATION_ACCESS_ROLES.split(",");
42+
43+
if (!process.env.REVIEW_CHANNEL_ID) {
44+
throw new Error("REVIEW_CHANNEL_ID env var not configured");
45+
}
46+
const reviewChannelId = process.env.REVIEW_CHANNEL_ID;
47+
48+
environment = {
49+
discordClientId,
50+
discordClientPublicKey,
51+
discordToken,
52+
discordGuildId,
53+
authorizedRoleIds,
54+
reviewChannelId,
55+
};
56+
57+
return environment;
58+
}

0 commit comments

Comments
 (0)