Skip to content

Commit 7790c14

Browse files
committed
CCM-11492 Use CreateUpdateRoutingConfig type and zod validator
1 parent 652b7c8 commit 7790c14

File tree

4 files changed

+19
-45
lines changed

4 files changed

+19
-45
lines changed

frontend/src/app/message-plans/choose-templates/[routingConfigId]/actions.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,20 @@ export async function removeTemplateFromMessagePlan(formData: FormData) {
2727
if (!routingConfig)
2828
throw new Error(`Routing configuration ${routingConfigId} not found`);
2929

30-
const updatedCascade = routingConfig.cascade.map((cascadeItem) =>
30+
const { campaignId, cascade, cascadeGroupOverrides, name } = routingConfig;
31+
32+
const updatedCascade = cascade.map((cascadeItem) =>
3133
cascadeItem.channel === channel
3234
? { ...cascadeItem, defaultTemplateId: null }
3335
: cascadeItem
3436
);
3537

36-
const updatedConfig = { ...routingConfig, cascade: updatedCascade };
38+
const updatedConfig = {
39+
campaignId,
40+
name,
41+
cascadeGroupOverrides,
42+
cascade: updatedCascade,
43+
};
3744

3845
await updateRoutingConfig(routingConfigId, updatedConfig);
3946

frontend/src/utils/message-plans.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
$RoutingConfig,
66
TemplateDto,
77
RoutingConfigStatusActive,
8+
CreateUpdateRoutingConfig,
89
} from 'nhs-notify-backend-client';
910
import { getMessagePlanTemplateIds } from './get-message-plan-template-ids';
1011
import { getSessionServer } from './amplify-utils';
@@ -93,10 +94,7 @@ export async function getRoutingConfig(
9394
}
9495

9596
export async function createRoutingConfig(
96-
routingConfig: Pick<
97-
RoutingConfig,
98-
'name' | 'campaignId' | 'cascade' | 'cascadeGroupOverrides'
99-
>
97+
routingConfig: CreateUpdateRoutingConfig
10098
): Promise<RoutingConfig> {
10199
const { accessToken } = await getSessionServer();
102100

@@ -119,7 +117,7 @@ export async function createRoutingConfig(
119117

120118
export async function updateRoutingConfig(
121119
routingConfigId: string,
122-
updatedRoutingConfig: RoutingConfig
120+
updatedRoutingConfig: CreateUpdateRoutingConfig
123121
): Promise<RoutingConfig | undefined> {
124122
const { accessToken } = await getSessionServer();
125123

lambdas/backend-client/src/__tests__/routing-config-api-client.test.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import MockAdapter from 'axios-mock-adapter';
22
import {
3-
isValidUuid,
43
routingConfigurationApiClient as client,
54
httpClient,
65
} from '../routing-config-api-client';
@@ -271,11 +270,7 @@ describe('RoutingConfigurationApiClient', () => {
271270
const body = {
272271
id: notFoundRoutingConfigId,
273272
name: 'Test plan',
274-
status: 'DRAFT' as RoutingConfigStatus,
275-
clientId: 'client-1',
276273
campaignId: 'campaign-1',
277-
createdAt: '2025-01-01T00:00:00.000Z',
278-
updatedAt: '2025-01-02T00:00:00.000Z',
279274
cascade: [],
280275
cascadeGroupOverrides: [],
281276
};
@@ -301,11 +296,7 @@ describe('RoutingConfigurationApiClient', () => {
301296
const body = {
302297
id: invalidRoutingConfigId,
303298
name: 'Test plan',
304-
status: 'DRAFT' as RoutingConfigStatus,
305-
clientId: 'client-1',
306299
campaignId: 'campaign-1',
307-
createdAt: '2025-01-01T00:00:00.000Z',
308-
updatedAt: '2025-01-02T00:00:00.000Z',
309300
cascade: [],
310301
cascadeGroupOverrides: [],
311302
};
@@ -332,11 +323,7 @@ describe('RoutingConfigurationApiClient', () => {
332323
const body = {
333324
id: validRoutingConfigId,
334325
name: 'Updated Plan',
335-
status: 'DRAFT' as RoutingConfigStatus,
336-
clientId: 'client-1',
337326
campaignId: 'campaign-1',
338-
createdAt: '2025-01-01T00:00:00.000Z',
339-
updatedAt: '2025-01-02T00:00:00.000Z',
340327
cascade: [],
341328
cascadeGroupOverrides: [],
342329
};
@@ -358,17 +345,4 @@ describe('RoutingConfigurationApiClient', () => {
358345
expect(axiosMock.history.put.length).toBe(1);
359346
});
360347
});
361-
362-
describe('isValidUuid', () => {
363-
it('returns true for valid UUID v4', () => {
364-
expect(isValidUuid('a3f1c2e4-5b6d-4e8f-9a2b-1c3d4e5f6a7b')).toBe(true);
365-
expect(isValidUuid('b7e2d3c4-8f9a-4b1c-9d2e-3f4a5b6c7d8e')).toBe(true);
366-
});
367-
368-
it('returns false for invalid UUIDs', () => {
369-
expect(isValidUuid('not-a-uuid')).toBe(false);
370-
expect(isValidUuid('123456')).toBe(false);
371-
expect(isValidUuid('11111111-1111-1111-1111-111111111111')).toBe(false);
372-
});
373-
});
374348
});

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,21 @@ import type {
99
PostV1RoutingConfigurationData,
1010
GetV1RoutingConfigurationByRoutingConfigIdData,
1111
PutV1RoutingConfigurationByRoutingConfigIdData,
12+
CreateUpdateRoutingConfig,
1213
} from './types/generated';
1314
import { ErrorCase } from './types/error-cases';
1415
import { catchAxiosError, createAxiosClient } from './axios-client';
1516
import { Result } from './types/result';
1617
import { OpenApiToTemplate } from './types/open-api-helper';
18+
import { z } from 'zod';
1719

18-
export function isValidUuid(id: string): boolean {
19-
return /^[\da-f]{8}-[\da-f]{4}-4[\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}$/i.test(
20-
id
21-
);
22-
}
20+
const uuidSchema = z.uuidv4();
2321

2422
export const httpClient = createAxiosClient();
2523

2624
export const routingConfigurationApiClient = {
2725
async create(
28-
routingConfig: Pick<
29-
RoutingConfig,
30-
'name' | 'campaignId' | 'cascade' | 'cascadeGroupOverrides'
31-
>,
26+
routingConfig: CreateUpdateRoutingConfig,
3227
token: string
3328
): Promise<Result<RoutingConfig>> {
3429
const url =
@@ -79,7 +74,7 @@ export const routingConfigurationApiClient = {
7974
token: string,
8075
id: RoutingConfig['id']
8176
): Promise<Result<RoutingConfig>> {
82-
if (!isValidUuid(id)) {
77+
if (!uuidSchema.safeParse(id).success) {
8378
return {
8479
error: {
8580
errorMeta: {
@@ -129,9 +124,9 @@ export const routingConfigurationApiClient = {
129124
async update(
130125
token: string,
131126
id: RoutingConfig['id'],
132-
routingConfig: RoutingConfig
127+
routingConfig: CreateUpdateRoutingConfig
133128
): Promise<Result<RoutingConfig>> {
134-
if (!isValidUuid(id)) {
129+
if (!uuidSchema.safeParse(id).success) {
135130
return {
136131
error: {
137132
errorMeta: {

0 commit comments

Comments
 (0)