Skip to content

Commit c9f6f73

Browse files
committed
adding update
1 parent 0ec60f5 commit c9f6f73

File tree

6 files changed

+149
-8
lines changed

6 files changed

+149
-8
lines changed

lambdas/backend-api/build.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ npx esbuild \
3131
src/templates/submit.ts \
3232
src/templates/submit-routing-config.ts \
3333
src/templates/update.ts \
34+
src/templates/update-routing-config.ts \
3435
src/templates/validate-letter-template-files.ts
3536

3637
cp -r ../../utils/utils/src/email-templates ./dist/submit
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import type { APIGatewayProxyHandler } from 'aws-lambda';
2+
import { apiFailure, apiSuccess } from './responses';
3+
import { RoutingConfigClient } from '../app/routing-config-client';
4+
import { logger } from 'nhs-notify-web-template-management-utils/logger';
5+
6+
export function createHandler({
7+
routingConfigClient,
8+
}: {
9+
routingConfigClient: RoutingConfigClient;
10+
}): APIGatewayProxyHandler {
11+
return async function (event) {
12+
const { user: userId, clientId } = event.requestContext.authorizer ?? {};
13+
14+
const routingConfigId = event.pathParameters?.id;
15+
16+
if (!routingConfigId || !userId || !clientId) {
17+
return apiFailure(400, 'Invalid request');
18+
}
19+
20+
const payload = JSON.parse(event.body || '{}');
21+
22+
const log = logger.child({
23+
clientId,
24+
routingConfigId,
25+
userId,
26+
});
27+
28+
const { data, error } = await routingConfigClient.updateRoutingConfig(
29+
routingConfigId,
30+
payload,
31+
{ userId, clientId }
32+
);
33+
34+
if (error) {
35+
log
36+
.child(error.errorMeta)
37+
.error('Failed to update routing config', error.actualError);
38+
39+
return apiFailure(
40+
error.errorMeta.code,
41+
error.errorMeta.description,
42+
error.errorMeta.details
43+
);
44+
}
45+
46+
return apiSuccess(200, data);
47+
};
48+
}

lambdas/backend-api/src/templates/app/routing-config-client.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
$CreateUpdateRoutingConfig,
44
$ListRoutingConfigFilters,
55
ErrorCase,
6-
type CreateUpdateRoutingConfig,
76
type ListRoutingConfigFilters,
87
type Result,
98
type RoutingConfig,
@@ -18,12 +17,12 @@ export class RoutingConfigClient {
1817
) {}
1918

2019
async createRoutingConfig(
21-
routingConfig: CreateUpdateRoutingConfig,
20+
payload: unknown,
2221
user: User
2322
): Promise<Result<RoutingConfig>> {
2423
const validationResult = await validate(
2524
$CreateUpdateRoutingConfig,
26-
routingConfig
25+
payload
2726
);
2827

2928
if (validationResult.error) return validationResult;
@@ -36,6 +35,25 @@ export class RoutingConfigClient {
3635
return createResult;
3736
}
3837

38+
async updateRoutingConfig(
39+
routingConfigId: string,
40+
payload: unknown,
41+
user: User
42+
): Promise<Result<RoutingConfig>> {
43+
const validationResult = await validate(
44+
$CreateUpdateRoutingConfig,
45+
payload
46+
);
47+
48+
if (validationResult.error) return validationResult;
49+
50+
return await this.routingConfigRepository.update(
51+
routingConfigId,
52+
validationResult.data,
53+
user
54+
);
55+
}
56+
3957
async submitRoutingConfig(
4058
routingConfigId: string,
4159
user: User

lambdas/backend-api/src/templates/infra/routing-config-repository/repository.ts

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,49 @@ export class RoutingConfigRepository {
6262
}
6363

6464
async update(
65-
_updateData: Partial<CreateUpdateRoutingConfig>,
66-
_user: User
65+
id: string,
66+
updateData: Partial<CreateUpdateRoutingConfig>,
67+
user: User
6768
): Promise<ApplicationResult<RoutingConfig>> {
68-
return {} as Promise<ApplicationResult<RoutingConfig>>;
69+
const builder = new RoutingConfigUpdateBuilder(
70+
this.tableName,
71+
user.clientId,
72+
id,
73+
{ ReturnValues: 'ALL_NEW' }
74+
).setUpdatedByUserAt(user.userId);
75+
76+
const { campaignId, cascade, cascadeGroupOverrides, name } = updateData;
77+
78+
if (campaignId) builder.setCampaignId(campaignId);
79+
if (cascade) builder.setCascade(cascade);
80+
if (name) builder.setName(name);
81+
if (cascadeGroupOverrides) {
82+
builder.setCascadeGroupOverrides(cascadeGroupOverrides);
83+
}
84+
85+
const cmdInput = builder.build();
86+
87+
try {
88+
const result = await this.client.send(new UpdateCommand(cmdInput));
89+
90+
const parsed = $RoutingConfig.safeParse(result.Attributes);
91+
92+
if (!parsed.success) {
93+
return failure(
94+
ErrorCase.INTERNAL,
95+
'Error retrieving Routing Config',
96+
parsed.error
97+
);
98+
}
99+
100+
return success(parsed.data);
101+
} catch (error) {
102+
return failure(
103+
ErrorCase.INTERNAL,
104+
'Failed to update routing config',
105+
error
106+
);
107+
}
69108
}
70109

71110
async submit(
@@ -80,14 +119,23 @@ export class RoutingConfigRepository {
80119
)
81120
.setStatus('COMPLETED')
82121
.expectedStatus('DRAFT')
122+
.setUpdatedByUserAt(user.userId)
83123
.build();
84124

85125
try {
86126
const result = await this.client.send(new UpdateCommand(cmdInput));
87127

88-
const routingConfig = $RoutingConfig.parse(result.Attributes);
128+
const parsed = $RoutingConfig.safeParse(result.Attributes);
89129

90-
return success(routingConfig);
130+
if (!parsed.success) {
131+
return failure(
132+
ErrorCase.INTERNAL,
133+
'Error retrieving Routing Config',
134+
parsed.error
135+
);
136+
}
137+
138+
return success(parsed.data);
91139
} catch (error) {
92140
return failure(
93141
ErrorCase.INTERNAL,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { createHandler } from './api/update-routing-config';
2+
import { createContainer } from './container';
3+
4+
export const handler = createHandler(createContainer());

utils/entity-update-command-builder/src/routing-config-update-builder.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type {
2+
CascadeGroup,
3+
CascadeItem,
24
RoutingConfig,
35
RoutingConfigStatus,
46
} from 'nhs-notify-backend-client';
@@ -34,6 +36,26 @@ export class RoutingConfigUpdateBuilder extends EntityUpdateBuilder<
3436
return this;
3537
}
3638

39+
setCampaignId(campaignId: string) {
40+
this.updateBuilder.setValue('campaignId', campaignId);
41+
return this;
42+
}
43+
44+
setCascade(cascade: CascadeItem[]) {
45+
this.updateBuilder.setValue('cascade', cascade);
46+
return this;
47+
}
48+
49+
setCascadeGroupOverrides(cascadeGroupOverrides: CascadeGroup[]) {
50+
this.updateBuilder.setValue('cascadeGroupOverrides', cascadeGroupOverrides);
51+
return this;
52+
}
53+
54+
setName(name: string) {
55+
this.updateBuilder.setValue('name', name);
56+
return this;
57+
}
58+
3759
setUpdatedByUserAt(userId: string) {
3860
this.updateBuilder
3961
.setValue('updatedAt', new Date().toISOString())

0 commit comments

Comments
 (0)