Skip to content

Commit af2c5c4

Browse files
committed
Revert "CCM-7465: move template-schems to backend-client in preperation to use in the web-ui"
This reverts commit 867ef68.
1 parent 867ef68 commit af2c5c4

File tree

18 files changed

+143
-157
lines changed

18 files changed

+143
-157
lines changed

lambdas/backend-api/src/__tests__/templates/app/template-client.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ import {
33
TemplateStatus,
44
TemplateType,
55
UpdateTemplate,
6+
} from 'nhs-notify-backend-client';
7+
import {
68
$CreateTemplateSchema,
79
$UpdateTemplateSchema,
8-
} from 'nhs-notify-backend-client';
9-
import { Template, templateRepository } from '@backend-api/templates/infra';
10+
Template,
11+
templateRepository,
12+
} from '@backend-api/templates/domain/template';
1013
import { validate } from '@backend-api/utils/validate';
1114
import { TemplateClient } from '@backend-api/templates/app/template-client';
1215

13-
jest.mock('@backend-api/templates/infra');
16+
jest.mock('@backend-api/templates/domain/template/template-repository');
1417
jest.mock('@backend-api/utils/validate');
1518

1619
const createMock = jest.mocked(templateRepository.create);

lambdas/backend-api/src/__tests__/templates/infra/template-repository.test.ts renamed to lambdas/backend-api/src/__tests__/templates/domain/template/template-repository.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import {
1313
UpdateTemplate,
1414
} from 'nhs-notify-backend-client';
1515
import { ConditionalCheckFailedException } from '@aws-sdk/client-dynamodb';
16-
import { Template, templateRepository } from '@backend-api/templates/infra';
16+
import {
17+
Template,
18+
templateRepository,
19+
} from '@backend-api/templates/domain/template';
1720

1821
jest.mock('node:crypto');
1922

lambdas/backend-client/src/__tests__/schemas/template-schema.test.ts renamed to lambdas/backend-api/src/__tests__/templates/domain/template/template-schema.test.ts

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { TemplateStatus, TemplateType } from 'nhs-notify-backend-client';
2+
import { validate } from '@backend-api/utils/validate';
23
import {
34
$CreateTemplateSchema,
45
$UpdateTemplateSchema,
5-
$EmailTemplateFields,
6-
$SMSTemplateFields,
7-
$NHSAppTemplateFields,
8-
} from '../../schemas';
6+
$EmailTemplate,
7+
$SMSTemplate,
8+
$NhsAppTemplate,
9+
} from '@backend-api/templates/domain/template/template-schema';
910

