cmp-aws-database 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-dao.js +245 -0
- package/{src → dist}/base-model.js +1 -1
- package/dist/internal-user/internal-user-dao.js +19 -0
- package/{src → dist}/internal-user/internal-user-model.js +1 -1
- package/index.js +4 -4
- package/package.json +6 -1
- package/bin/craft-my-plate-database.d.ts +0 -2
- package/bin/craft-my-plate-database.js +0 -8
- package/cdk.json +0 -85
- package/jest.config.js +0 -8
- package/lib/oms/internal-user-db-stack.d.ts +0 -7
- package/lib/oms/internal-user-db-stack.js +0 -25
- package/src/base-dao.js +0 -245
- package/src/internal-user/internal-user-dao.js +0 -19
- package/test/craft-my-plate-database.test.d.ts +0 -0
- package/test/craft-my-plate-database.test.js +0 -17
- package/tsconfig.json +0 -38
- /package/{src → dist}/base-dao.d.ts +0 -0
- /package/{src → dist}/base-model.d.ts +0 -0
- /package/{src → dist}/internal-user/internal-user-dao.d.ts +0 -0
- /package/{src → dist}/internal-user/internal-user-model.d.ts +0 -0
package/dist/base-dao.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GenericDAO = exports.mapper = exports.dynamoDB = void 0;
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const mapper_1 = require("@nova-odm/mapper");
|
|
6
|
+
exports.dynamoDB = new client_dynamodb_1.DynamoDB({
|
|
7
|
+
maxAttempts: 10
|
|
8
|
+
});
|
|
9
|
+
exports.mapper = new mapper_1.DataMapper({ client: exports.dynamoDB });
|
|
10
|
+
class GenericDAO {
|
|
11
|
+
async batchUpdate(items, batchSize = 100) {
|
|
12
|
+
let success = 0, totalToUpdate = items.length;
|
|
13
|
+
let updateItems = [];
|
|
14
|
+
while (items.length > 0) {
|
|
15
|
+
let promises = [];
|
|
16
|
+
let batch = items.splice(0, batchSize);
|
|
17
|
+
promises = batch.map(item => this.update(item));
|
|
18
|
+
let results = await Promise.allSettled(promises);
|
|
19
|
+
results.forEach(result => {
|
|
20
|
+
if (result.status == "fulfilled") {
|
|
21
|
+
success += 1;
|
|
22
|
+
updateItems.push(result.value);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
console.log(`${success}/${totalToUpdate}`);
|
|
26
|
+
}
|
|
27
|
+
return updateItems;
|
|
28
|
+
}
|
|
29
|
+
async parallelBatchPut(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
|
|
30
|
+
let startTime = Date.now();
|
|
31
|
+
let items = [];
|
|
32
|
+
items = items.concat(inputItems);
|
|
33
|
+
items = items.map(item => {
|
|
34
|
+
item.created_time = new Date();
|
|
35
|
+
// item.created_user = authContext.userSub
|
|
36
|
+
return item;
|
|
37
|
+
});
|
|
38
|
+
let maxSegments = [];
|
|
39
|
+
let putItems = [];
|
|
40
|
+
while (items.length > 0) {
|
|
41
|
+
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
42
|
+
let segment = [];
|
|
43
|
+
while (batch.length > 0) {
|
|
44
|
+
segment.push(batch.splice(0, batchSize));
|
|
45
|
+
}
|
|
46
|
+
maxSegments.push(segment);
|
|
47
|
+
}
|
|
48
|
+
for (const segment of maxSegments) {
|
|
49
|
+
let startTime = Date.now();
|
|
50
|
+
let promises = [];
|
|
51
|
+
console.log(`batch length = ${segment.length}`);
|
|
52
|
+
for (const batch of segment) {
|
|
53
|
+
promises.push(this.batchPut(batch));
|
|
54
|
+
}
|
|
55
|
+
let result = await Promise.all(promises);
|
|
56
|
+
console.log("segment complete");
|
|
57
|
+
result.forEach((res) => {
|
|
58
|
+
putItems = putItems.concat(res);
|
|
59
|
+
});
|
|
60
|
+
console.log(`time for segment put ${Date.now() - startTime}`);
|
|
61
|
+
}
|
|
62
|
+
console.log(`total time for complete parallel put ${Date.now() - startTime}`);
|
|
63
|
+
return putItems;
|
|
64
|
+
}
|
|
65
|
+
async parallelBatchDelete(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
|
|
66
|
+
let startTime = Date.now();
|
|
67
|
+
let items = [];
|
|
68
|
+
items = items.concat(inputItems);
|
|
69
|
+
let maxSegments = [];
|
|
70
|
+
let putItems = [];
|
|
71
|
+
while (items.length > 0) {
|
|
72
|
+
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
73
|
+
let segment = [];
|
|
74
|
+
while (batch.length > 0) {
|
|
75
|
+
segment.push(batch.splice(0, batchSize));
|
|
76
|
+
}
|
|
77
|
+
maxSegments.push(segment);
|
|
78
|
+
}
|
|
79
|
+
for (const segment of maxSegments) {
|
|
80
|
+
let startTime = Date.now();
|
|
81
|
+
let promises = [];
|
|
82
|
+
console.log(`batch length = ${segment.length}`);
|
|
83
|
+
for (const batch of segment) {
|
|
84
|
+
promises.push(this.batchDelete(batch));
|
|
85
|
+
}
|
|
86
|
+
let result = await Promise.all(promises);
|
|
87
|
+
console.log("segment complete");
|
|
88
|
+
result.forEach((res) => {
|
|
89
|
+
putItems = putItems.concat(res);
|
|
90
|
+
});
|
|
91
|
+
console.log(`time for segment delete ${Date.now() - startTime}`);
|
|
92
|
+
}
|
|
93
|
+
console.log(`total time for complete parallel delete ${Date.now() - startTime}`);
|
|
94
|
+
return putItems;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* This function has to be used only in the scripts.
|
|
98
|
+
*
|
|
99
|
+
* @param valueConstructor the model class
|
|
100
|
+
*/
|
|
101
|
+
async parallelScan(valueConstructor, options) {
|
|
102
|
+
let items = [];
|
|
103
|
+
for await (const item of exports.mapper.parallelScan(valueConstructor, 4, options)) {
|
|
104
|
+
items.push(item);
|
|
105
|
+
if (items.length % 100000 == 0) {
|
|
106
|
+
console.log("read 100K");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return items;
|
|
110
|
+
}
|
|
111
|
+
async scan(valueConstructor, options) {
|
|
112
|
+
let items = [];
|
|
113
|
+
for await (const item of exports.mapper.scan(valueConstructor, options)) {
|
|
114
|
+
items.push(item);
|
|
115
|
+
}
|
|
116
|
+
return items;
|
|
117
|
+
}
|
|
118
|
+
async save(item) {
|
|
119
|
+
item.created_time = new Date();
|
|
120
|
+
// item.created_user = authContext.userSub
|
|
121
|
+
const res = await exports.mapper.put(item);
|
|
122
|
+
return res;
|
|
123
|
+
}
|
|
124
|
+
async update(item) {
|
|
125
|
+
item.updated_time = new Date();
|
|
126
|
+
// item.updated_user = authContext.userSub
|
|
127
|
+
const res = await exports.mapper.update(item, {
|
|
128
|
+
onMissing: "skip"
|
|
129
|
+
});
|
|
130
|
+
return res;
|
|
131
|
+
}
|
|
132
|
+
async delete(item) {
|
|
133
|
+
return await exports.mapper.delete(item, { returnValues: "ALL_OLD" });
|
|
134
|
+
}
|
|
135
|
+
async get(item, readConsistency = "eventual") {
|
|
136
|
+
const res = await exports.mapper.get(item, {
|
|
137
|
+
readConsistency: readConsistency
|
|
138
|
+
});
|
|
139
|
+
return res;
|
|
140
|
+
}
|
|
141
|
+
async batchPut(items) {
|
|
142
|
+
let finalItems = [];
|
|
143
|
+
items = items.map(item => {
|
|
144
|
+
item.created_time = new Date();
|
|
145
|
+
// item.created_user = authContext.userSub
|
|
146
|
+
return item;
|
|
147
|
+
});
|
|
148
|
+
// console.log( "item:", items )
|
|
149
|
+
for await (const item of exports.mapper.batchPut(items)) {
|
|
150
|
+
console.log(item);
|
|
151
|
+
finalItems.push(item);
|
|
152
|
+
}
|
|
153
|
+
return finalItems;
|
|
154
|
+
}
|
|
155
|
+
async batchDelete(items) {
|
|
156
|
+
let deleteItems = [];
|
|
157
|
+
for await (const item of exports.mapper.batchDelete(items)) {
|
|
158
|
+
deleteItems.push(item);
|
|
159
|
+
}
|
|
160
|
+
return deleteItems;
|
|
161
|
+
}
|
|
162
|
+
async batchGet(items, readConsistency = "eventual") {
|
|
163
|
+
let getItems = [];
|
|
164
|
+
for await (const item of exports.mapper.batchGet(items, {
|
|
165
|
+
readConsistency: readConsistency
|
|
166
|
+
})) {
|
|
167
|
+
getItems.push(item);
|
|
168
|
+
}
|
|
169
|
+
return getItems;
|
|
170
|
+
}
|
|
171
|
+
async parallelBatchGet(inputItems, batchSize = 1000, maxConcurrentSegments = 20, readConsistency) {
|
|
172
|
+
let startTime = Date.now();
|
|
173
|
+
let items = [];
|
|
174
|
+
items = items.concat(inputItems);
|
|
175
|
+
let maxSegments = [];
|
|
176
|
+
let resultItems = [];
|
|
177
|
+
while (items.length > 0) {
|
|
178
|
+
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
179
|
+
let segment = [];
|
|
180
|
+
while (batch.length > 0) {
|
|
181
|
+
segment.push(batch.splice(0, batchSize));
|
|
182
|
+
}
|
|
183
|
+
maxSegments.push(segment);
|
|
184
|
+
}
|
|
185
|
+
for (const segment of maxSegments) {
|
|
186
|
+
let startTime = Date.now();
|
|
187
|
+
let promises = [];
|
|
188
|
+
console.log(`batch length = ${segment.length}`);
|
|
189
|
+
for (const batch of segment) {
|
|
190
|
+
promises.push(this.batchGet(batch, readConsistency));
|
|
191
|
+
}
|
|
192
|
+
let result = await Promise.all(promises);
|
|
193
|
+
console.log("segment complete");
|
|
194
|
+
result.forEach((res) => {
|
|
195
|
+
resultItems = resultItems.concat(res);
|
|
196
|
+
});
|
|
197
|
+
console.log(`time for segment get ${Date.now() - startTime}`);
|
|
198
|
+
}
|
|
199
|
+
console.log(`total time for complete parallel get ${Date.now() - startTime}`);
|
|
200
|
+
return resultItems;
|
|
201
|
+
}
|
|
202
|
+
async parallelQuery(valueConstructor, keyConditions, maxConcurrentCalls = 20, options) {
|
|
203
|
+
const startTime = Date.now();
|
|
204
|
+
const results = [];
|
|
205
|
+
while (keyConditions.length > 0) {
|
|
206
|
+
const segmentConditions = keyConditions.splice(0, maxConcurrentCalls);
|
|
207
|
+
const queryPromises = segmentConditions.map((keyCondition) => {
|
|
208
|
+
return this.customQuery(valueConstructor, keyCondition, options);
|
|
209
|
+
});
|
|
210
|
+
const queryResults = await Promise.all(queryPromises);
|
|
211
|
+
for (const queryResult of queryResults) {
|
|
212
|
+
results.push(...queryResult);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
console.log(`total time for complete parallel query ${Date.now() - startTime}`);
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
async customQuery(valueConstructor, keyConditions, options) {
|
|
219
|
+
const startTime = Date.now();
|
|
220
|
+
const items = [];
|
|
221
|
+
for await (const item of exports.mapper.query(valueConstructor, keyConditions, options)) {
|
|
222
|
+
items.push(item);
|
|
223
|
+
}
|
|
224
|
+
console.log(`total time for complete query ${Date.now() - startTime}`);
|
|
225
|
+
return items;
|
|
226
|
+
}
|
|
227
|
+
decode(continuationToken) {
|
|
228
|
+
if (continuationToken) {
|
|
229
|
+
try {
|
|
230
|
+
let lastEvaluatedKey = JSON.parse(Buffer.from(continuationToken, 'base64').toString('utf8'));
|
|
231
|
+
console.log("Incoming Last Evaluated Key " + lastEvaluatedKey);
|
|
232
|
+
return lastEvaluatedKey;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
throw new Error('Invalid continuationToken');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
async encode(lastEvaluatedKey) {
|
|
241
|
+
return Buffer.from(JSON.stringify(lastEvaluatedKey)).toString('base64');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.GenericDAO = GenericDAO;
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFzZS1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQW9EO0FBQ3BELDZDQU8wQjtBQU1iLFFBQUEsUUFBUSxHQUFHLElBQUksMEJBQVEsQ0FBQztJQUNqQyxXQUFXLEVBQUUsRUFBRTtDQUNsQixDQUFRLENBQUE7QUFDSSxRQUFBLE1BQU0sR0FBRyxJQUFJLG1CQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFM0QsTUFBYSxVQUFVO0lBQ25CLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHO1FBQ3pDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUM3QyxJQUFJLFdBQVcsR0FBUSxFQUFFLENBQUE7UUFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTtZQUNqQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUN0QyxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUMvQyxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNaLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxD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SjtBQXJRRCxnQ0FxUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbW9EQiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XG5pbXBvcnQge1xuICAgIERhdGFNYXBwZXIsXG4gICAgUGFyYWxsZWxTY2FuT3B0aW9ucyxcbiAgICBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zLFxuICAgIFF1ZXJ5T3B0aW9ucyxcbiAgICBSZWFkQ29uc2lzdGVuY3ksXG4gICAgU2Nhbk9wdGlvbnNcbn0gZnJvbSAnQG5vdmEtb2RtL21hcHBlcic7XG5pbXBvcnQgeyBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3IgfSBmcm9tICdAbm92YS1vZG0vbWFyc2hhbGxlcic7XG5pbXBvcnQgeyBDb25kaXRpb25FeHByZXNzaW9uLCBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIH0gZnJvbSAnQG5vdmEtb2RtL2V4cHJlc3Npb25zJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS1tb2RlbCc7XG5cblxuZXhwb3J0IGNvbnN0IGR5bmFtb0RCID0gbmV3IER5bmFtb0RCKHtcbiAgICBtYXhBdHRlbXB0czogMTBcbn0pIGFzIGFueVxuZXhwb3J0IGNvbnN0IG1hcHBlciA9IG5ldyBEYXRhTWFwcGVyKHsgY2xpZW50OiBkeW5hbW9EQiB9KTtcblxuZXhwb3J0IGNsYXNzIEdlbmVyaWNEQU88VCBleHRlbmRzIEJhc2VNb2RlbD4ge1xuICAgIGFzeW5jIGJhdGNoVXBkYXRlKGl0ZW1zOiBUW10sIGJhdGNoU2l6ZSA9IDEwMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gMCwgdG90YWxUb1VwZGF0ZSA9IGl0ZW1zLmxlbmd0aFxuICAgICAgICBsZXQgdXBkYXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHByb21pc2VzID0gYmF0Y2gubWFwKGl0ZW0gPT4gdGhpcy51cGRhdGUoaXRlbSkpXG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcylcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09IFwiZnVsZmlsbGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyArPSAxXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1zLnB1c2gocmVzdWx0LnZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtzdWNjZXNzfS8ke3RvdGFsVG9VcGRhdGV9YClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXBkYXRlSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBwYXJhbGxlbEJhdGNoUHV0KGlucHV0SXRlbXM6IFRbXSwgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBtYXhDb25jdXJyZW50U2VnbWVudHM6IG51bWJlciA9IDIwKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdChpbnB1dEl0ZW1zKVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8gaXRlbS5jcmVhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICB9KVxuICAgICAgICBsZXQgbWF4U2VnbWVudHM6IFRbXVtdW10gPSBbXVxuICAgICAgICBsZXQgcHV0SXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgYmF0Y2ggPSBpdGVtcy5zcGxpY2UoMCwgYmF0Y2hTaXplICogbWF4Q29uY3VycmVudFNlZ21lbnRzKVxuICAgICAgICAgICAgbGV0IHNlZ21lbnQ6IFRbXVtdID0gW11cbiAgICAgICAgICAgIHdoaWxlIChiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wdXNoKGJhdGNoLnNwbGljZSgwLCBiYXRjaFNpemUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF4U2VnbWVudHMucHVzaChzZWdtZW50KVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBtYXhTZWdtZW50cykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAgICAgICAgIGxldCBwcm9taXNlczogUHJvbWlzZTxUW10+W10gPSBbXVxuICAgICAgICAgICAgY29uc29sZS5sb2coYGJhdGNoIGxlbmd0aCA9ICR7c2VnbWVudC5sZW5ndGh9YClcbiAgICAgICAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2Ygc2VnbWVudCkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5iYXRjaFB1dChiYXRjaCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNlZ21lbnQgY29tcGxldGVcIilcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBwdXRJdGVtcyA9IHB1dEl0ZW1zLmNvbmNhdChyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRpbWUgZm9yIHNlZ21lbnQgcHV0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBwYXJhbGxlbCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiBwdXRJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hEZWxldGUoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoRGVsZXRlKGJhdGNoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBkZWxldGUgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgdXNlZCBvbmx5IGluIHRoZSBzY3JpcHRzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZUNvbnN0cnVjdG9yIHRoZSBtb2RlbCBjbGFzc1xuICAgICAqL1xuICAgIGFzeW5jIHBhcmFsbGVsU2Nhbih2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sIG9wdGlvbnM/OiBQYXJhbGxlbFNjYW5PcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnBhcmFsbGVsU2Nhbih2YWx1ZUNvbnN0cnVjdG9yLCA0LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAlIDEwMDAwMCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZWFkIDEwMEtcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFNjYW5PcHRpb25zIHwgUGFyYWxsZWxTY2FuV29ya2VyT3B0aW9ucyk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5zY2FuKHZhbHVlQ29uc3RydWN0b3IsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZShpdGVtOiBUKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAvLyBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnB1dChpdGVtKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKGl0ZW06IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaXRlbS51cGRhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIC8vIGl0ZW0udXBkYXRlZF91c2VyID0gYXV0aENvbnRleHQudXNlclN1YlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtYXBwZXIudXBkYXRlKGl0ZW0sIHtcbiAgICAgICAgICAgIG9uTWlzc2luZzogXCJza2lwXCJcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZShpdGVtOiBUKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBtYXBwZXIuZGVsZXRlKGl0ZW0sIHsgcmV0dXJuVmFsdWVzOiBcIkFMTF9PTERcIiB9KVxuICAgIH1cblxuICAgIGFzeW5jIGdldChpdGVtOiBULCByZWFkQ29uc2lzdGVuY3k6IFJlYWRDb25zaXN0ZW5jeSA9IFwiZXZlbnR1YWxcIik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtYXBwZXIuZ2V0KGl0ZW0sIHtcbiAgICAgICAgICAgIHJlYWRDb25zaXN0ZW5jeTogcmVhZENvbnNpc3RlbmN5XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaFB1dChpdGVtczogVFtdKTogUHJvbWlzZTxUW10+IHtcblxuICAgICAgICBsZXQgZmluYWxJdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdGltZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIGl0ZW0uY3JlYXRlZF91c2VyID0gYXV0aENvbnRleHQudXNlclN1YlxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coIFwiaXRlbTpcIiwgaXRlbXMgKVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoUHV0KGl0ZW1zKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coaXRlbSlcbiAgICAgICAgICAgIGZpbmFsSXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgYmF0Y2hEZWxldGUoaXRlbXM6IFRbXSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBkZWxldGVJdGVtczogVFtdID0gW11cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5iYXRjaERlbGV0ZShpdGVtcykpIHtcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaEdldChpdGVtczogVFtdLCByZWFkQ29uc2lzdGVuY3k6IFJlYWRDb25zaXN0ZW5jeSA9IFwiZXZlbnR1YWxcIik6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBnZXRJdGVtczogVFtdID0gW11cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5iYXRjaEdldChpdGVtcywge1xuICAgICAgICAgICAgcmVhZENvbnNpc3RlbmN5OiByZWFkQ29uc2lzdGVuY3lcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGdldEl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0SXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBwYXJhbGxlbEJhdGNoR2V0KGlucHV0SXRlbXM6IFRbXSwgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBtYXhDb25jdXJyZW50U2VnbWVudHM6IG51bWJlciA9IDIwLCByZWFkQ29uc2lzdGVuY3k/OiBSZWFkQ29uc2lzdGVuY3kpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCByZXN1bHRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoR2V0KGJhdGNoLCByZWFkQ29uc2lzdGVuY3kpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SXRlbXMgPSByZXN1bHRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGdldCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0SXRlbXNcbiAgICB9XG4gICAgYXN5bmMgcGFyYWxsZWxRdWVyeShcbiAgICAgICAgdmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LFxuICAgICAgICBrZXlDb25kaXRpb25zOiBBcnJheTxDb25kaXRpb25FeHByZXNzaW9uIHwgeyBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIHwgYW55IH0+LFxuICAgICAgICBtYXhDb25jdXJyZW50Q2FsbHM6IG51bWJlciA9IDIwLFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zLFxuXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCByZXN1bHRzOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoa2V5Q29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50Q29uZGl0aW9ucyA9IGtleUNvbmRpdGlvbnMuc3BsaWNlKDAsIG1heENvbmN1cnJlbnRDYWxscylcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSBzZWdtZW50Q29uZGl0aW9ucy5tYXAoKGtleUNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcnlQcm9taXNlcylcblxuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeVJlc3VsdCBvZiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goLi4ucXVlcnlSZXN1bHQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGN1c3RvbVF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfSxcbiAgICAgICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICAgICk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgaXRlbXM6IFRbXSA9IFtdXG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5xdWVyeSh2YWx1ZUNvbnN0cnVjdG9yLCBrZXlDb25kaXRpb25zLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBxdWVyeSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG4gICAgZGVjb2RlKGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0RXZhbHVhdGVkS2V5ID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShjb250aW51YXRpb25Ub2tlbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW5jb21pbmcgTGFzdCBFdmFsdWF0ZWQgS2V5IFwiICsgbGFzdEV2YWx1YXRlZEtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb25Ub2tlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBhc3luYyBlbmNvZGUobGFzdEV2YWx1YXRlZEtleTogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGxhc3RFdmFsdWF0ZWRLZXkpKS50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG59Il19
|
|
@@ -23,4 +23,4 @@ __decorate([
|
|
|
23
23
|
__decorate([
|
|
24
24
|
(0, annotations_1.attribute)()
|
|
25
25
|
], BaseModel.prototype, "updated_user", void 0);
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLHVEQUFrRDtBQUVsRCxNQUFhLFNBQVM7Q0FTckI7QUFURCw4QkFTQztBQVBHO0lBREMsSUFBQSx1QkFBUyxFQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDOytDQUNOO0FBRXBCO0lBREMsSUFBQSx1QkFBUyxFQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDOytDQUNOO0FBRXBCO0lBREMsSUFBQSx1QkFBUyxHQUFFOytDQUNXO0FBRXZCO0lBREMsSUFBQSx1QkFBUyxHQUFFOytDQUNXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSBcIkBub3ZhLW9kbS9hbm5vdGF0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgICBAYXR0cmlidXRlKHt0eXBlOiAnRGF0ZSd9KVxuICAgIGNyZWF0ZWRfdGltZT86IERhdGU7XG4gICAgQGF0dHJpYnV0ZSh7dHlwZTogJ0RhdGUnfSlcbiAgICB1cGRhdGVkX3RpbWU/OiBEYXRlO1xuICAgIEBhdHRyaWJ1dGUoKVxuICAgIGNyZWF0ZWRfdXNlcj86IHN0cmluZyA7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgdXBkYXRlZF91c2VyPzogc3RyaW5nIDtcbn0iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.internalUserDao = void 0;
|
|
4
|
+
const base_dao_1 = require("../base-dao");
|
|
5
|
+
const internal_user_model_1 = require("./internal-user-model");
|
|
6
|
+
class InternalUserDAO extends base_dao_1.GenericDAO {
|
|
7
|
+
async checkEmailExists(email) {
|
|
8
|
+
const Items = base_dao_1.mapper.query(internal_user_model_1.InternalUserModel, { emailId: email }, { indexName: 'emailIndex' });
|
|
9
|
+
const allItems = [];
|
|
10
|
+
for await (const item of Items) {
|
|
11
|
+
allItems.push(item);
|
|
12
|
+
}
|
|
13
|
+
if (allItems.length > 0) {
|
|
14
|
+
throw (new Error(`${email}:Email already Taken`));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.internalUserDao = new InternalUserDAO();
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwtdXNlci9pbnRlcm5hbC11c2VyLWRhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBaUQ7QUFDakQsK0RBQTBEO0FBRzFELE1BQU0sZUFBZ0IsU0FBUSxxQkFBNkI7SUFFdkQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDaEMsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxLQUFLLENBQUMsdUNBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtRQUM5RixNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBRXpDLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBRUwsQ0FBQztDQUNKO0FBRVksUUFBQSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdlbmVyaWNEQU8sIG1hcHBlciB9IGZyb20gXCIuLi9iYXNlLWRhb1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxVc2VyTW9kZWwgfSBmcm9tIFwiLi9pbnRlcm5hbC11c2VyLW1vZGVsXCI7XG5cblxuY2xhc3MgSW50ZXJuYWxVc2VyREFPIGV4dGVuZHMgR2VuZXJpY0RBTzxJbnRlcm5hbFVzZXJNb2RlbD4ge1xuXG4gICAgYXN5bmMgY2hlY2tFbWFpbEV4aXN0cyhlbWFpbDogU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IEl0ZW1zID0gbWFwcGVyLnF1ZXJ5KEludGVybmFsVXNlck1vZGVsLCB7IGVtYWlsSWQ6IGVtYWlsIH0sIHsgaW5kZXhOYW1lOiAnZW1haWxJbmRleCcgfSlcbiAgICAgICAgY29uc3QgYWxsSXRlbXM6IEludGVybmFsVXNlck1vZGVsW10gPSBbXTtcblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgSXRlbXMpIHtcbiAgICAgICAgICAgIGFsbEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihgJHtlbWFpbH06RW1haWwgYWxyZWFkeSBUYWtlbmApKTtcbiAgICAgICAgfVxuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaW50ZXJuYWxVc2VyRGFvID0gbmV3IEludGVybmFsVXNlckRBTygpOyJdfQ==
|
|
@@ -41,4 +41,4 @@ __decorate([
|
|
|
41
41
|
exports.InternalUserModel = InternalUserModel = __decorate([
|
|
42
42
|
(0, annotations_1.table)("InternalUserTable")
|
|
43
43
|
], InternalUserModel);
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC11c2VyL2ludGVybmFsLXVzZXItbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsdURBQWtFO0FBQ2xFLDhDQUEwQztBQUduQyxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLHNCQUFTO0NBcUIvQyxDQUFBO0FBckJZLDhDQUFpQjtBQUUxQjtJQURDLElBQUEscUJBQU8sRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztpREFDYjtBQUVmO0lBREMsSUFBQSx1QkFBUyxHQUFFOytDQUNFO0FBRWQ7SUFEQyxJQUFBLHVCQUFTLEdBQUU7cURBQ1E7QUFFcEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7bURBQ007QUFFbEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7c0RBQ1E7QUFNcEI7SUFMQyxJQUFBLHVCQUFTLEVBQ047UUFDSSxzQkFBc0IsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUTtLQUNuRSxDQUNKO2tEQUNnQjtBQUVqQjtJQURDLElBQUEsdUJBQVMsR0FBRTs4Q0FDQztBQUViO0lBREMsSUFBQSx1QkFBUyxHQUFFO2lEQUNJOzRCQXBCUCxpQkFBaUI7SUFEN0IsSUFBQSxtQkFBSyxFQUFDLG1CQUFtQixDQUFDO0dBQ2QsaUJBQWlCLENBcUI3QiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgYXR0cmlidXRlLCBoYXNoS2V5LCB0YWJsZSB9IGZyb20gXCJAbm92YS1vZG0vYW5ub3RhdGlvbnNcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9iYXNlLW1vZGVsXCI7XG5cbkB0YWJsZShcIkludGVybmFsVXNlclRhYmxlXCIpXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxVc2VyTW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAgIEBoYXNoS2V5KHsgdHlwZTogJ1N0cmluZycgfSlcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBAYXR0cmlidXRlKClcbiAgICByb2xlPzogc3RyaW5nO1xuICAgIEBhdHRyaWJ1dGUoKVxuICAgIGRlcGFydG1lbnQ/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgdXNlck5hbWU/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgICBAYXR0cmlidXRlKFxuICAgICAgICB7XG4gICAgICAgICAgICBpbmRleEtleUNvbmZpZ3VyYXRpb25zOiB7IFwiZW1haWxJbmRleFwiOiBcIkhBU0hcIiB9LCB0eXBlOiAnU3RyaW5nJ1xuICAgICAgICB9XG4gICAgKVxuICAgIGVtYWlsSWQ/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgZG9iPzogc3RyaW5nO1xuICAgIEBhdHRyaWJ1dGUoKVxuICAgIGdlbmRlcj86IHN0cmluZztcbn0iXX0=
|
package/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
1
|
+
export { InternalUserModel } from './dist/internal-user/internal-user-model';
|
|
2
|
+
export { internalUserDao } from './dist/internal-user/internal-user-dao';
|
|
3
|
+
export { GenericDAO } from './dist/base-dao';
|
|
4
|
+
export { BaseModel } from './dist/base-model';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cmp-aws-database",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"bin": {
|
|
5
5
|
"craft-my-plate-database": "bin/craft-my-plate-database.js"
|
|
6
6
|
},
|
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
"keywords": [
|
|
39
39
|
"npm"
|
|
40
40
|
],
|
|
41
|
+
"files": [
|
|
42
|
+
"dist/",
|
|
43
|
+
"index.js",
|
|
44
|
+
"README.md"
|
|
45
|
+
],
|
|
41
46
|
"author": "Suraj Patel",
|
|
42
47
|
"license": "Apache-2.0",
|
|
43
48
|
"bugs": {
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const cdk = require("aws-cdk-lib");
|
|
5
|
-
const internal_user_db_stack_1 = require("../lib/oms/internal-user-db-stack");
|
|
6
|
-
const app = new cdk.App();
|
|
7
|
-
new internal_user_db_stack_1.InternalUserDbStack(app, 'InternalUserDbStack', {});
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JhZnQtbXktcGxhdGUtZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmFmdC1teS1wbGF0ZS1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtQ0FBbUM7QUFDbkMsOEVBQXdFO0FBRXhFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRTFCLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEludGVybmFsVXNlckRiU3RhY2sgfSBmcm9tICcuLi9saWIvb21zL2ludGVybmFsLXVzZXItZGItc3RhY2snO1xuXG5jb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuXG5uZXcgSW50ZXJuYWxVc2VyRGJTdGFjayhhcHAsICdJbnRlcm5hbFVzZXJEYlN0YWNrJywge30pXG4iXX0=
|
package/cdk.json
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"app": "npx ts-node --prefer-ts-exts bin/craft-my-plate-database.ts",
|
|
3
|
-
"watch": {
|
|
4
|
-
"include": [
|
|
5
|
-
"**"
|
|
6
|
-
],
|
|
7
|
-
"exclude": [
|
|
8
|
-
"README.md",
|
|
9
|
-
"cdk*.json",
|
|
10
|
-
"**/*.d.ts",
|
|
11
|
-
"**/*.js",
|
|
12
|
-
"tsconfig.json",
|
|
13
|
-
"package*.json",
|
|
14
|
-
"yarn.lock",
|
|
15
|
-
"node_modules",
|
|
16
|
-
"test"
|
|
17
|
-
]
|
|
18
|
-
},
|
|
19
|
-
"context": {
|
|
20
|
-
"@aws-cdk/aws-lambda:recognizeLayerVersion": true,
|
|
21
|
-
"@aws-cdk/core:checkSecretUsage": true,
|
|
22
|
-
"@aws-cdk/core:target-partitions": [
|
|
23
|
-
"aws",
|
|
24
|
-
"aws-cn"
|
|
25
|
-
],
|
|
26
|
-
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
|
|
27
|
-
"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
|
|
28
|
-
"@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true,
|
|
29
|
-
"@aws-cdk/aws-iam:minimizePolicies": true,
|
|
30
|
-
"@aws-cdk/core:validateSnapshotRemovalPolicy": true,
|
|
31
|
-
"@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true,
|
|
32
|
-
"@aws-cdk/aws-s3:createDefaultLoggingPolicy": true,
|
|
33
|
-
"@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true,
|
|
34
|
-
"@aws-cdk/aws-apigateway:disableCloudWatchRole": true,
|
|
35
|
-
"@aws-cdk/core:enablePartitionLiterals": true,
|
|
36
|
-
"@aws-cdk/aws-events:eventsTargetQueueSameAccount": true,
|
|
37
|
-
"@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true,
|
|
38
|
-
"@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true,
|
|
39
|
-
"@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true,
|
|
40
|
-
"@aws-cdk/aws-route53-patters:useCertificate": true,
|
|
41
|
-
"@aws-cdk/customresources:installLatestAwsSdkDefault": false,
|
|
42
|
-
"@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true,
|
|
43
|
-
"@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true,
|
|
44
|
-
"@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true,
|
|
45
|
-
"@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true,
|
|
46
|
-
"@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true,
|
|
47
|
-
"@aws-cdk/aws-redshift:columnId": true,
|
|
48
|
-
"@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true,
|
|
49
|
-
"@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true,
|
|
50
|
-
"@aws-cdk/aws-apigateway:requestValidatorUniqueId": true,
|
|
51
|
-
"@aws-cdk/aws-kms:aliasNameRef": true,
|
|
52
|
-
"@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true,
|
|
53
|
-
"@aws-cdk/core:includePrefixInUniqueNameGeneration": true,
|
|
54
|
-
"@aws-cdk/aws-efs:denyAnonymousAccess": true,
|
|
55
|
-
"@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true,
|
|
56
|
-
"@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true,
|
|
57
|
-
"@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true,
|
|
58
|
-
"@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true,
|
|
59
|
-
"@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true,
|
|
60
|
-
"@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true,
|
|
61
|
-
"@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true,
|
|
62
|
-
"@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true,
|
|
63
|
-
"@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true,
|
|
64
|
-
"@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true,
|
|
65
|
-
"@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true,
|
|
66
|
-
"@aws-cdk/aws-eks:nodegroupNameAttribute": true,
|
|
67
|
-
"@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true,
|
|
68
|
-
"@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true,
|
|
69
|
-
"@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false,
|
|
70
|
-
"@aws-cdk/aws-s3:keepNotificationInImportedBucket": false,
|
|
71
|
-
"@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false,
|
|
72
|
-
"@aws-cdk/aws-ecs:disableEcsImdsBlocking": true,
|
|
73
|
-
"@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true,
|
|
74
|
-
"@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true,
|
|
75
|
-
"@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true,
|
|
76
|
-
"@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true,
|
|
77
|
-
"@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true,
|
|
78
|
-
"@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true,
|
|
79
|
-
"@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true,
|
|
80
|
-
"@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true,
|
|
81
|
-
"@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true,
|
|
82
|
-
"@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true,
|
|
83
|
-
"@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true
|
|
84
|
-
}
|
|
85
|
-
}
|
package/jest.config.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Stack, StackProps } from "aws-cdk-lib";
|
|
2
|
-
import { Table } from "aws-cdk-lib/aws-dynamodb";
|
|
3
|
-
import { Construct } from "constructs";
|
|
4
|
-
export declare class InternalUserDbStack extends Stack {
|
|
5
|
-
internalUserTable: Table;
|
|
6
|
-
constructor(scope: Construct, id: string, props?: StackProps);
|
|
7
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InternalUserDbStack = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
6
|
-
class InternalUserDbStack extends aws_cdk_lib_1.Stack {
|
|
7
|
-
constructor(scope, id, props) {
|
|
8
|
-
super(scope, id, props);
|
|
9
|
-
// New Sales and Oprational Team User Table Defined
|
|
10
|
-
this.internalUserTable = new aws_dynamodb_1.Table(this, "InternalUserTable", {
|
|
11
|
-
tableName: "InternalUserTable",
|
|
12
|
-
billingMode: aws_dynamodb_1.BillingMode.PAY_PER_REQUEST,
|
|
13
|
-
partitionKey: {
|
|
14
|
-
name: "userId",
|
|
15
|
-
type: aws_dynamodb_1.AttributeType.STRING
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
this.internalUserTable.addGlobalSecondaryIndex({
|
|
19
|
-
indexName: 'emailIndex',
|
|
20
|
-
partitionKey: { name: 'emailId', type: aws_dynamodb_1.AttributeType.STRING },
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
exports.InternalUserDbStack = InternalUserDbStack;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1kYi1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVybmFsLXVzZXItZGItc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWdEO0FBQ2hELDJEQUE2RTtBQUc3RSxNQUFhLG1CQUFvQixTQUFRLG1CQUFLO0lBRzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDeEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLG9CQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzFELFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtZQUN4QyxZQUFZLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTthQUU3QjtTQUNKLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxTQUFTLEVBQUUsWUFBWTtZQUN2QixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtTQUNoRSxDQUFDLENBQUE7SUFFTixDQUFDO0NBQ0o7QUF2QkQsa0RBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmdNb2RlLCBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFVzZXJEYlN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAgIGludGVybmFsVXNlclRhYmxlOiBUYWJsZTtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgICAgICAvLyBOZXcgU2FsZXMgYW5kIE9wcmF0aW9uYWwgVGVhbSBVc2VyIFRhYmxlIERlZmluZWRcbiAgICAgICAgdGhpcy5pbnRlcm5hbFVzZXJUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBcIkludGVybmFsVXNlclRhYmxlXCIsIHtcbiAgICAgICAgICAgIHRhYmxlTmFtZTogXCJJbnRlcm5hbFVzZXJUYWJsZVwiLFxuICAgICAgICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgICAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidXNlcklkXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkdcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxVc2VyVGFibGUuYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgoe1xuICAgICAgICAgICAgaW5kZXhOYW1lOiAnZW1haWxJbmRleCcsXG4gICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ2VtYWlsSWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICB9KVxuXG4gICAgfVxufSJdfQ==
|
package/src/base-dao.js
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GenericDAO = exports.mapper = exports.dynamoDB = void 0;
|
|
4
|
-
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
-
const mapper_1 = require("@nova-odm/mapper");
|
|
6
|
-
exports.dynamoDB = new client_dynamodb_1.DynamoDB({
|
|
7
|
-
maxAttempts: 10
|
|
8
|
-
});
|
|
9
|
-
exports.mapper = new mapper_1.DataMapper({ client: exports.dynamoDB });
|
|
10
|
-
class GenericDAO {
|
|
11
|
-
async batchUpdate(items, batchSize = 100) {
|
|
12
|
-
let success = 0, totalToUpdate = items.length;
|
|
13
|
-
let updateItems = [];
|
|
14
|
-
while (items.length > 0) {
|
|
15
|
-
let promises = [];
|
|
16
|
-
let batch = items.splice(0, batchSize);
|
|
17
|
-
promises = batch.map(item => this.update(item));
|
|
18
|
-
let results = await Promise.allSettled(promises);
|
|
19
|
-
results.forEach(result => {
|
|
20
|
-
if (result.status == "fulfilled") {
|
|
21
|
-
success += 1;
|
|
22
|
-
updateItems.push(result.value);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
console.log(`${success}/${totalToUpdate}`);
|
|
26
|
-
}
|
|
27
|
-
return updateItems;
|
|
28
|
-
}
|
|
29
|
-
async parallelBatchPut(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
|
|
30
|
-
let startTime = Date.now();
|
|
31
|
-
let items = [];
|
|
32
|
-
items = items.concat(inputItems);
|
|
33
|
-
items = items.map(item => {
|
|
34
|
-
item.created_time = new Date();
|
|
35
|
-
// item.created_user = authContext.userSub
|
|
36
|
-
return item;
|
|
37
|
-
});
|
|
38
|
-
let maxSegments = [];
|
|
39
|
-
let putItems = [];
|
|
40
|
-
while (items.length > 0) {
|
|
41
|
-
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
42
|
-
let segment = [];
|
|
43
|
-
while (batch.length > 0) {
|
|
44
|
-
segment.push(batch.splice(0, batchSize));
|
|
45
|
-
}
|
|
46
|
-
maxSegments.push(segment);
|
|
47
|
-
}
|
|
48
|
-
for (const segment of maxSegments) {
|
|
49
|
-
let startTime = Date.now();
|
|
50
|
-
let promises = [];
|
|
51
|
-
console.log(`batch length = ${segment.length}`);
|
|
52
|
-
for (const batch of segment) {
|
|
53
|
-
promises.push(this.batchPut(batch));
|
|
54
|
-
}
|
|
55
|
-
let result = await Promise.all(promises);
|
|
56
|
-
console.log("segment complete");
|
|
57
|
-
result.forEach((res) => {
|
|
58
|
-
putItems = putItems.concat(res);
|
|
59
|
-
});
|
|
60
|
-
console.log(`time for segment put ${Date.now() - startTime}`);
|
|
61
|
-
}
|
|
62
|
-
console.log(`total time for complete parallel put ${Date.now() - startTime}`);
|
|
63
|
-
return putItems;
|
|
64
|
-
}
|
|
65
|
-
async parallelBatchDelete(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
|
|
66
|
-
let startTime = Date.now();
|
|
67
|
-
let items = [];
|
|
68
|
-
items = items.concat(inputItems);
|
|
69
|
-
let maxSegments = [];
|
|
70
|
-
let putItems = [];
|
|
71
|
-
while (items.length > 0) {
|
|
72
|
-
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
73
|
-
let segment = [];
|
|
74
|
-
while (batch.length > 0) {
|
|
75
|
-
segment.push(batch.splice(0, batchSize));
|
|
76
|
-
}
|
|
77
|
-
maxSegments.push(segment);
|
|
78
|
-
}
|
|
79
|
-
for (const segment of maxSegments) {
|
|
80
|
-
let startTime = Date.now();
|
|
81
|
-
let promises = [];
|
|
82
|
-
console.log(`batch length = ${segment.length}`);
|
|
83
|
-
for (const batch of segment) {
|
|
84
|
-
promises.push(this.batchDelete(batch));
|
|
85
|
-
}
|
|
86
|
-
let result = await Promise.all(promises);
|
|
87
|
-
console.log("segment complete");
|
|
88
|
-
result.forEach((res) => {
|
|
89
|
-
putItems = putItems.concat(res);
|
|
90
|
-
});
|
|
91
|
-
console.log(`time for segment delete ${Date.now() - startTime}`);
|
|
92
|
-
}
|
|
93
|
-
console.log(`total time for complete parallel delete ${Date.now() - startTime}`);
|
|
94
|
-
return putItems;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* This function has to be used only in the scripts.
|
|
98
|
-
*
|
|
99
|
-
* @param valueConstructor the model class
|
|
100
|
-
*/
|
|
101
|
-
async parallelScan(valueConstructor, options) {
|
|
102
|
-
let items = [];
|
|
103
|
-
for await (const item of exports.mapper.parallelScan(valueConstructor, 4, options)) {
|
|
104
|
-
items.push(item);
|
|
105
|
-
if (items.length % 100000 == 0) {
|
|
106
|
-
console.log("read 100K");
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return items;
|
|
110
|
-
}
|
|
111
|
-
async scan(valueConstructor, options) {
|
|
112
|
-
let items = [];
|
|
113
|
-
for await (const item of exports.mapper.scan(valueConstructor, options)) {
|
|
114
|
-
items.push(item);
|
|
115
|
-
}
|
|
116
|
-
return items;
|
|
117
|
-
}
|
|
118
|
-
async save(item) {
|
|
119
|
-
item.created_time = new Date();
|
|
120
|
-
// item.created_user = authContext.userSub
|
|
121
|
-
const res = await exports.mapper.put(item);
|
|
122
|
-
return res;
|
|
123
|
-
}
|
|
124
|
-
async update(item) {
|
|
125
|
-
item.updated_time = new Date();
|
|
126
|
-
// item.updated_user = authContext.userSub
|
|
127
|
-
const res = await exports.mapper.update(item, {
|
|
128
|
-
onMissing: "skip"
|
|
129
|
-
});
|
|
130
|
-
return res;
|
|
131
|
-
}
|
|
132
|
-
async delete(item) {
|
|
133
|
-
return await exports.mapper.delete(item, { returnValues: "ALL_OLD" });
|
|
134
|
-
}
|
|
135
|
-
async get(item, readConsistency = "eventual") {
|
|
136
|
-
const res = await exports.mapper.get(item, {
|
|
137
|
-
readConsistency: readConsistency
|
|
138
|
-
});
|
|
139
|
-
return res;
|
|
140
|
-
}
|
|
141
|
-
async batchPut(items) {
|
|
142
|
-
let finalItems = [];
|
|
143
|
-
items = items.map(item => {
|
|
144
|
-
item.created_time = new Date();
|
|
145
|
-
// item.created_user = authContext.userSub
|
|
146
|
-
return item;
|
|
147
|
-
});
|
|
148
|
-
// console.log( "item:", items )
|
|
149
|
-
for await (const item of exports.mapper.batchPut(items)) {
|
|
150
|
-
console.log(item);
|
|
151
|
-
finalItems.push(item);
|
|
152
|
-
}
|
|
153
|
-
return finalItems;
|
|
154
|
-
}
|
|
155
|
-
async batchDelete(items) {
|
|
156
|
-
let deleteItems = [];
|
|
157
|
-
for await (const item of exports.mapper.batchDelete(items)) {
|
|
158
|
-
deleteItems.push(item);
|
|
159
|
-
}
|
|
160
|
-
return deleteItems;
|
|
161
|
-
}
|
|
162
|
-
async batchGet(items, readConsistency = "eventual") {
|
|
163
|
-
let getItems = [];
|
|
164
|
-
for await (const item of exports.mapper.batchGet(items, {
|
|
165
|
-
readConsistency: readConsistency
|
|
166
|
-
})) {
|
|
167
|
-
getItems.push(item);
|
|
168
|
-
}
|
|
169
|
-
return getItems;
|
|
170
|
-
}
|
|
171
|
-
async parallelBatchGet(inputItems, batchSize = 1000, maxConcurrentSegments = 20, readConsistency) {
|
|
172
|
-
let startTime = Date.now();
|
|
173
|
-
let items = [];
|
|
174
|
-
items = items.concat(inputItems);
|
|
175
|
-
let maxSegments = [];
|
|
176
|
-
let resultItems = [];
|
|
177
|
-
while (items.length > 0) {
|
|
178
|
-
let batch = items.splice(0, batchSize * maxConcurrentSegments);
|
|
179
|
-
let segment = [];
|
|
180
|
-
while (batch.length > 0) {
|
|
181
|
-
segment.push(batch.splice(0, batchSize));
|
|
182
|
-
}
|
|
183
|
-
maxSegments.push(segment);
|
|
184
|
-
}
|
|
185
|
-
for (const segment of maxSegments) {
|
|
186
|
-
let startTime = Date.now();
|
|
187
|
-
let promises = [];
|
|
188
|
-
console.log(`batch length = ${segment.length}`);
|
|
189
|
-
for (const batch of segment) {
|
|
190
|
-
promises.push(this.batchGet(batch, readConsistency));
|
|
191
|
-
}
|
|
192
|
-
let result = await Promise.all(promises);
|
|
193
|
-
console.log("segment complete");
|
|
194
|
-
result.forEach((res) => {
|
|
195
|
-
resultItems = resultItems.concat(res);
|
|
196
|
-
});
|
|
197
|
-
console.log(`time for segment get ${Date.now() - startTime}`);
|
|
198
|
-
}
|
|
199
|
-
console.log(`total time for complete parallel get ${Date.now() - startTime}`);
|
|
200
|
-
return resultItems;
|
|
201
|
-
}
|
|
202
|
-
async parallelQuery(valueConstructor, keyConditions, maxConcurrentCalls = 20, options) {
|
|
203
|
-
const startTime = Date.now();
|
|
204
|
-
const results = [];
|
|
205
|
-
while (keyConditions.length > 0) {
|
|
206
|
-
const segmentConditions = keyConditions.splice(0, maxConcurrentCalls);
|
|
207
|
-
const queryPromises = segmentConditions.map((keyCondition) => {
|
|
208
|
-
return this.customQuery(valueConstructor, keyCondition, options);
|
|
209
|
-
});
|
|
210
|
-
const queryResults = await Promise.all(queryPromises);
|
|
211
|
-
for (const queryResult of queryResults) {
|
|
212
|
-
results.push(...queryResult);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
console.log(`total time for complete parallel query ${Date.now() - startTime}`);
|
|
216
|
-
return results;
|
|
217
|
-
}
|
|
218
|
-
async customQuery(valueConstructor, keyConditions, options) {
|
|
219
|
-
const startTime = Date.now();
|
|
220
|
-
const items = [];
|
|
221
|
-
for await (const item of exports.mapper.query(valueConstructor, keyConditions, options)) {
|
|
222
|
-
items.push(item);
|
|
223
|
-
}
|
|
224
|
-
console.log(`total time for complete query ${Date.now() - startTime}`);
|
|
225
|
-
return items;
|
|
226
|
-
}
|
|
227
|
-
decode(continuationToken) {
|
|
228
|
-
if (continuationToken) {
|
|
229
|
-
try {
|
|
230
|
-
let lastEvaluatedKey = JSON.parse(Buffer.from(continuationToken, 'base64').toString('utf8'));
|
|
231
|
-
console.log("Incoming Last Evaluated Key " + lastEvaluatedKey);
|
|
232
|
-
return lastEvaluatedKey;
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
throw new Error('Invalid continuationToken');
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return undefined;
|
|
239
|
-
}
|
|
240
|
-
async encode(lastEvaluatedKey) {
|
|
241
|
-
return Buffer.from(JSON.stringify(lastEvaluatedKey)).toString('base64');
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
exports.GenericDAO = GenericDAO;
|
|
245
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJiYXNlLWRhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBb0Q7QUFDcEQsNkNBTzBCO0FBTWIsUUFBQSxRQUFRLEdBQUcsSUFBSSwwQkFBUSxDQUFDO0lBQ2pDLFdBQVcsRUFBRSxFQUFFO0NBQ2xCLENBQVEsQ0FBQTtBQUNJLFFBQUEsTUFBTSxHQUFHLElBQUksbUJBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBUSxFQUFFLENBQUMsQ0FBQztBQUUzRCxNQUFhLFVBQVU7SUFDbkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFVLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDekMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQy9DLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoRCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQy9CLE9BQU8sSUFBSSxDQUFDLENBQUE7b0JBQ1osV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JB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LGdDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtb0RCIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7XG4gICAgRGF0YU1hcHBlcixcbiAgICBQYXJhbGxlbFNjYW5PcHRpb25zLFxuICAgIFBhcmFsbGVsU2Nhbldvcmtlck9wdGlvbnMsXG4gICAgUXVlcnlPcHRpb25zLFxuICAgIFJlYWRDb25zaXN0ZW5jeSxcbiAgICBTY2FuT3B0aW9uc1xufSBmcm9tICdAbm92YS1vZG0vbWFwcGVyJztcbmltcG9ydCB7IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvciB9IGZyb20gJ0Bub3ZhLW9kbS9tYXJzaGFsbGVyJztcbmltcG9ydCB7IENvbmRpdGlvbkV4cHJlc3Npb24sIENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfSBmcm9tICdAbm92YS1vZG0vZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSAnLi9iYXNlLW1vZGVsJztcblxuXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBuZXcgRHluYW1vREIoe1xuICAgIG1heEF0dGVtcHRzOiAxMFxufSkgYXMgYW55XG5leHBvcnQgY29uc3QgbWFwcGVyID0gbmV3IERhdGFNYXBwZXIoeyBjbGllbnQ6IGR5bmFtb0RCIH0pO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSAwLCB0b3RhbFRvVXBkYXRlID0gaXRlbXMubGVuZ3RoXG4gICAgICAgIGxldCB1cGRhdGVJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgICAgICBsZXQgYmF0Y2ggPSBpdGVtcy5zcGxpY2UoMCwgYmF0Y2hTaXplKVxuICAgICAgICAgICAgcHJvbWlzZXMgPSBiYXRjaC5tYXAoaXRlbSA9PiB0aGlzLnVwZGF0ZShpdGVtKSlcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKVxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzICs9IDFcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbXMucHVzaChyZXN1bHQudmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3N1Y2Nlc3N9LyR7dG90YWxUb1VwZGF0ZX1gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cGRhdGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hQdXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICAvLyBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIC8vIGl0ZW0uY3JlYXRlZF91c2VyID0gYXV0aENvbnRleHQudXNlclN1YlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtYXBwZXIucHV0KGl0ZW0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGUoaXRlbTogVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBpdGVtLnVwZGF0ZWRfdGltZSA9IG5ldyBEYXRlKClcbiAgICAgICAgLy8gaXRlbS51cGRhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1hcHBlci51cGRhdGUoaXRlbSwge1xuICAgICAgICAgICAgb25NaXNzaW5nOiBcInNraXBcIlxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKGl0ZW06IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1hcHBlci5kZWxldGUoaXRlbSwgeyByZXR1cm5WYWx1ZXM6IFwiQUxMX09MRFwiIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0KGl0ZW06IFQsIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1hcHBlci5nZXQoaXRlbSwge1xuICAgICAgICAgICAgcmVhZENvbnNpc3RlbmN5OiByZWFkQ29uc2lzdGVuY3lcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoUHV0KGl0ZW1zOiBUW10pOiBQcm9taXNlPFRbXT4ge1xuXG4gICAgICAgIGxldCBmaW5hbEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8gaXRlbS5jcmVhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyggXCJpdGVtOlwiLCBpdGVtcyApXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hQdXQoaXRlbXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgZmluYWxJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaERlbGV0ZShpdGVtczogVFtdKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGRlbGV0ZUl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoRGVsZXRlKGl0ZW1zKSkge1xuICAgICAgICAgICAgZGVsZXRlSXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoR2V0KGl0ZW1zOiBUW10sIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGdldEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoR2V0KGl0ZW1zLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgZ2V0SXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hHZXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjAsIHJlYWRDb25zaXN0ZW5jeT86IFJlYWRDb25zaXN0ZW5jeSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHJlc3VsdEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hHZXQoYmF0Y2gsIHJlYWRDb25zaXN0ZW5jeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNlZ21lbnQgY29tcGxldGVcIilcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRJdGVtcyA9IHJlc3VsdEl0ZW1zLmNvbmNhdChyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRpbWUgZm9yIHNlZ21lbnQgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBwYXJhbGxlbCBnZXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRJdGVtc1xuICAgIH1cbiAgICBhc3luYyBwYXJhbGxlbFF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IEFycmF5PENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfT4sXG4gICAgICAgIG1heENvbmN1cnJlbnRDYWxsczogbnVtYmVyID0gMjAsXG4gICAgICAgIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMsXG5cbiAgICApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChrZXlDb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRDb25kaXRpb25zID0ga2V5Q29uZGl0aW9ucy5zcGxpY2UoMCwgbWF4Q29uY3VycmVudENhbGxzKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlQcm9taXNlcyA9IHNlZ21lbnRDb25kaXRpb25zLm1hcCgoa2V5Q29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlcnkodmFsdWVDb25zdHJ1Y3Rvciwga2V5Q29uZGl0aW9uLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyeVByb21pc2VzKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UmVzdWx0IG9mIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5xdWVyeVJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgcXVlcnkgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgY3VzdG9tUXVlcnkoXG4gICAgICAgIHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPixcbiAgICAgICAga2V5Q29uZGl0aW9uczogQ29uZGl0aW9uRXhwcmVzc2lvbiB8IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogQ29uZGl0aW9uRXhwcmVzc2lvblByZWRpY2F0ZSB8IGFueSB9LFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBpdGVtczogVFtdID0gW11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbnMsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cbiAgICBkZWNvZGUoY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY29udGludWF0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFdmFsdWF0ZWRLZXkgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGNvbnRpbnVhdGlvblRva2VuLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJbmNvbWluZyBMYXN0IEV2YWx1YXRlZCBLZXkgXCIgKyBsYXN0RXZhbHVhdGVkS2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdEV2YWx1YXRlZEtleTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvblRva2VuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFzeW5jIGVuY29kZShsYXN0RXZhbHVhdGVkS2V5OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkobGFzdEV2YWx1YXRlZEtleSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbn0iXX0=
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.internalUserDao = void 0;
|
|
4
|
-
const base_dao_1 = require("../base-dao");
|
|
5
|
-
const internal_user_model_1 = require("./internal-user-model");
|
|
6
|
-
class InternalUserDAO extends base_dao_1.GenericDAO {
|
|
7
|
-
async checkEmailExists(email) {
|
|
8
|
-
const Items = base_dao_1.mapper.query(internal_user_model_1.InternalUserModel, { emailId: email }, { indexName: 'emailIndex' });
|
|
9
|
-
const allItems = [];
|
|
10
|
-
for await (const item of Items) {
|
|
11
|
-
allItems.push(item);
|
|
12
|
-
}
|
|
13
|
-
if (allItems.length > 0) {
|
|
14
|
-
throw (new Error(`${email}:Email already Taken`));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
exports.internalUserDao = new InternalUserDAO();
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlcm5hbC11c2VyLWRhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBaUQ7QUFDakQsK0RBQTBEO0FBRzFELE1BQU0sZUFBZ0IsU0FBUSxxQkFBNkI7SUFFdkQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDaEMsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxLQUFLLENBQUMsdUNBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtRQUM5RixNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBRXpDLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBRUwsQ0FBQztDQUNKO0FBRVksUUFBQSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdlbmVyaWNEQU8sIG1hcHBlciB9IGZyb20gXCIuLi9iYXNlLWRhb1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxVc2VyTW9kZWwgfSBmcm9tIFwiLi9pbnRlcm5hbC11c2VyLW1vZGVsXCI7XG5cblxuY2xhc3MgSW50ZXJuYWxVc2VyREFPIGV4dGVuZHMgR2VuZXJpY0RBTzxJbnRlcm5hbFVzZXJNb2RlbD4ge1xuXG4gICAgYXN5bmMgY2hlY2tFbWFpbEV4aXN0cyhlbWFpbDogU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IEl0ZW1zID0gbWFwcGVyLnF1ZXJ5KEludGVybmFsVXNlck1vZGVsLCB7IGVtYWlsSWQ6IGVtYWlsIH0sIHsgaW5kZXhOYW1lOiAnZW1haWxJbmRleCcgfSlcbiAgICAgICAgY29uc3QgYWxsSXRlbXM6IEludGVybmFsVXNlck1vZGVsW10gPSBbXTtcblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgSXRlbXMpIHtcbiAgICAgICAgICAgIGFsbEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihgJHtlbWFpbH06RW1haWwgYWxyZWFkeSBUYWtlbmApKTtcbiAgICAgICAgfVxuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaW50ZXJuYWxVc2VyRGFvID0gbmV3IEludGVybmFsVXNlckRBTygpOyJdfQ==
|
|
File without changes
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// import * as cdk from 'aws-cdk-lib';
|
|
3
|
-
// import { Template } from 'aws-cdk-lib/assertions';
|
|
4
|
-
// import * as CraftMyPlateDatabase from '../lib/craft-my-plate-database-stack';
|
|
5
|
-
// example test. To run these tests, uncomment this file along with the
|
|
6
|
-
// example resource in lib/craft-my-plate-database-stack.ts
|
|
7
|
-
test('SQS Queue Created', () => {
|
|
8
|
-
// const app = new cdk.App();
|
|
9
|
-
// // WHEN
|
|
10
|
-
// const stack = new CraftMyPlateDatabase.CraftMyPlateDatabaseStack(app, 'MyTestStack');
|
|
11
|
-
// // THEN
|
|
12
|
-
// const template = Template.fromStack(stack);
|
|
13
|
-
// template.hasResourceProperties('AWS::SQS::Queue', {
|
|
14
|
-
// VisibilityTimeout: 300
|
|
15
|
-
// });
|
|
16
|
-
});
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JhZnQtbXktcGxhdGUtZGF0YWJhc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNyYWZ0LW15LXBsYXRlLWRhdGFiYXNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNDQUFzQztBQUN0QyxxREFBcUQ7QUFDckQsZ0ZBQWdGO0FBRWhGLHVFQUF1RTtBQUN2RSwyREFBMkQ7QUFDM0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUMvQiwrQkFBK0I7SUFDL0IsY0FBYztJQUNkLDBGQUEwRjtJQUMxRixjQUFjO0lBQ2QsZ0RBQWdEO0lBRWhELHdEQUF3RDtJQUN4RCw2QkFBNkI7SUFDN0IsUUFBUTtBQUNSLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbi8vIGltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG4vLyBpbXBvcnQgKiBhcyBDcmFmdE15UGxhdGVEYXRhYmFzZSBmcm9tICcuLi9saWIvY3JhZnQtbXktcGxhdGUtZGF0YWJhc2Utc3RhY2snO1xuXG4vLyBleGFtcGxlIHRlc3QuIFRvIHJ1biB0aGVzZSB0ZXN0cywgdW5jb21tZW50IHRoaXMgZmlsZSBhbG9uZyB3aXRoIHRoZVxuLy8gZXhhbXBsZSByZXNvdXJjZSBpbiBsaWIvY3JhZnQtbXktcGxhdGUtZGF0YWJhc2Utc3RhY2sudHNcbnRlc3QoJ1NRUyBRdWV1ZSBDcmVhdGVkJywgKCkgPT4ge1xuLy8gICBjb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuLy8gICAgIC8vIFdIRU5cbi8vICAgY29uc3Qgc3RhY2sgPSBuZXcgQ3JhZnRNeVBsYXRlRGF0YWJhc2UuQ3JhZnRNeVBsYXRlRGF0YWJhc2VTdGFjayhhcHAsICdNeVRlc3RTdGFjaycpO1xuLy8gICAgIC8vIFRIRU5cbi8vICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4vLyAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlJywge1xuLy8gICAgIFZpc2liaWxpdHlUaW1lb3V0OiAzMDBcbi8vICAgfSk7XG59KTtcbiJdfQ==
|
package/tsconfig.json
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"outDir": "./dist",
|
|
4
|
-
"rootDir": "./src",
|
|
5
|
-
"esModuleInterop": true,
|
|
6
|
-
"skipLibCheck": true,
|
|
7
|
-
"target": "ES2020",
|
|
8
|
-
"module": "commonjs",
|
|
9
|
-
"lib": [
|
|
10
|
-
"es2020",
|
|
11
|
-
"dom"
|
|
12
|
-
],
|
|
13
|
-
"declaration": true,
|
|
14
|
-
"strict": true,
|
|
15
|
-
"noImplicitAny": true,
|
|
16
|
-
"strictNullChecks": true,
|
|
17
|
-
"noImplicitThis": true,
|
|
18
|
-
"alwaysStrict": true,
|
|
19
|
-
"noUnusedLocals": false,
|
|
20
|
-
"noUnusedParameters": false,
|
|
21
|
-
"noImplicitReturns": true,
|
|
22
|
-
"noFallthroughCasesInSwitch": false,
|
|
23
|
-
"inlineSourceMap": true,
|
|
24
|
-
"inlineSources": true,
|
|
25
|
-
"experimentalDecorators": true,
|
|
26
|
-
"strictPropertyInitialization": false,
|
|
27
|
-
"typeRoots": [
|
|
28
|
-
"./node_modules/@types"
|
|
29
|
-
]
|
|
30
|
-
},
|
|
31
|
-
"include": [
|
|
32
|
-
"src/**/*"
|
|
33
|
-
],
|
|
34
|
-
"exclude": [
|
|
35
|
-
"node_modules",
|
|
36
|
-
"cdk.out"
|
|
37
|
-
]
|
|
38
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|