Skip to content

Commit 30fe071

Browse files
committed
CCM-14616: POF
1 parent 46fe37e commit 30fe071

9 files changed

Lines changed: 78 additions & 21 deletions

File tree

lambdas/ttl-create-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('createHandler', () => {
8585
expect(res.batchItemFailures).toEqual([{ itemIdentifier: 'msg2' }]);
8686
expect(logger.error).toHaveBeenCalledWith(
8787
expect.objectContaining({
88-
description: expect.stringContaining('parsing ttl queue entry'),
88+
description: expect.stringContaining('Error parsing MESHInboxMessageDownloaded event'),
8989
}),
9090
);
9191
expect(logger.info).toHaveBeenCalledWith({

lambdas/ttl-create-lambda/src/apis/sqs-trigger-lambda.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@ import { randomUUID } from 'node:crypto';
77
import type { CreateTtl, CreateTtlOutcome } from 'app/create-ttl';
88
import { EventPublisher, Logger } from 'utils';
99
import itemEnqueuedValidator from 'digital-letters-events/ItemEnqueued.js';
10-
import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
11-
import {
12-
ItemEnqueued,
13-
MESHInboxMessageDownloaded,
14-
} from 'digital-letters-events';
10+
import { MESHInboxMessageDownloaded, validateMESHInboxMessageDownloaded } from 'digital-letters-events';
1511

1612
interface ProcessingResult {
1713
result: CreateTtlOutcome;
@@ -36,19 +32,12 @@ export const createHandler = ({
3632
async ({ body, messageId }): Promise<ProcessingResult> => {
3733
try {
3834
const sqsEventBody = JSON.parse(body);
39-
const sqsEventDetail = sqsEventBody.detail;
40-
41-
const isEventValid = messageDownloadedValidator(sqsEventDetail);
42-
if (!isEventValid) {
43-
logger.error({
44-
err: messageDownloadedValidator.errors,
45-
description: 'Error parsing ttl queue entry',
46-
});
35+
const messageDownloadedEvent = validateMESHInboxMessageDownloaded(sqsEventBody.detail, logger);
36+
37+
if (!messageDownloadedEvent) {
4738
batchItemFailures.push({ itemIdentifier: messageId });
4839
return { result: 'failed' };
4940
}
50-
const messageDownloadedEvent: MESHInboxMessageDownloaded =
51-
sqsEventDetail;
5241

5342
const result = await createTtl.send(messageDownloadedEvent);
5443

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
validators
22
types
33
models
4+
guard-functions
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './types';
2+
export * from './guard-functions';

src/digital-letters-events/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
"exports": {
1212
".": {
13-
"types": "./types/index.d.ts"
13+
"default": "./index.ts"
1414
},
1515
"./*.js": {
1616
"default": "./validators/*.js",

src/typescript-schema-generator/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"name": "typescript-schema-generator",
1919
"private": true,
2020
"scripts": {
21-
"generate-dependencies": "npm run generate-types && npm run generate-validators",
21+
"generate-dependencies": "npm run generate-types && npm run generate-validators && npm run generate-guard-functions",
22+
"generate-guard-functions": "tsx src/generate-guard-functions-cli.ts",
2223
"generate-types": "tsx src/generate-types-cli.ts",
2324
"generate-validators": "tsx src/generate-validators-cli.ts",
2425
"lint": "eslint src",
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/* eslint-disable no-console */
2+
3+
import { generateGuardFunctions } from 'generate-guard-functions'
4+
5+
generateGuardFunctions().catch((error) => {
6+
console.error('Error generating guard functions:', error);
7+
throw error;
8+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* eslint-disable no-console */
2+
import { createOutputDir, writeFile, writeTypesIndex } from 'file-utils';
3+
import path from 'node:path';
4+
import { writeFileSync } from 'node:fs';
5+
import { eventSchemasDir, listEventSchemas, loadSchema } from 'utils';
6+
7+
export async function generateGuardFunctions() {
8+
const eventSchemaFilenames = listEventSchemas();
9+
const outputDir = createOutputDir('guard-functions');
10+
console.log(`Output directory created at ${outputDir}`);
11+
12+
console.group('Writing guard functions:');
13+
const indexLines: string[] = [];
14+
for (const eventSchemaFilename of eventSchemaFilenames) {
15+
const eventSchemaPath = path.join(eventSchemasDir, eventSchemaFilename);
16+
const eventSchema = loadSchema(eventSchemaPath);
17+
const typeName = eventSchema.title;
18+
19+
const validatorVariableName = `event${typeName}Validator`;
20+
21+
let eventTs = `import ${validatorVariableName} from 'digital-letters-events/${typeName}.js'\n`;
22+
eventTs += `import type { ${typeName} } from 'digital-letters-events';\n`;
23+
eventTs += `import { Logger } from 'utils';\n\n`;
24+
25+
eventTs += `export function validate${typeName}(\n`;
26+
eventTs += ` event: unknown,\n`;
27+
eventTs += ` logger: Logger,\n`;
28+
eventTs += `): ${typeName} | null {\n\n`;
29+
30+
eventTs += ` const eventValidator = event${typeName}Validator as (d: unknown) => d is ${typeName};\n\n`;
31+
32+
eventTs += ` if (!eventValidator(event)) {\n`;
33+
eventTs += ` logger.error({\n`;
34+
eventTs += ` err: ${validatorVariableName}.errors,\n`;
35+
eventTs += ` description: 'Error parsing ${typeName} event',\n`;
36+
eventTs += ` });\n`;
37+
eventTs += ` return null;\n`;
38+
eventTs += ` }\n\n`;
39+
40+
eventTs += ` return event;\n`;
41+
eventTs += `}\n\n`;
42+
43+
44+
const typeDeclarationName = `${typeName}`;
45+
const typeDeclarationFilename = `${typeDeclarationName}.ts`;
46+
writeFile(outputDir, typeDeclarationFilename, eventTs);
47+
console.log(typeDeclarationFilename);
48+
49+
indexLines.push(`export * from './${typeDeclarationName}';`);
50+
}
51+
console.groupEnd();
52+
53+
writeFileSync(path.join(outputDir, 'index.ts'), `${indexLines.join('\n')}\n`);
54+
console.log('index.ts file written');
55+
}

src/typescript-schema-generator/src/generate-types.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable no-console */
22
import { createOutputDir, writeFile, writeTypesIndex } from 'file-utils';
33
import { compile } from 'json-schema-to-typescript';
4+
import { writeFileSync } from 'node:fs';
45
import path from 'node:path';
56
import { eventSchemasDir, listEventSchemas, loadSchema } from 'utils';
67

@@ -21,7 +22,7 @@ export async function generateTypes() {
2122
});
2223

2324
// Write a .d.ts file named after the schema title or file.
24-
const typeDeclarationFilename = `${typeName}.d.ts`;
25+
const typeDeclarationFilename = `${typeName}.ts`;
2526
writeFile(outputDir, typeDeclarationFilename, eventTs);
2627
console.log(typeDeclarationFilename);
2728

@@ -30,6 +31,6 @@ export async function generateTypes() {
3031
}
3132
console.groupEnd();
3233

33-
writeTypesIndex(outputDir, indexLines);
34-
console.log('index.d.ts file written');
34+
writeFileSync(path.join(outputDir, 'index.ts'), `${indexLines.join('\n')}\n`);
35+
console.log('index.ts file written');
3536
}

0 commit comments

Comments
 (0)