-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathversion-1.ts
123 lines (104 loc) · 3.3 KB
/
version-1.ts
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { DocumentClient } from 'aws-sdk/clients/dynamodb'
import pMap from 'p-map'
import AWS from "aws-sdk"
import { Vehicle } from './use-service'
const buildDefaultParams = () => {
const stage = process.env.SERVERLESS_STAGE
const tableName = `Product_VehicleState_${stage}`
return {
TableName: tableName,
}
}
const dynamoDb = new AWS.DynamoDB.DocumentClient()
export const vehicleStateDataService = {
putItem: async (vehicle: Vehicle): Promise<void> => {
await dynamoDb
.put({
...buildDefaultParams(),
Item: vehicle,
})
.promise()
},
getItemById: async (id: string): Promise<Vehicle | undefined> => {
const result = await dynamoDb
.query({
...buildDefaultParams(),
KeyConditionExpression: 'vehicleInventoryId = :hkey',
ExpressionAttributeValues: {
':hkey': id,
},
})
.promise()
return (result.Items ? result.Items[0] : undefined) as Vehicle
},
waitForVehicleToBeConsistent: async (id: string) => {
await dynamoDb
.query({
...buildDefaultParams(),
KeyConditionExpression: 'vehicleInventoryId = :hkey',
ExpressionAttributeValues: {
':hkey': id,
},
ConsistentRead: true,
})
.promise()
},
getAll: async (): Promise<string[]> => {
const dynamoDb = new AWS.DynamoDB.DocumentClient({
httpOptions: {
timeout: 60000 * 5, // 5 minutes
},
})
return [...new Set((await parallelScan(dynamoDb)).map((x) => x.vehicleInventoryId as string))]
},
getAllVehicleCapEnrichmentFields: async (): Promise<CapEnrichmentField[]> => {
const dynamoDb = new AWS.DynamoDB.DocumentClient({
httpOptions: {
timeout: 60000 * 5, // 5 minutes
},
})
return (await parallelScan(dynamoDb))
.map((x) => {
return {
vehicleInventoryId: x.vehicleInventoryId as string,
capId: x.capId as number,
registrationDate: x.registrationDate as string,
capRegistrationOverrideDate: x.capRegistrationOverrideDate as string,
}
})
.reduce((vehicles, nextVehicle) => {
const existingVehicle = vehicles.find((v) => v.vehicleInventoryId === nextVehicle.vehicleInventoryId)
if (!existingVehicle) {
return [...vehicles, nextVehicle] as CapEnrichmentField[]
}
return vehicles
}, [] as CapEnrichmentField[])
},
}
const parallelScan = async (dynamoDb: AWS.DynamoDB.DocumentClient): Promise<DocumentClient.ItemList> => {
const segmentIndexes = [...Array(8).keys()]
const docs: DocumentClient.ItemList = []
await pMap(segmentIndexes, async (_, segmentIndex) => {
let ExclusiveStartKey: DocumentClient.Key | undefined
const params: DocumentClient.ScanInput = {
...buildDefaultParams(),
Segment: segmentIndex,
TotalSegments: 8,
}
do {
if (ExclusiveStartKey) {
params.ExclusiveStartKey = ExclusiveStartKey
}
const { Items, LastEvaluatedKey } = await dynamoDb.scan(params).promise()
ExclusiveStartKey = LastEvaluatedKey
docs.push(...(Items ?? []))
} while (ExclusiveStartKey)
})
return docs
}
export interface CapEnrichmentField {
vehicleInventoryId: string
capId: number
registrationDate: string
capRegistrationOverrideDate?: string
}