1011
describe('Template schemas', () => {
1112
test.each([
1213
{
13-
schema: $EmailTemplateFields,
14+
schema: $EmailTemplate,
1415
data: {
1516
name: 'Test Template',
1617
message: 'This is a test template',
@@ -19,30 +20,32 @@ describe('Template schemas', () => {
1920
},
2021
},
2122
{
22-
schema: $SMSTemplateFields,
23+
schema: $SMSTemplate,
2324
data: {
2425
name: 'Test Template',
2526
message: 'This is a test template',
2627
templateType: TemplateType.SMS,
2728
},
2829
},
2930
{
30-
schema: $NHSAppTemplateFields,
31+
schema: $NhsAppTemplate,
3132
data: {
3233
name: 'Test Template',
3334
message: 'This is a test template',
3435
templateType: TemplateType.NHS_APP,
3536
},
3637
},
3738
])('%p.templateType - should pass validation', async ({ schema, data }) => {
38-
const result = schema.safeParse(data);
39+
const result = await validate(schema, data);
3940

40-
expect(result.data).toEqual(data);
41+
expect(result).toEqual({
42+
data,
43+
});
4144
});
4245

4346
test.each([
4447
{
45-
schema: $EmailTemplateFields,
48+
schema: $EmailTemplate,
4649
data: {
4750
name: 'Test Template',
4851
message: 'a'.repeat(100_001),
@@ -51,15 +54,15 @@ describe('Template schemas', () => {
5154
},
5255
},
5356
{
54-
schema: $SMSTemplateFields,
57+
schema: $SMSTemplate,
5558
data: {
5659
name: 'Test Template',
5760
message: 'a'.repeat(919),
5861
templateType: TemplateType.SMS,
5962
},
6063
},
6164
{
62-
schema: $NHSAppTemplateFields,
65+
schema: $NhsAppTemplate,
6366
data: {
6467
name: 'Test Template',
6568
message: 'a'.repeat(5001),
@@ -69,34 +72,36 @@ describe('Template schemas', () => {
6972
])(
7073
'%p.templateType - should fail validation, when max character length exceeded',
7174
async ({ schema, data }) => {
72-
const result = schema.safeParse(data);
75+
const result = await validate(schema, data);
7376

74-
expect(result.error?.flatten()).toEqual(
75-
expect.objectContaining({
76-
fieldErrors: {
77-
message: [
78-
`String must contain at most ${data.message.length - 1} character(s)`,
79-
],
77+
expect(result).toEqual({
78+
error: expect.objectContaining({
79+
code: 400,
80+
message: `Request failed validation`,
81+
details: {
82+
message: `String must contain at most ${data.message.length - 1} character(s)`,
8083
},
81-
})
82-
);
84+
}),
85+
});
8386
}
8487
);
8588

8689
test('$EmailTemplate - should fail validation, when no subject', async () => {
87-
const result = $EmailTemplateFields.safeParse({
90+
const result = await validate($EmailTemplate, {
8891
name: 'Test Template',
8992
message: 'a'.repeat(100_000),
9093
templateType: TemplateType.EMAIL,
9194
});
9295

93-
expect(result.error?.flatten()).toEqual(
94-
expect.objectContaining({
95-
fieldErrors: {
96-
subject: ['Required'],
96+
expect(result).toEqual({
97+
error: expect.objectContaining({
98+
code: 400,
99+
message: `Request failed validation`,
100+
details: {
101+
subject: `Required`,
97102
},
98-
})
99-
);
103+
}),
104+
});
100105
});
101106

102107
test.each([
@@ -106,21 +111,22 @@ describe('Template schemas', () => {
106111
])(
107112
'$NhsAppTemplate - should fail validation, when invalid characters are present %p',
108113
async (message) => {
109-
const result = $NHSAppTemplateFields.safeParse({
114+
const result = await validate($NhsAppTemplate, {
110115
name: 'Test Template',
111116
message,
112117
templateType: TemplateType.NHS_APP,
113118
});
114119

115-
expect(result.error?.flatten()).toEqual(
116-
expect.objectContaining({
117-
fieldErrors: {
118-
message: [
120+
expect(result).toEqual({
121+
error: expect.objectContaining({
122+
code: 400,
123+
message: `Request failed validation`,
124+
details: {
125+
message:
119126
'Message contains disallowed characters. Disallowed characters: <(.|\n)*?>',
120-
],
121127
},
122-
})
123-
);
128+
}),
129+
});
124130
}
125131
);
126132

@@ -145,9 +151,11 @@ describe('Template schemas', () => {
145151
templateType: TemplateType.NHS_APP,
146152
},
147153
])('should pass validation %p', async (template) => {
148-
const result = $CreateTemplateSchema.safeParse(template);
154+
const result = await validate($CreateTemplateSchema, template);
149155

150-
expect(result.data).toEqual(template);
156+
expect(result).toEqual({
157+
data: template,
158+
});
151159
});
152160
});
153161

@@ -173,9 +181,11 @@ describe('Template schemas', () => {
173181
templateType: TemplateType.NHS_APP,
174182
},
175183
])('should pass validation %p', async (template) => {
176-
const result = $UpdateTemplateSchema.safeParse(template);
184+
const result = await validate($UpdateTemplateSchema, template);
177185

178-
expect(result.data).toEqual(template);
186+
expect(result).toEqual({
187+
data: template,
188+
});
179189
});
180190
});
181191
});

lambdas/backend-api/src/templates/app/template-client.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import {
55
Result,
66
TemplateDTO,
77
UpdateTemplate,
8+
} from 'nhs-notify-backend-client';
9+
import {
810
$CreateTemplateSchema,
911
$UpdateTemplateSchema,
10-
} from 'nhs-notify-backend-client';
11-
import { templateRepository } from '@backend-api/templates/infra';
12+
templateRepository,
13+
} from '@backend-api/templates/domain/template';
1214

1315
export class TemplateClient implements ITemplateClient {
1416
constructor(private readonly _owner: string) {}

lambdas/backend-client/src/schemas/constants.ts renamed to lambdas/backend-api/src/templates/domain/template/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* https://digital.nhs.uk/developer/api-catalogue/nhs-app#post-/communication/in-app/FHIR/R4/CommunicationRequest
44
* https://digital.nhs.uk/developer/api-catalogue/nhs-notify#overview--message-character-limits
55
*/
6-
export const NHS_APP_DISALLOWED_CHARACTERS = '<(.|\n)*?>' as const;
6+
export const NHS_APP_DISALLOWED_CHARACTERS = '<(.|\n)*?>';
77
export const MAX_NHS_APP_CHARACTER_LENGTH = 5000 as const;
88
export const MAX_SMS_CHARACTER_LENGTH = 918 as const;
99
export const MAX_EMAIL_CHARACTER_LENGTH = 100_000 as const;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export * from './template';
2+
export * from './template-repository';
3+
export {
4+
$UpdateTemplateSchema,
5+
$CreateTemplateSchema,
6+
} from './template-schema';

lambdas/backend-api/src/templates/infra/template-repository.ts renamed to lambdas/backend-api/src/templates/domain/template/template-repository.ts

File renamed without changes.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { z } from 'zod';
2+
import {
3+
CreateTemplate,
4+
TemplateStatus,
5+
TemplateType,
6+
UpdateTemplate,
7+
} from 'nhs-notify-backend-client';
8+
import { schemaFor } from '@backend-api/utils/schema-for';
9+
import {
10+
MAX_SMS_CHARACTER_LENGTH,
11+
MAX_EMAIL_CHARACTER_LENGTH,
12+
MAX_NHS_APP_CHARACTER_LENGTH,
13+
NHS_APP_DISALLOWED_CHARACTERS,
14+
} from './constants';
15+
16+
const $Template = schemaFor<CreateTemplate>()(
17+
z.object({
18+
templateType: z.nativeEnum(TemplateType),
19+
name: z.string().min(1),
20+
message: z.string(),
21+
})
22+
);
23+
24+
export const $SMSTemplate = schemaFor<CreateTemplate>()(
25+
$Template.extend({
26+
templateType: z.literal(TemplateType.SMS),
27+
message: z.string().min(1).max(MAX_SMS_CHARACTER_LENGTH),
28+
})
29+
);
30+
31+
export const $NhsAppTemplate = schemaFor<CreateTemplate>()(
32+
$Template.extend({
33+
templateType: z.literal(TemplateType.NHS_APP),
34+
message: z
35+
.string()
36+
.min(1)
37+
.max(MAX_NHS_APP_CHARACTER_LENGTH)
38+
// eslint-disable-next-line security/detect-non-literal-regexp
39+
.refine((s) => !new RegExp(NHS_APP_DISALLOWED_CHARACTERS, 'gi').test(s), {
40+
message: `Message contains disallowed characters. Disallowed characters: ${NHS_APP_DISALLOWED_CHARACTERS}`,
41+
}),
42+
})
43+
);
44+
45+
export const $EmailTemplate = schemaFor<CreateTemplate>()(
46+
$Template.extend({
47+
subject: z.string().min(1),
48+
templateType: z.literal(TemplateType.EMAIL),
49+
message: z.string().max(MAX_EMAIL_CHARACTER_LENGTH).min(1),
50+
})
51+
);
52+
53+
const $UpdateFields = {
54+
templateStatus: z.nativeEnum(TemplateStatus),
55+
};
56+
57+
export const $CreateTemplateSchema = z.discriminatedUnion('templateType', [
58+
$SMSTemplate,
59+
$NhsAppTemplate,
60+
$EmailTemplate,
61+
]);
62+
63+
export const $UpdateTemplateSchema = schemaFor<UpdateTemplate>()(
64+
z.discriminatedUnion('templateType', [
65+
$SMSTemplate.extend($UpdateFields),
66+
$NhsAppTemplate.extend($UpdateFields),
67+
$EmailTemplate.extend($UpdateFields),
68+
])
69+
);

lambdas/backend-api/src/templates/infra/template.ts renamed to lambdas/backend-api/src/templates/domain/template/template.ts

File renamed without changes.

lambdas/backend-api/src/templates/infra/index.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)