Skip to content

Commit a495f79

Browse files
committed
feat: add API to list participant emails
1 parent 7a21a40 commit a495f79

28 files changed

+1279
-1503
lines changed

.github/workflows/publish.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ on:
66
- saga
77

88
env:
9-
CONFIRM_EMAIL_API: https://imfvr2kgbqnainjsnv234ebmpq0lotxr.lambda-url.eu-north-1.on.aws/
10-
REQUEST_TOKEN_API: https://bbuiajrnsyfzlalxrsrdszwljq0grppk.lambda-url.eu-north-1.on.aws/
11-
REGISTER_API: https://o5o3zpj7ajaxdscspskkezdwte0ioduk.lambda-url.eu-north-1.on.aws/
9+
CONFIRM_EMAIL_API: https://eqsnu5vulz4yiwnjfk5vwsihvm0fdmaa.lambda-url.eu-north-1.on.aws/
10+
REQUEST_TOKEN_API: https://hudtehuc4xzj3w2i5bngeiuele0qbdit.lambda-url.eu-north-1.on.aws/
11+
REGISTER_API: https://k3tjpjxfiujqexvkwnoygbizga0wactf.lambda-url.eu-north-1.on.aws/
1212
SENTRY_DSN: https://7fb29947853da3055c66dbb7991ca97b@o4507491821879296.ingest.de.sentry.io/4507491826925648
1313

1414
jobs:

cdk/BackendApp.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,21 @@ import { BackendStack } from "./BackendStack.js";
44
export class BackendApp extends App {
55
public constructor(
66
stackName: string,
7-
args: ConstructorParameters<typeof BackendStack>[2],
7+
{
8+
isTest,
9+
version,
10+
...backendArgs
11+
}: ConstructorParameters<typeof BackendStack>[2] & {
12+
isTest: boolean;
13+
version: string;
14+
}
815
) {
9-
super();
10-
new BackendStack(this, stackName, args);
16+
super({
17+
context: {
18+
isTest,
19+
version,
20+
},
21+
});
22+
new BackendStack(this, stackName, backendArgs);
1123
}
1224
}

