@squiz/db-lib 1.68.0 → 1.69.0
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/CHANGELOG.md +6 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +3 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts +2 -0
- package/lib/error/InvalidDataFormatError.d.ts +5 -0
- package/lib/index.js +39 -10
- package/lib/index.js.map +4 -4
- package/package.json +1 -1
- package/src/dynamodb/AbstractDynamoDbRepository.spec.ts +44 -0
- package/src/dynamodb/AbstractDynamoDbRepository.ts +29 -2
- package/src/error/InvalidDataFormatError.ts +8 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -26,6 +26,7 @@ export type KeysFormat = Record<keyof TableKeys | keyof TableIndexes, string>;
|
|
|
26
26
|
export type EntityDefinition = {
|
|
27
27
|
keys: TableKeys;
|
|
28
28
|
indexes: TableIndexes;
|
|
29
|
+
fieldsAsJsonString: string[];
|
|
29
30
|
};
|
|
30
31
|
export declare abstract class AbstractDynamoDbRepository<SHAPE extends object, DATA_CLASS extends SHAPE> implements Reader<SHAPE>, Writer<SHAPE> {
|
|
31
32
|
protected tableName: string;
|
|
@@ -39,6 +40,7 @@ export declare abstract class AbstractDynamoDbRepository<SHAPE extends object, D
|
|
|
39
40
|
protected keys: TableKeys;
|
|
40
41
|
protected indexes: TableIndexes;
|
|
41
42
|
protected keysFormat: KeysFormat;
|
|
43
|
+
protected fieldsAsJsonString: string[];
|
|
42
44
|
constructor(tableName: string, dbManager: DynamoDbManager<Repositories>, entityName: string, entityDefinition: EntityDefinition, classRef: {
|
|
43
45
|
new (data?: Record<string, unknown>): DATA_CLASS;
|
|
44
46
|
});
|
|
@@ -99,6 +101,7 @@ export declare abstract class AbstractDynamoDbRepository<SHAPE extends object, D
|
|
|
99
101
|
* @returns
|
|
100
102
|
*/
|
|
101
103
|
protected hydrateItem(item: Record<string, unknown>): DATA_CLASS;
|
|
104
|
+
protected convertSelectedValuesToJsonString(item: Record<string, unknown>): void;
|
|
102
105
|
/**
|
|
103
106
|
* Evaluate the partition key value from the partial item
|
|
104
107
|
* @param item
|
|
@@ -6,12 +6,14 @@ interface ITestItem {
|
|
|
6
6
|
age: number;
|
|
7
7
|
country: string;
|
|
8
8
|
data?: object;
|
|
9
|
+
data2?: object;
|
|
9
10
|
}
|
|
10
11
|
declare class TestItem implements ITestItem {
|
|
11
12
|
name: string;
|
|
12
13
|
age: number;
|
|
13
14
|
country: string;
|
|
14
15
|
data: object;
|
|
16
|
+
data2?: object;
|
|
15
17
|
constructor(data?: Partial<ITestItem>);
|
|
16
18
|
}
|
|
17
19
|
export type TestRepositories = {
|
package/lib/index.js
CHANGED
|
@@ -328,12 +328,12 @@ var require_InternalServerError = __commonJS({
|
|
|
328
328
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
329
329
|
exports.InternalServerError = void 0;
|
|
330
330
|
var ErrorWithHttpStatusCode_1 = require_ErrorWithHttpStatusCode();
|
|
331
|
-
var
|
|
331
|
+
var InternalServerError5 = class extends ErrorWithHttpStatusCode_1.ErrorWithHttpStatusCode {
|
|
332
332
|
constructor(message) {
|
|
333
333
|
super(500, message);
|
|
334
334
|
}
|
|
335
335
|
};
|
|
336
|
-
exports.InternalServerError =
|
|
336
|
+
exports.InternalServerError = InternalServerError5;
|
|
337
337
|
}
|
|
338
338
|
});
|
|
339
339
|
|
|
@@ -56131,6 +56131,15 @@ var DynamoDbManager = class {
|
|
|
56131
56131
|
}
|
|
56132
56132
|
};
|
|
56133
56133
|
|
|
56134
|
+
// src/error/InvalidDataFormatError.ts
|
|
56135
|
+
var import_dx_common_lib3 = __toESM(require_lib5());
|
|
56136
|
+
var InvalidDataFormatError = class extends import_dx_common_lib3.InternalServerError {
|
|
56137
|
+
constructor(message) {
|
|
56138
|
+
super(message);
|
|
56139
|
+
this.name = "InvalidDataFormatError";
|
|
56140
|
+
}
|
|
56141
|
+
};
|
|
56142
|
+
|
|
56134
56143
|
// src/dynamodb/AbstractDynamoDbRepository.ts
|
|
56135
56144
|
var AbstractDynamoDbRepository = class {
|
|
56136
56145
|
constructor(tableName, dbManager, entityName2, entityDefinition, classRef) {
|
|
@@ -56142,6 +56151,7 @@ var AbstractDynamoDbRepository = class {
|
|
|
56142
56151
|
this.client = dbManager.client;
|
|
56143
56152
|
this.keys = entityDefinition.keys;
|
|
56144
56153
|
this.indexes = entityDefinition.indexes;
|
|
56154
|
+
this.fieldsAsJsonString = entityDefinition.fieldsAsJsonString;
|
|
56145
56155
|
this.keysFormat = {
|
|
56146
56156
|
[this.keys.pk.attributeName]: this.keys.pk.format,
|
|
56147
56157
|
[this.keys.sk.attributeName]: this.keys.sk.format
|
|
@@ -56233,7 +56243,9 @@ var AbstractDynamoDbRepository = class {
|
|
|
56233
56243
|
if (oldValue === void 0) {
|
|
56234
56244
|
return void 0;
|
|
56235
56245
|
}
|
|
56236
|
-
|
|
56246
|
+
const value = { ...oldValue, ...newValue };
|
|
56247
|
+
this.assertValueMatchesModel(value);
|
|
56248
|
+
this.convertSelectedValuesToJsonString(newValue);
|
|
56237
56249
|
const updateExpression = [];
|
|
56238
56250
|
const expressionAttributeNames = {};
|
|
56239
56251
|
const expressionAttributeValues = {};
|
|
@@ -56259,7 +56271,7 @@ var AbstractDynamoDbRepository = class {
|
|
|
56259
56271
|
this.dbManager.addWriteTransactionItem(transaction.id, {
|
|
56260
56272
|
Update: updateCommandInput
|
|
56261
56273
|
});
|
|
56262
|
-
return new this.classRef(
|
|
56274
|
+
return new this.classRef(value);
|
|
56263
56275
|
}
|
|
56264
56276
|
let output;
|
|
56265
56277
|
try {
|
|
@@ -56296,6 +56308,7 @@ var AbstractDynamoDbRepository = class {
|
|
|
56296
56308
|
for (const modelProperty of Object.keys(value)) {
|
|
56297
56309
|
columns[modelProperty] = value[modelProperty];
|
|
56298
56310
|
}
|
|
56311
|
+
this.convertSelectedValuesToJsonString(columns);
|
|
56299
56312
|
const keyFields = {
|
|
56300
56313
|
[this.keys.pk.attributeName]: this.getPk(value),
|
|
56301
56314
|
[this.keys.sk.attributeName]: this.getSk(value)
|
|
@@ -56362,8 +56375,24 @@ var AbstractDynamoDbRepository = class {
|
|
|
56362
56375
|
* @returns
|
|
56363
56376
|
*/
|
|
56364
56377
|
hydrateItem(item) {
|
|
56378
|
+
for (const fieldName of Object.keys(item)) {
|
|
56379
|
+
if (this.fieldsAsJsonString.includes(fieldName)) {
|
|
56380
|
+
if (typeof item[fieldName] === "string") {
|
|
56381
|
+
item[fieldName] = JSON.parse(item[fieldName]);
|
|
56382
|
+
} else {
|
|
56383
|
+
throw new InvalidDataFormatError(`Field '${fieldName}' defined as JSON String has a non-string data`);
|
|
56384
|
+
}
|
|
56385
|
+
}
|
|
56386
|
+
}
|
|
56365
56387
|
return new this.classRef(item);
|
|
56366
56388
|
}
|
|
56389
|
+
convertSelectedValuesToJsonString(item) {
|
|
56390
|
+
for (const fieldName of Object.keys(item)) {
|
|
56391
|
+
if (this.fieldsAsJsonString.includes(fieldName)) {
|
|
56392
|
+
item[fieldName] = JSON.stringify(item[fieldName]);
|
|
56393
|
+
}
|
|
56394
|
+
}
|
|
56395
|
+
}
|
|
56367
56396
|
/**
|
|
56368
56397
|
* Evaluate the partition key value from the partial item
|
|
56369
56398
|
* @param item
|
|
@@ -56502,8 +56531,8 @@ async function getSecret(id) {
|
|
|
56502
56531
|
}
|
|
56503
56532
|
|
|
56504
56533
|
// src/error/DuplicateItemError.ts
|
|
56505
|
-
var
|
|
56506
|
-
var DuplicateItemError = class extends
|
|
56534
|
+
var import_dx_common_lib4 = __toESM(require_lib5());
|
|
56535
|
+
var DuplicateItemError = class extends import_dx_common_lib4.InternalServerError {
|
|
56507
56536
|
constructor(message) {
|
|
56508
56537
|
super(message);
|
|
56509
56538
|
this.name = "DuplicateItemError";
|
|
@@ -56511,8 +56540,8 @@ var DuplicateItemError = class extends import_dx_common_lib3.InternalServerError
|
|
|
56511
56540
|
};
|
|
56512
56541
|
|
|
56513
56542
|
// src/error/MissingKeyValuesError.ts
|
|
56514
|
-
var
|
|
56515
|
-
var MissingKeyValuesError = class extends
|
|
56543
|
+
var import_dx_common_lib5 = __toESM(require_lib5());
|
|
56544
|
+
var MissingKeyValuesError = class extends import_dx_common_lib5.InternalServerError {
|
|
56516
56545
|
constructor(message) {
|
|
56517
56546
|
super(message);
|
|
56518
56547
|
this.name = "MissingKeyValuesError";
|
|
@@ -56520,8 +56549,8 @@ var MissingKeyValuesError = class extends import_dx_common_lib4.InternalServerEr
|
|
|
56520
56549
|
};
|
|
56521
56550
|
|
|
56522
56551
|
// src/error/InvalidDbSchemaError.ts
|
|
56523
|
-
var
|
|
56524
|
-
var InvalidDbSchemaError = class extends
|
|
56552
|
+
var import_dx_common_lib6 = __toESM(require_lib5());
|
|
56553
|
+
var InvalidDbSchemaError = class extends import_dx_common_lib6.BadRequestError {
|
|
56525
56554
|
constructor(message) {
|
|
56526
56555
|
super(message);
|
|
56527
56556
|
this.name = "InvalidDbSchemaError";
|