-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathdb.ts
More file actions
93 lines (80 loc) · 2.41 KB
/
Copy pathdb.ts
File metadata and controls
93 lines (80 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { GenericContainer } from 'testcontainers';
import {
CreateTableCommand,
DeleteTableCommand,
DynamoDBClient,
UpdateTimeToLiveCommand
} from '@aws-sdk/client-dynamodb';
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
import { DatastoreConfig } from '../config';
export async function setupDynamoDBContainer() {
const container = await new GenericContainer('amazon/dynamodb-local')
.withExposedPorts(8000)
.start();
const endpoint = `http://${container.getHost()}:${container.getMappedPort(8000)}`;
const ddbClient = new DynamoDBClient({
region: 'us-west-2',
endpoint,
credentials: {
accessKeyId: 'fakeMyKeyId',
secretAccessKey: 'fakeSecretAccessKey'
}
});
const docClient = DynamoDBDocumentClient.from(ddbClient);
const config : DatastoreConfig = {
region: 'us-west-2',
endpoint,
lettersTableName: 'letters',
ttlHours: 1
};
return {
container,
ddbClient,
docClient,
endpoint,
config
};
}
export type DBContext = Awaited<ReturnType<typeof setupDynamoDBContainer>>;
export async function createTables(context: DBContext) {
const { ddbClient } = context;
await ddbClient.send(new CreateTableCommand({
TableName: 'letters',
BillingMode: 'PAY_PER_REQUEST',
KeySchema: [
{ AttributeName: 'supplierId', KeyType: 'HASH' }, // Partition key
{ AttributeName: 'id', KeyType: 'RANGE' } // Sort key
],
GlobalSecondaryIndexes: [
{
IndexName: 'supplierStatus-index',
KeySchema: [
{ AttributeName: 'supplierStatus', KeyType: 'HASH' }, // Partition key for GSI
{ AttributeName: 'supplierStatusSk', KeyType: 'RANGE' } // Sort key for GSI
],
Projection: {
ProjectionType: 'ALL'
}
}
],
AttributeDefinitions: [
{ AttributeName: 'supplierId', AttributeType: 'S' },
{ AttributeName: 'id', AttributeType: 'S' },
{ AttributeName: 'supplierStatus', AttributeType: 'S' },
{ AttributeName: 'supplierStatusSk', AttributeType: 'S' },
]
}));
await ddbClient.send(new UpdateTimeToLiveCommand({
TableName: 'letters',
TimeToLiveSpecification: {
AttributeName: 'ttl',
Enabled: true
}
}));
}
export async function deleteTables(context: DBContext) {
const { ddbClient } = context;
await ddbClient.send(new DeleteTableCommand({
TableName: 'letters'
}));
}