cdk/BackendStack.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import {
88
import { ConfirmEmail } from "./ConfirmEmail.js";
99
import type { BackendLambdas } from "./lambdas/packBackendLambdas.js";
1010
import { Registrations } from "./Registrations.js";
11-
import type { PackedLayer } from "./lambdas/packLayer.js";
12-
import { LambdaSource } from "./lambdas/LambdaSource.js";
11+
import { LambdaSource } from "@bifravst/aws-cdk-lambda-helpers/cdk";
1312
import { Register } from "./Register.js";
13+
import { type PackedLayer } from "@bifravst/aws-cdk-lambda-helpers/layer";
1414
import { PublicProfiles } from "./PublicProfiles.js";
15+
import { ParticipantsList } from "./ParticipantsList.ts";
1516

1617
export class BackendStack extends Stack {
1718
public constructor(
@@ -73,6 +74,12 @@ export class BackendStack extends Stack {
7374
registrations,
7475
});
7576

77+
const participantsList = new ParticipantsList(this, {
78+
lambdas,
79+
layer,
80+
registrations,
81+
});
82+
7683
new CfnOutput(this, "requestTokenAPI", {
7784
value: confirmEmail.requestTokenURL.url,
7885
exportName: `${this.stackName}:requestTokenAPI`,
@@ -92,6 +99,11 @@ export class BackendStack extends Stack {
9299
value: publicProfiles.listPublicProfilesURL.url,
93100
exportName: `${this.stackName}:publicProfilesURL`,
94101
});
102+
103+
new CfnOutput(this, "listParticipantEmailsURL", {
104+
value: participantsList.listParticipantEmailsURL.url,
105+
exportName: `${this.stackName}:listParticipantEmailsURL`,
106+
});
95107
}
96108
}
97109

cdk/ConfirmEmail.ts

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1+
import { PackedLambdaFn } from "@bifravst/aws-cdk-lambda-helpers/cdk";
2+
import { aws_iam as IAM, aws_lambda as Lambda } from "aws-cdk-lib";
3+
import type { ILayerVersion } from "aws-cdk-lib/aws-lambda";
14
import { Construct } from "constructs";
2-
import { Duration, aws_lambda as Lambda, aws_iam as IAM } from "aws-cdk-lib";
35
import type { BackendLambdas } from "./lambdas/packBackendLambdas.js";
4-
import { LambdaSource } from "./lambdas/LambdaSource.js";
5-
import { LambdaLogGroup } from "./lambdas/LambdaLogGroup.js";
66
import type { Registrations } from "./Registrations.js";
7-
import type { ILayerVersion } from "aws-cdk-lib/aws-lambda";
87

98
export class ConfirmEmail extends Construct {
109
public readonly requestTokenURL: Lambda.IFunctionUrl;
@@ -19,54 +18,50 @@ export class ConfirmEmail extends Construct {
1918
lambdas: BackendLambdas;
2019
registrations: Registrations;
2120
layer: ILayerVersion;
22-
},
21+
}
2322
) {
2423
super(parent, "confirm-email");
2524

26-
const requestTokenFn = new Lambda.Function(this, "requestTokenFn", {
27-
architecture: Lambda.Architecture.ARM_64,
28-
runtime: Lambda.Runtime.NODEJS_20_X,
29-
timeout: Duration.seconds(10),
30-
memorySize: 1792,
31-
handler: lambdas.requestToken.handler,
32-
code: new LambdaSource(this, lambdas.requestToken).code,
33-
initialPolicy: [
34-
new IAM.PolicyStatement({
35-
actions: ["ses:SendEmail"],
36-
resources: ["*"],
37-
}),
38-
],
39-
...new LambdaLogGroup(this, "requestTokenFnLogs"),
40-
environment: {
41-
EMAILS_TABLE_NAME: registrations.emailsTable.tableName,
42-
},
43-
layers: [layer],
44-
});
25+
const requestTokenFn = new PackedLambdaFn(
26+
this,
27+
"requestTokenFn",
28+
lambdas.requestToken,
29+
{
30+
initialPolicy: [
31+
new IAM.PolicyStatement({
32+
actions: ["ses:SendEmail"],
33+
resources: ["*"],
34+
}),
35+
],
36+
environment: {
37+
EMAILS_TABLE_NAME: registrations.emailsTable.tableName,
38+
},
39+
layers: [layer],
40+
}
41+
);
4542

46-
this.requestTokenURL = requestTokenFn.addFunctionUrl({
43+
this.requestTokenURL = requestTokenFn.fn.addFunctionUrl({
4744
authType: Lambda.FunctionUrlAuthType.NONE,
4845
});
4946

50-
registrations.emailsTable.grantReadWriteData(requestTokenFn);
47+
registrations.emailsTable.grantReadWriteData(requestTokenFn.fn);
5148

52-
const confirmEmailFn = new Lambda.Function(this, "confirmEmailFn", {
53-
architecture: Lambda.Architecture.ARM_64,
54-
runtime: Lambda.Runtime.NODEJS_20_X,
55-
timeout: Duration.seconds(10),
56-
memorySize: 1792,
57-
handler: lambdas.confirmEmail.handler,
58-
code: new LambdaSource(this, lambdas.confirmEmail).code,
59-
...new LambdaLogGroup(this, "confirmEmailFnLogs"),
60-
environment: {
61-
EMAILS_TABLE_NAME: registrations.emailsTable.tableName,
62-
},
63-
layers: [layer],
64-
});
49+
const confirmEmailFn = new PackedLambdaFn(
50+
this,
51+
"confirmEmailFn",
52+
lambdas.confirmEmail,
53+
{
54+
environment: {
55+
EMAILS_TABLE_NAME: registrations.emailsTable.tableName,
56+
},
57+
layers: [layer],
58+
}
59+
);
6560

66-
this.confirmEmailURL = confirmEmailFn.addFunctionUrl({
61+
this.confirmEmailURL = confirmEmailFn.fn.addFunctionUrl({
6762
authType: Lambda.FunctionUrlAuthType.NONE,
6863
});
6964

70-
registrations.emailsTable.grantReadData(confirmEmailFn);
65+
registrations.emailsTable.grantReadData(confirmEmailFn.fn);
7166
}
7267
}

cdk/ParticipantsList.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { PackedLambdaFn } from "@bifravst/aws-cdk-lambda-helpers/cdk";
2+
import { aws_dynamodb as DynamoDB, aws_lambda as Lambda } from "aws-cdk-lib";
3+
import type { ILayerVersion } from "aws-cdk-lib/aws-lambda";
4+
import { Construct } from "constructs";
5+
import type { BackendLambdas } from "./lambdas/packBackendLambdas.js";
6+
import type { Registrations } from "./Registrations.js";
7+
8+
export class ParticipantsList extends Construct {
9+
public readonly listParticipantEmailsURL: Lambda.IFunctionUrl;
10+
constructor(
11+
parent: Construct,
12+
{
13+
lambdas,
14+
registrations,
15+
layer,
16+
}: {
17+
lambdas: BackendLambdas;
18+
registrations: Registrations;
19+
layer: ILayerVersion;
20+
}
21+
) {
22+
super(parent, "ParticipantsList");
23+
24+
// List participant emails
25+
const participantsByCodefreezeIndexName = "participantsByCodefreeze";
26+
registrations.registrationsTable.addGlobalSecondaryIndex({
27+
indexName: participantsByCodefreezeIndexName,
28+
partitionKey: {
29+
name: "codefreeze",
30+
type: DynamoDB.AttributeType.NUMBER,
31+
},
32+
sortKey: {
33+
name: "id",
34+
type: DynamoDB.AttributeType.STRING,
35+
},
36+
projectionType: DynamoDB.ProjectionType.INCLUDE,
37+
nonKeyAttributes: ["name", "email"],
38+
});
39+
40+
const listParticipantEmailsFn = new PackedLambdaFn(
41+
this,
42+
"listParticipantEmailsFn",
43+
lambdas.listParticipantEmails,
44+
{
45+
environment: {
46+
REGISTRATIONS_TABLE_NAME: registrations.registrationsTable.tableName,
47+
PARTICIPANTS_BY_CODEFREEZE_INDEX_NAME:
48+
participantsByCodefreezeIndexName,
49+
},
50+
layers: [layer],
51+
}
52+
);
53+
54+
this.listParticipantEmailsURL = listParticipantEmailsFn.fn.addFunctionUrl({
55+
authType: Lambda.FunctionUrlAuthType.NONE,
56+
});
57+
58+
registrations.registrationsTable.grantReadData(listParticipantEmailsFn.fn);
59+
}
60+
}

0 commit comments

Comments
 (0)