Skip to content

Commit bf50012

Browse files
committed
CCM-11228: Add TTL fields to ddb repository
1 parent 6ef3150 commit bf50012

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

internal/datastore/src/__test__/db.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { GenericContainer } from 'testcontainers';
2-
import { CreateTableCommand, DeleteTableCommand, DynamoDBClient } from '@aws-sdk/client-dynamodb';
2+
import {
3+
CreateTableCommand,
4+
DeleteTableCommand,
5+
DynamoDBClient,
6+
UpdateTimeToLiveCommand
7+
} from '@aws-sdk/client-dynamodb';
38
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
49
import { DatastoreConfig } from '../config';
510

@@ -24,7 +29,8 @@ export async function setupDynamoDBContainer() {
2429
const config : DatastoreConfig = {
2530
region: 'us-west-2',
2631
endpoint,
27-
lettersTableName: 'letters'
32+
lettersTableName: 'letters',
33+
ttlHours: 1
2834
};
2935

3036
return {
@@ -66,8 +72,17 @@ export async function createTables(context: DBContext) {
6672
{ AttributeName: 'supplierStatus', AttributeType: 'S' }
6773
]
6874
}));
75+
76+
await ddbClient.send(new UpdateTimeToLiveCommand({
77+
TableName: 'letters',
78+
TimeToLiveSpecification: {
79+
AttributeName: 'ttl',
80+
Enabled: true
81+
}
82+
}));
6983
}
7084

85+
7186
export async function deleteTables(context: DBContext) {
7287
const { ddbClient } = context;
7388

internal/datastore/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export type DatastoreConfig = {
22
region: string,
33
endpoint?: string,
44
lettersTableName: string,
5+
ttlHours: number
56
}

internal/datastore/src/letter-repository.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,22 @@ const defaultPagingOptions = {
1818
pageSize: 50
1919
};
2020

21+
export type LetterRepositoryConfig = {
22+
lettersTableName: string,
23+
ttlHours: number
24+
}
25+
2126
export class LetterRepository {
2227
constructor(readonly ddbClient: DynamoDBDocumentClient,
2328
readonly log: Logger,
24-
readonly config: { lettersTableName: string }) {
29+
readonly config: LetterRepositoryConfig) {
2530
}
2631

27-
async putLetter(letter: Letter): Promise<LetterDB> {
32+
async putLetter(letter: Letter): Promise<Letter> {
2833
const letterDb: LetterDB = {
2934
...letter,
30-
supplierStatus: `${letter.supplierId}#${letter.status}`
35+
supplierStatus: `${letter.supplierId}#${letter.status}`,
36+
ttl: Math.floor(Date.now() / 1000 + 60 * 60 * this.config.ttlHours)
3137
};
3238
try {
3339
await this.ddbClient.send(new PutCommand({
@@ -41,7 +47,7 @@ export class LetterRepository {
4147
}
4248
throw error;
4349
}
44-
return letterDb;
50+
return LetterSchema.parse(letterDb);
4551
}
4652

4753
async getLetterById(supplierId: string, letterId: string): Promise<Letter> {
@@ -103,15 +109,17 @@ export class LetterRepository {
103109
supplierId: supplierId,
104110
id: letterId
105111
},
106-
UpdateExpression: 'set #status = :status, updatedAt = :updatedAt, supplierStatus = :supplierStatus',
112+
UpdateExpression: 'set #status = :status, updatedAt = :updatedAt, supplierStatus = :supplierStatus, #ttl = :ttl',
107113
ConditionExpression: 'attribute_exists(id)', // Ensure letter exists
108114
ExpressionAttributeNames: {
109115
'#status': 'status',
116+
'#ttl': 'ttl'
110117
},
111118
ExpressionAttributeValues: {
112119
':status': status,
113120
':updatedAt': new Date().toISOString(),
114-
':supplierStatus': `${supplierId}#${status}`
121+
':supplierStatus': `${supplierId}#${status}`,
122+
':ttl': Math.floor(Date.now() / 1000 + 60 * 60 * this.config.ttlHours)
115123
},
116124
ReturnValues: 'ALL_NEW'
117125
}));

internal/datastore/src/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ export const LetterSchema = z.object({
2424
url: z.url(),
2525
status: LetterStatus,
2626
createdAt: z.string(),
27-
updatedAt: z.string(),
27+
updatedAt: z.string()
2828
}).describe('Letter');
2929

3030
export type Letter = z.infer<typeof LetterSchema>;
3131

3232
export const LetterDBSchema = LetterSchema.extend({
3333
supplierStatus: z.string().describe('Secondary index PK'),
34+
ttl: z.int()
3435
});
3536

3637
/**

0 commit comments

Comments
 (0)