Skip to content

Commit 7ec1093

Browse files
committed
Make secrets retrieval cleaner
1 parent 41d85f4 commit 7ec1093

File tree

5 files changed

+34
-35
lines changed

5 files changed

+34
-35
lines changed

src/api/functions/discord.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ import moment from "moment-timezone";
1313

1414
import { FastifyBaseLogger } from "fastify";
1515
import { DiscordEventError } from "../../common/errors/index.js";
16-
import { getSecretValue } from "../plugins/auth.js";
17-
import { genericConfig, SecretConfig } from "../../common/config.js";
18-
import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
16+
import { type SecretConfig } from "../../common/config.js";
1917

2018
// https://stackoverflow.com/a/3809435/5684541
2119
// https://calendar-buff.acmuiuc.pages.dev/calendar?id=dd7af73a-3df6-4e12-b228-0d2dac34fda7&date=2024-08-30
@@ -26,7 +24,7 @@ export type IUpdateDiscord = EventPostRequest & { id: string };
2624
const urlRegex = /https:\/\/[a-z0-9.-]+\/calendar\?id=([a-f0-9-]+)/;
2725

2826
export const updateDiscord = async (
29-
secretApiConfig: SecretConfig,
27+
config: { botToken: string; guildId: string },
3028
event: IUpdateDiscord,
3129
actor: string,
3230
isDelete: boolean = false,
@@ -36,7 +34,7 @@ export const updateDiscord = async (
3634
let payload: GuildScheduledEventCreateOptions | null = null;
3735
client.once(Events.ClientReady, async (readyClient: Client<true>) => {
3836
logger.debug(`Logged in as ${readyClient.user.tag}`);
39-
const guildID = secretApiConfig.discord_guild_id;
37+
const guildID = config.guildId;
4038
const guild = await client.guilds.fetch(guildID?.toString() || "");
4139
const discordEvents = await guild.scheduledEvents.fetch();
4240
const snowflakeMeetingLookup = discordEvents.reduce(
@@ -110,7 +108,7 @@ export const updateDiscord = async (
110108
return payload;
111109
});
112110

113-
const token = secretApiConfig.discord_bot_token;
111+
const token = config.botToken;
114112

115113
if (!token) {
116114
logger.error("No Discord bot token found in secrets!");

src/api/index.ts

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ async function init(prettyPrint: boolean = false) {
6262
const secretsManagerClient = new SecretsManagerClient({
6363
region: genericConfig.AwsRegion,
6464
});
65-
const secret = (await getSecretValue(
66-
secretsManagerClient,
67-
genericConfig.ConfigSecretName,
68-
)) as SecretConfig;
69-
const redisClient = new RedisModule.default(secret.redis_url);
70-
7165
const transport = prettyPrint
7266
? {
7367
target: "pino-pretty",
@@ -252,21 +246,22 @@ async function init(prettyPrint: boolean = false) {
252246
app.nodeCache = new NodeCache({ checkperiod: 30 });
253247
app.dynamoClient = dynamoClient;
254248
app.secretsManagerClient = secretsManagerClient;
255-
app.redisClient = redisClient;
256249
app.refreshSecretConfig = async () => {
257-
app.secretConfig = (await getSecretValue(
258-
app.secretsManagerClient,
259-
genericConfig.ConfigSecretName,
260-
)) as SecretConfig;
261-
if (app.environmentConfig.TestingCredentialsSecret) {
262-
const temp = (await getSecretValue(
263-
app.secretsManagerClient,
264-
app.environmentConfig.TestingCredentialsSecret,
265-
)) as SecretTesting;
266-
app.secretConfig = { ...app.secretConfig, ...temp };
267-
}
250+
app.log.debug(
251+
`Getting secrets: ${JSON.stringify(app.environmentConfig.ConfigurationSecrets)}.`,
252+
);
253+
const allSecrets = await Promise.all(
254+
app.environmentConfig.ConfigurationSecrets.map((secretName) =>
255+
getSecretValue(app.secretsManagerClient, secretName),
256+
),
257+
);
258+
app.secretConfig = allSecrets.reduce(
259+
(acc, currentSecret) => ({ ...acc, ...currentSecret }),
260+
{},
261+
) as SecretConfig;
268262
};
269-
app.refreshSecretConfig();
263+
await app.refreshSecretConfig();
264+
app.redisClient = new RedisModule.default(app.secretConfig.redis_url);
270265
app.addHook("onRequest", (req, _, done) => {
271266
req.startTime = now();
272267
const hostname = req.hostname;

src/api/routes/events.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,10 @@ const eventsPlugin: FastifyPluginAsyncZodOpenApi = async (
369369
try {
370370
if (request.body.featured && !request.body.repeats) {
371371
await updateDiscord(
372-
fastify.secretConfig,
372+
{
373+
botToken: fastify.secretConfig.discord_bot_token,
374+
guildId: fastify.environmentConfig.DiscordGuildId,
375+
},
373376
entry,
374377
request.username,
375378
false,
@@ -507,7 +510,10 @@ const eventsPlugin: FastifyPluginAsyncZodOpenApi = async (
507510
}),
508511
);
509512
await updateDiscord(
510-
fastify.secretConfig,
513+
{
514+
botToken: fastify.secretConfig.discord_bot_token,
515+
guildId: fastify.environmentConfig.DiscordGuildId,
516+
},
511517
{ id } as IUpdateDiscord,
512518
request.username,
513519
true,

src/common/config.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ export type ConfigType = {
2323
PaidMemberPriceId: string;
2424
AadValidReadOnlyClientId: string;
2525
LinkryCloudfrontKvArn?: string;
26-
TestingCredentialsSecret?: string;
26+
ConfigurationSecrets: string[];
27+
DiscordGuildId: string;
2728
};
2829

2930
export type GenericConfigType = {
3031
EventsDynamoTableName: string;
3132
CacheDynamoTableName: string;
3233
LinkryDynamoTableName: string;
3334
StripeLinksDynamoTableName: string;
34-
ConfigSecretName: string;
3535
EntraSecretName: string;
3636
UpcomingEventThresholdSeconds: number;
3737
AwsRegion: string;
@@ -69,7 +69,6 @@ const genericConfig: GenericConfigType = {
6969
StripeLinksDynamoTableName: "infra-core-api-stripe-links",
7070
CacheDynamoTableName: "infra-core-api-cache",
7171
LinkryDynamoTableName: "infra-core-api-linkry",
72-
ConfigSecretName: "infra-core-api-config",
7372
EntraSecretName: "infra-core-api-entra",
7473
EntraReadOnlySecretName: "infra-core-api-ro-entra",
7574
UpcomingEventThresholdSeconds: 1800, // 30 mins
@@ -99,7 +98,7 @@ const environmentConfig: EnvironmentConfigType = {
9998
/^https:\/\/(?:.*\.)?acmuiuc\.pages\.dev$/,
10099
/http:\/\/localhost:\d+$/,
101100
],
102-
TestingCredentialsSecret: "infra-core-api-testing-credentials",
101+
ConfigurationSecrets: ["infra-core-api-testing-credentials", "infra-core-api-config"],
103102
AadValidClientId: "39c28870-94e4-47ee-b4fb-affe0bf96c9f",
104103
LinkryBaseUrl: "https://core.aws.qa.acmuiuc.org",
105104
PasskitIdentifier: "pass.org.acmuiuc.qa.membership",
@@ -112,11 +111,13 @@ const environmentConfig: EnvironmentConfigType = {
112111
PaidMemberGroupId: "9222451f-b354-4e64-ba28-c0f367a277c2",
113112
PaidMemberPriceId: "price_1R4TcTDGHrJxx3mKI6XF9cNG",
114113
AadValidReadOnlyClientId: "2c6a0057-5acc-496c-a4e5-4adbf88387ba",
115-
LinkryCloudfrontKvArn: "arn:aws:cloudfront::427040638965:key-value-store/0c2c02fd-7c47-4029-975d-bc5d0376bba1"
114+
LinkryCloudfrontKvArn: "arn:aws:cloudfront::427040638965:key-value-store/0c2c02fd-7c47-4029-975d-bc5d0376bba1",
115+
DiscordGuildId: "1278798685706391664"
116116
},
117117
prod: {
118118
UserFacingUrl: "https://core.acm.illinois.edu",
119119
AzureRoleMapping: { AutonomousWriters: [AppRoles.EVENTS_MANAGER] },
120+
ConfigurationSecrets: ["infra-core-api-config"],
120121
ValidCorsOrigins: [
121122
/^https:\/\/(?:.*\.)?acmuiuc-academic-web\.pages\.dev$/,
122123
/^https:\/\/(?:.*\.)?acmuiuc\.pages\.dev$/,
@@ -134,12 +135,12 @@ const environmentConfig: EnvironmentConfigType = {
134135
"https://sqs.us-east-1.amazonaws.com/298118738376/infra-core-api-sqs",
135136
PaidMemberGroupId: "172fd9ee-69f0-4384-9786-41ff1a43cf8e",
136137
PaidMemberPriceId: "price_1MUGIRDiGOXU9RuSChPYK6wZ",
137-
AadValidReadOnlyClientId: "2c6a0057-5acc-496c-a4e5-4adbf88387ba"
138+
AadValidReadOnlyClientId: "2c6a0057-5acc-496c-a4e5-4adbf88387ba",
139+
DiscordGuildId: "718945436332720229"
138140
},
139141
};
140142

141143
export type SecretConfig = {
142-
discord_guild_id: string;
143144
discord_bot_token: string;
144145
entra_id_private_key?: string;
145146
entra_id_thumbprint?: string;

tests/unit/secret.testdata.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { SecretConfig } from "../../src/common/config.js";
22

33
const secretObject = {
4-
discord_guild_id: "12345",
54
discord_bot_token: "12345",
65
entra_id_private_key: "",
76
entra_id_thumbprint: "",

0 commit comments

Comments
 (0)