Skip to content

Commit 5d17987

Browse files
CCM-8579: Use model composition to refine template types and maintain create/update/dto parity
1 parent a584e7f commit 5d17987

File tree

11 files changed

+229
-107
lines changed

11 files changed

+229
-107
lines changed

infrastructure/terraform/modules/backend-api/spec.tmpl.json

Lines changed: 160 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -282,54 +282,6 @@
282282
}
283283
},
284284
"schemas": {
285-
"TemplateDTO": {
286-
"type": "object",
287-
"required": [
288-
"id",
289-
"templateType",
290-
"templateStatus",
291-
"name",
292-
"createdAt",
293-
"updatedAt"
294-
],
295-
"properties": {
296-
"id": {
297-
"type": "string"
298-
},
299-
"templateType": {
300-
"$ref": "#/components/schemas/TemplateType"
301-
},
302-
"templateStatus": {
303-
"$ref": "#/components/schemas/TemplateStatus"
304-
},
305-
"letterType": {
306-
"$ref": "#/components/schemas/LetterType"
307-
},
308-
"language": {
309-
"$ref": "#/components/schemas/Language"
310-
},
311-
"files": {
312-
"$ref": "#/components/schemas/Files"
313-
},
314-
"name": {
315-
"type": "string"
316-
},
317-
"message": {
318-
"type": "string"
319-
},
320-
"createdAt": {
321-
"type": "string",
322-
"format": "date-time"
323-
},
324-
"updatedAt": {
325-
"type": "string",
326-
"format": "date-time"
327-
},
328-
"subject": {
329-
"type": "string"
330-
}
331-
}
332-
},
333285
"TemplateType": {
334286
"type": "string",
335287
"enum": [
@@ -402,8 +354,7 @@
402354
"File": {
403355
"type": "object",
404356
"required": [
405-
"fileName",
406-
"virusScanStatus"
357+
"fileName"
407358
],
408359
"properties": {
409360
"fileName": {
@@ -424,7 +375,7 @@
424375
"$ref": "#/components/schemas/File"
425376
},
426377
"testDataCsv": {
427-
"$ref": "#/components/schemas/File"
378+
"$ref": "#/components/schemas/File"
428379
},
429380
"proofs": {
430381
"type": "array",
@@ -434,7 +385,7 @@
434385
}
435386
}
436387
},
437-
"CreateTemplate": {
388+
"BaseTemplate": {
438389
"type": "object",
439390
"required": [
440391
"templateType",
@@ -446,42 +397,175 @@
446397
},
447398
"name": {
448399
"type": "string"
400+
}
401+
}
402+
},
403+
"BaseNHSAppTemplate": {
404+
"type": "object",
405+
"allOf": [
406+
{
407+
"$ref": "#/components/schemas/BaseTemplate"
449408
},
450-
"message": {
451-
"type": "string"
409+
{
410+
"type": "object",
411+
"required": [
412+
"message"
413+
],
414+
"properties": {
415+
"message": {
416+
"type": "string"
417+
}
418+
}
419+
}
420+
]
421+
},
422+
"BaseEmailTemplate": {
423+
"type": "object",
424+
"allOf": [
425+
{
426+
"$ref": "#/components/schemas/BaseTemplate"
452427
},
453-
"subject": {
454-
"type": "string"
428+
{
429+
"type": "object",
430+
"required": [
431+
"message",
432+
"subject"
433+
],
434+
"properties": {
435+
"message": {
436+
"type": "string"
437+
},
438+
"subject": {
439+
"type": "string"
440+
}
441+
}
455442
}
456-
}
443+
]
457444
},
458-
"UpdateTemplate": {
445+
"BaseSMSTemplate": {
459446
"type": "object",
460-
"required": [
461-
"templateStatus",
462-
"name",
463-
"templateType"
464-
],
465-
"properties": {
466-
"templateStatus": {
467-
"$ref": "#/components/schemas/TemplateStatus"
447+
"allOf": [
448+
{
449+
"$ref": "#/components/schemas/BaseTemplate"
468450
},
469-
"name": {
470-
"type": "string"
451+
{
452+
"type": "object",
453+
"required": [
454+
"message"
455+
],
456+
"properties": {
457+
"message": {
458+
"type": "string"
459+
}
460+
}
461+
}
462+
]
463+
},
464+
"BaseLetterTemplate": {
465+
"type": "object",
466+
"allOf": [
467+
{
468+
"$ref": "#/components/schemas/BaseTemplate"
471469
},
472-
"message": {
473-
"type": "string"
470+
{
471+
"type": "object",
472+
"required": [
473+
"letterType",
474+
"language",
475+
"files"
476+
],
477+
"properties": {
478+
"letterType": {
479+
"type": "#/components/schemas/LetterType"
480+
},
481+
"language": {
482+
"type": "#/components/schemas/Language"
483+
},
484+
"files": {
485+
"$ref": "#/components/schemas/Files"
486+
}
487+
}
488+
}
489+
]
490+
},
491+
"CreateTemplate": {
492+
"type": "object",
493+
"oneOf": [
494+
{
495+
"$ref": "#/components/schemas/BaseNHSAppTemplate"
474496
},
475-
"subject": {
476-
"type": "string"
497+
{
498+
"$ref": "#/components/schemas/BaseEmailTemplate"
477499
},
478-
"templateType": {
479-
"$ref": "#/components/schemas/TemplateType",
480-
"readOnly": true,
481-
"description": "This value will never be updated. It is used to determine the type of template being validated."
500+
{
501+
"$ref": "#/components/schemas/BaseSMSTemplate"
502+
},
503+
{
504+
"$ref": "#/components/schemas/BaseLetterTemplate"
505+
}
506+
],
507+
"discriminator": {
508+
"propertyName": "templateType",
509+
"mapping": {
510+
"NHS_APP": "#/components/schemas/BaseNHSAppTemplate",
511+
"EMAIL": "#/components/schemas/BaseEmailTemplate",
512+
"SMS": "#/components/schemas/BaseSMSTemplate",
513+
"LETTER": "#/components/schemas/BaseLetterTemplate"
482514
}
483515
}
484516
},
517+
"UpdateTemplate": {
518+
"type": "object",
519+
"allOf": [
520+
{
521+
"$ref": "#/components/schemas/CreateTemplate"
522+
},
523+
{
524+
"type": "object",
525+
"required": [
526+
"templateStatus"
527+
],
528+
"properties": {
529+
"templateStatus": {
530+
"$ref": "#/components/schemas/TemplateStatus"
531+
}
532+
}
533+
}
534+
]
535+
},
536+
"TemplateDTO": {
537+
"type": "object",
538+
"allOf": [
539+
{
540+
"$ref": "#/components/schemas/CreateTemplate"
541+
},
542+
{
543+
"type": "object",
544+
"required": [
545+
"id",
546+
"templateStatus",
547+
"createdAt",
548+
"updatedAt"
549+
],
550+
"properties": {
551+
"id": {
552+
"type": "string"
553+
},
554+
"templateStatus": {
555+
"$ref": "#/components/schemas/TemplateStatus"
556+
},
557+
"createdAt": {
558+
"type": "string",
559+
"format": "date-time"
560+
},
561+
"updatedAt": {
562+
"type": "string",
563+
"format": "date-time"
564+
}
565+
}
566+
}
567+
]
568+
},
485569
"Success": {
486570
"type": "object",
487571
"required": [

lambdas/backend-client/src/types/generated/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
/* tslint:disable */
44
/* eslint-disable */
55

6+
export type { BaseEmailTemplate } from './models/BaseEmailTemplate';
7+
export type { BaseLetterTemplate } from './models/BaseLetterTemplate';
8+
export type { BaseNHSAppTemplate } from './models/BaseNHSAppTemplate';
9+
export type { BaseSMSTemplate } from './models/BaseSMSTemplate';
10+
export type { BaseTemplate } from './models/BaseTemplate';
611
export type { CreateTemplate } from './models/CreateTemplate';
712
export type { Failure } from './models/Failure';
813
export type { File } from './models/File';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* generated using openapi-typescript-codegen -- do not edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
import type { BaseTemplate } from './BaseTemplate';
6+
export type BaseEmailTemplate = (BaseTemplate & {
7+
message: string;
8+
subject: string;
9+
});
10+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* generated using openapi-typescript-codegen -- do not edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
import type { BaseTemplate } from './BaseTemplate';
6+
import type { Files } from './Files';
7+
import type { Language } from './Language';
8+
import type { LetterType } from './LetterType';
9+
export type BaseLetterTemplate = (BaseTemplate & {
10+
letterType: LetterType;
11+
language: Language;
12+
files: Files;
13+
});
14+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* generated using openapi-typescript-codegen -- do not edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
import type { BaseTemplate } from './BaseTemplate';
6+
export type BaseNHSAppTemplate = (BaseTemplate & {
7+
message: string;
8+
});
9+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* generated using openapi-typescript-codegen -- do not edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
import type { BaseTemplate } from './BaseTemplate';
6+
export type BaseSMSTemplate = (BaseTemplate & {
7+
message: string;
8+
});
9+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* generated using openapi-typescript-codegen -- do not edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
import type { TemplateType } from './TemplateType';
6+
export type BaseTemplate = {
7+
templateType: TemplateType;
8+
name: string;
9+
};
10+

lambdas/backend-client/src/types/generated/models/CreateTemplate.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
/* istanbul ignore file */
33
/* tslint:disable */
44
/* eslint-disable */
5-
import type { TemplateType } from './TemplateType';
6-
export type CreateTemplate = {
7-
templateType: TemplateType;
8-
name: string;
9-
message?: string;
10-
subject?: string;
11-
};
5+
import type { BaseEmailTemplate } from './BaseEmailTemplate';
6+
import type { BaseLetterTemplate } from './BaseLetterTemplate';
7+
import type { BaseNHSAppTemplate } from './BaseNHSAppTemplate';
8+
import type { BaseSMSTemplate } from './BaseSMSTemplate';
9+
export type CreateTemplate = (BaseNHSAppTemplate | BaseEmailTemplate | BaseSMSTemplate | BaseLetterTemplate);
1210

lambdas/backend-client/src/types/generated/models/File.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ import type { VirusScanStatus } from './VirusScanStatus';
66
export type File = {
77
fileName: string;
88
currentVersion?: string;
9-
virusScanStatus: VirusScanStatus;
9+
virusScanStatus?: VirusScanStatus;
1010
};
1111

0 commit comments

Comments
 (0)