Skip to content

Commit a5c5cea

Browse files
committed
CCM-11228: Update letter repository tests and add MI schema and diagram generation
1 parent 8545825 commit a5c5cea

File tree

8 files changed

+81
-36
lines changed

8 files changed

+81
-36
lines changed

internal/datastore/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"name": "datastore",
2727
"private": true,
2828
"scripts": {
29-
"diagrams": "ts-node src/__test__/genmermaid.ts",
29+
"diagrams": "ts-node src/cli/diagrams.ts",
3030
"lint": "eslint .",
3131
"lint:fix": "eslint . --fix",
3232
"test:unit": "jest",

internal/datastore/src/__test__/genmermaid.ts

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

internal/datastore/src/__test__/letter-repository.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Logger } from 'pino';
55
import { createTestLogger, LogStream } from './logs';
66
import { PutCommand } from '@aws-sdk/lib-dynamodb';
77

8-
function createLetter(supplierId: string, letterId: string, status: Letter['status'] = 'PENDING'): Letter {
8+
function createLetter(supplierId: string, letterId: string, status: Letter['status'] = 'PENDING'): Omit<Letter, 'ttl' | 'supplierStatus'> {
99
return {
1010
id: letterId,
1111
supplierId: supplierId,
@@ -114,6 +114,8 @@ describe('LetterRepository', () => {
114114
const originalLetter = await letterRepository.getLetterById('supplier1', 'letter1');
115115
expect(originalLetter.updatedAt).toBe('2020-02-01T00:00:00.000Z');
116116

117+
// Month is zero-indexed in JavaScript Date
118+
// Day is one-indexed
117119
jest.setSystemTime(new Date(2020, 1, 2));
118120
await letterRepository.updateLetterStatus('supplier1', 'letter1', 'DELIVERED');
119121
const updatedLetter = await letterRepository.getLetterById('supplier1', 'letter1');
@@ -185,6 +187,7 @@ describe('LetterRepository', () => {
185187
});
186188

187189
test('letter list should return empty when no letters match status', async () => {
190+
await letterRepository.putLetter(createLetter('supplier1', 'letter1', 'ACCEPTED'));
188191
const page = await letterRepository.getLettersByStatus('supplier1', 'PENDING');
189192
expect(page.letters).toHaveLength(0);
190193
expect(page.lastEvaluatedKey).toBeUndefined();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { LetterSchema, MISchema } from '../types';
2+
import { generateMermaidDiagram } from 'zod-mermaid';
3+
import * as fs from 'node:fs';
4+
5+
const out = fs.openSync('src/types.md', 'w');
6+
7+
fs.writeSync(out, `# Data Store Schemas
8+
9+
This document contains the mermaid diagrams for the data store schemas used in the application.
10+
11+
The schemas are generated from Zod definitions and provide a visual representation of the data structure.
12+
`);
13+
14+
for (const [name, schema] of Object.entries({ Letter: [LetterSchema], MI: [MISchema] })) {
15+
const mermaid = generateMermaidDiagram(schema);
16+
fs.writeSync(out, `
17+
## ${name} schema
18+
19+
\`\`\`mermaid
20+
${mermaid}
21+
\`\`\`
22+
`);
23+
}
24+
25+
fs.closeSync(out);

internal/datastore/src/letter-repository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
UpdateCommand,
77
UpdateCommandOutput
88
} from '@aws-sdk/lib-dynamodb';
9-
import { Letter, LetterDB, LetterSchema } from './types';
9+
import { Letter, LetterSchema } from './types';
1010
import { Logger } from 'pino';
1111

1212
export type PagingOptions = Partial<{
@@ -29,8 +29,8 @@ export class LetterRepository {
2929
readonly config: LetterRepositoryConfig) {
3030
}
3131

32-
async putLetter(letter: Letter): Promise<Letter> {
33-
const letterDb: LetterDB = {
32+
async putLetter(letter: Omit<Letter, 'ttl' | 'supplierStatus'>): Promise<Letter> {
33+
const letterDb: Letter = {
3434
...letter,
3535
supplierStatus: `${letter.supplierId}#${letter.status}`,
3636
ttl: Math.floor(Date.now() / 1000 + 60 * 60 * this.config.ttlHours)

internal/datastore/src/types.md

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
# Data Store Schemas
12

2-
# Letter schema
3+
This document contains the mermaid diagrams for the data store schemas used in the application.
4+
5+
The schemas are generated from Zod definitions and provide a visual representation of the data structure.
6+
7+
## Letter schema
38

49
```mermaid
510
erDiagram
@@ -12,14 +17,30 @@ erDiagram
1217
string status "enum: PENDING, ACCEPTED, DISPATCHED, FAILED, REJECTED, DELIVERED, CANCELLED"
1318
string createdAt
1419
string updatedAt
20+
string supplierStatus
21+
number ttl "min: -9007199254740991, max: 9007199254740991"
1522
}
1623
Supplier {
1724
}
18-
Supplier {
25+
Letter }o--|| Supplier : "supplierId"
26+
```
27+
28+
## MI schema
29+
30+
```mermaid
31+
erDiagram
32+
MI {
1933
string id
20-
string name
21-
string apimId
22-
string status "enum: ENABLED, DISABLED"
34+
string supplierId "ref: Supplier"
35+
string specificationId
36+
string groupId
37+
string lineItem
38+
number quantity
39+
number stockRemaining
40+
string createdAt
41+
string updatedAt
2342
}
24-
Letter }o--|| Supplier : "supplierId"
43+
Supplier {
44+
}
45+
MI }o--|| Supplier : "supplierId"
2546
```

internal/datastore/src/types.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,28 @@ export const LetterSchema = z.object({
2424
url: z.url(),
2525
status: LetterStatus,
2626
createdAt: z.string(),
27-
updatedAt: z.string()
28-
}).describe('Letter');
29-
30-
export type Letter = z.infer<typeof LetterSchema>;
31-
32-
export const LetterDBSchema = LetterSchema.extend({
27+
updatedAt: z.string(),
3328
supplierStatus: z.string().describe('Secondary index PK'),
3429
ttl: z.int()
35-
});
30+
}).describe('Letter');
3631

3732
/**
38-
* LetterDB is the type used for storing letters in the database.
39-
* It extends the LetterSchema with a secondary index for supplierStatus.
33+
* Letter is the type used for storing letters in the database.
34+
* The supplierStatus is a composite key combining supplierId and status.
35+
* The ttl is used for automatic deletion of old letters.
4036
*/
41-
export type LetterDB = z.infer<typeof LetterDBSchema>;
37+
export type Letter = z.infer<typeof LetterSchema>;
38+
39+
export const MISchema = z.object({
40+
id: z.string(),
41+
supplierId: idRef(SupplierSchema),
42+
specificationId: z.string(),
43+
groupId: z.string(),
44+
lineItem: z.string(),
45+
quantity: z.number(),
46+
stockRemaining: z.number(),
47+
createdAt: z.string(),
48+
updatedAt: z.string()
49+
}).describe('MI');
50+
51+
export type MI = z.infer<typeof MISchema>;

scripts/config/vale/styles/config/vocabularies/words/accept.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@ Terraform
3030
toolchain
3131
Trufflehog
3232
vNext
33+
Zod

0 commit comments

Comments
 (0)