@kravc/dos-dynamodb 1.0.0-alpha.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.
Files changed (136) hide show
  1. package/README.md +30 -0
  2. package/bin/table.js +88 -0
  3. package/config/default.yaml +36 -0
  4. package/config/test.yaml +0 -0
  5. package/dist/example/Activity.d.ts +34 -0
  6. package/dist/example/Activity.d.ts.map +1 -0
  7. package/dist/example/Activity.js +66 -0
  8. package/dist/example/Activity.js.map +1 -0
  9. package/dist/example/ActivityAttributes.d.ts +23 -0
  10. package/dist/example/ActivityAttributes.d.ts.map +1 -0
  11. package/dist/example/ActivityAttributes.js +54 -0
  12. package/dist/example/ActivityAttributes.js.map +1 -0
  13. package/dist/example/Asset.d.ts +36 -0
  14. package/dist/example/Asset.d.ts.map +1 -0
  15. package/dist/example/Asset.js +56 -0
  16. package/dist/example/Asset.js.map +1 -0
  17. package/dist/example/AssetAttributes.d.ts +28 -0
  18. package/dist/example/AssetAttributes.d.ts.map +1 -0
  19. package/dist/example/AssetAttributes.js +72 -0
  20. package/dist/example/AssetAttributes.js.map +1 -0
  21. package/dist/example/Organization.d.ts +19 -0
  22. package/dist/example/Organization.d.ts.map +1 -0
  23. package/dist/example/Organization.js +42 -0
  24. package/dist/example/Organization.js.map +1 -0
  25. package/dist/example/OrganizationAttributes.d.ts +13 -0
  26. package/dist/example/OrganizationAttributes.d.ts.map +1 -0
  27. package/dist/example/OrganizationAttributes.js +24 -0
  28. package/dist/example/OrganizationAttributes.js.map +1 -0
  29. package/dist/example/index.d.ts +5 -0
  30. package/dist/example/index.d.ts.map +1 -0
  31. package/dist/example/index.js +13 -0
  32. package/dist/example/index.js.map +1 -0
  33. package/dist/src/Document/Document.d.ts +67 -0
  34. package/dist/src/Document/Document.d.ts.map +1 -0
  35. package/dist/src/Document/Document.js +216 -0
  36. package/dist/src/Document/Document.js.map +1 -0
  37. package/dist/src/Document/DocumentWithHashId.d.ts +22 -0
  38. package/dist/src/Document/DocumentWithHashId.d.ts.map +1 -0
  39. package/dist/src/Document/DocumentWithHashId.js +73 -0
  40. package/dist/src/Document/DocumentWithHashId.js.map +1 -0
  41. package/dist/src/Document/__tests__/__helpers.d.ts +21 -0
  42. package/dist/src/Document/__tests__/__helpers.d.ts.map +1 -0
  43. package/dist/src/Document/__tests__/__helpers.js +92 -0
  44. package/dist/src/Document/__tests__/__helpers.js.map +1 -0
  45. package/dist/src/Document/helpers/composeIndexKeys.d.ts +11 -0
  46. package/dist/src/Document/helpers/composeIndexKeys.d.ts.map +1 -0
  47. package/dist/src/Document/helpers/composeIndexKeys.js +81 -0
  48. package/dist/src/Document/helpers/composeIndexKeys.js.map +1 -0
  49. package/dist/src/Document/helpers/index.d.ts +3 -0
  50. package/dist/src/Document/helpers/index.d.ts.map +1 -0
  51. package/dist/src/Document/helpers/index.js +9 -0
  52. package/dist/src/Document/helpers/index.js.map +1 -0
  53. package/dist/src/Table/Table.d.ts +56 -0
  54. package/dist/src/Table/Table.d.ts.map +1 -0
  55. package/dist/src/Table/Table.js +228 -0
  56. package/dist/src/Table/Table.js.map +1 -0
  57. package/dist/src/Table/helpers/buildConditionExpression.d.ts +22 -0
  58. package/dist/src/Table/helpers/buildConditionExpression.d.ts.map +1 -0
  59. package/dist/src/Table/helpers/buildConditionExpression.js +128 -0
  60. package/dist/src/Table/helpers/buildConditionExpression.js.map +1 -0
  61. package/dist/src/Table/helpers/buildQueryCommandInput.d.ts +12 -0
  62. package/dist/src/Table/helpers/buildQueryCommandInput.d.ts.map +1 -0
  63. package/dist/src/Table/helpers/buildQueryCommandInput.js +60 -0
  64. package/dist/src/Table/helpers/buildQueryCommandInput.js.map +1 -0
  65. package/dist/src/Table/helpers/buildQueryConditionExpression.d.ts +17 -0
  66. package/dist/src/Table/helpers/buildQueryConditionExpression.d.ts.map +1 -0
  67. package/dist/src/Table/helpers/buildQueryConditionExpression.js +77 -0
  68. package/dist/src/Table/helpers/buildQueryConditionExpression.js.map +1 -0
  69. package/dist/src/Table/helpers/buildTableSchema.d.ts +6 -0
  70. package/dist/src/Table/helpers/buildTableSchema.d.ts.map +1 -0
  71. package/dist/src/Table/helpers/buildTableSchema.js +100 -0
  72. package/dist/src/Table/helpers/buildTableSchema.js.map +1 -0
  73. package/dist/src/Table/helpers/buildUpdateExpression.d.ts +10 -0
  74. package/dist/src/Table/helpers/buildUpdateExpression.d.ts.map +1 -0
  75. package/dist/src/Table/helpers/buildUpdateExpression.js +69 -0
  76. package/dist/src/Table/helpers/buildUpdateExpression.js.map +1 -0
  77. package/dist/src/Table/helpers/filterConditionExpression.d.ts +5 -0
  78. package/dist/src/Table/helpers/filterConditionExpression.d.ts.map +1 -0
  79. package/dist/src/Table/helpers/filterConditionExpression.js +68 -0
  80. package/dist/src/Table/helpers/filterConditionExpression.js.map +1 -0
  81. package/dist/src/Table/helpers/getRawClientConfig.d.ts +5 -0
  82. package/dist/src/Table/helpers/getRawClientConfig.d.ts.map +1 -0
  83. package/dist/src/Table/helpers/getRawClientConfig.js +29 -0
  84. package/dist/src/Table/helpers/getRawClientConfig.js.map +1 -0
  85. package/dist/src/Table/helpers/getTableOptions.d.ts +51 -0
  86. package/dist/src/Table/helpers/getTableOptions.d.ts.map +1 -0
  87. package/dist/src/Table/helpers/getTableOptions.js +144 -0
  88. package/dist/src/Table/helpers/getTableOptions.js.map +1 -0
  89. package/dist/src/Table/helpers/index.d.ts +10 -0
  90. package/dist/src/Table/helpers/index.d.ts.map +1 -0
  91. package/dist/src/Table/helpers/index.js +21 -0
  92. package/dist/src/Table/helpers/index.js.map +1 -0
  93. package/dist/src/Table/index.d.ts +8 -0
  94. package/dist/src/Table/index.d.ts.map +1 -0
  95. package/dist/src/Table/index.js +13 -0
  96. package/dist/src/Table/index.js.map +1 -0
  97. package/dist/src/index.d.ts +7 -0
  98. package/dist/src/index.d.ts.map +1 -0
  99. package/dist/src/index.js +14 -0
  100. package/dist/src/index.js.map +1 -0
  101. package/docker-compose.yaml +10 -0
  102. package/eslint.config.mjs +35 -0
  103. package/example/Activity.ts +123 -0
  104. package/example/ActivityAttributes.ts +72 -0
  105. package/example/Asset.ts +78 -0
  106. package/example/AssetAttributes.ts +87 -0
  107. package/example/Organization.ts +61 -0
  108. package/example/OrganizationAttributes.ts +28 -0
  109. package/example/index.ts +9 -0
  110. package/jest.config.mjs +10 -0
  111. package/package.json +50 -0
  112. package/src/Document/DefaultAttributes.d.ts +16 -0
  113. package/src/Document/Document.ts +257 -0
  114. package/src/Document/DocumentWithHashId.ts +85 -0
  115. package/src/Document/__tests__/Document.test.ts +596 -0
  116. package/src/Document/__tests__/DocumentWithHashId.test.ts +81 -0
  117. package/src/Document/__tests__/__helpers.ts +115 -0
  118. package/src/Document/helpers/__tests__/composeIndexKeys.test.ts +40 -0
  119. package/src/Document/helpers/composeIndexKeys.ts +137 -0
  120. package/src/Document/helpers/index.ts +5 -0
  121. package/src/Table/Table.ts +354 -0
  122. package/src/Table/__tests__/Table.test.ts +64 -0
  123. package/src/Table/helpers/__tests__/buildQueryCommandInput.test.ts +14 -0
  124. package/src/Table/helpers/__tests__/buildTableSchema.test.ts +19 -0
  125. package/src/Table/helpers/buildConditionExpression.ts +151 -0
  126. package/src/Table/helpers/buildQueryCommandInput.ts +113 -0
  127. package/src/Table/helpers/buildQueryConditionExpression.ts +109 -0
  128. package/src/Table/helpers/buildTableSchema.ts +151 -0
  129. package/src/Table/helpers/buildUpdateExpression.ts +95 -0
  130. package/src/Table/helpers/filterConditionExpression.ts +87 -0
  131. package/src/Table/helpers/getRawClientConfig.ts +35 -0
  132. package/src/Table/helpers/getTableOptions.ts +228 -0
  133. package/src/Table/helpers/index.ts +21 -0
  134. package/src/Table/index.ts +18 -0
  135. package/src/index.ts +15 -0
  136. package/tsconfig.json +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationAttributes.d.ts","sourceRoot":"","sources":["../../example/OrganizationAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAE3C,oBAAY,kBAAkB;IAC5B,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,QAaG,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schema = exports.OrganizationStatus = void 0;
4
+ const schema_1 = require("@kravc/schema");
5
+ var OrganizationStatus;
6
+ (function (OrganizationStatus) {
7
+ OrganizationStatus["ACTIVE"] = "ACTIVE";
8
+ OrganizationStatus["DISABLED"] = "DISABLED";
9
+ })(OrganizationStatus || (exports.OrganizationStatus = OrganizationStatus = {}));
10
+ exports.schema = new schema_1.Schema({
11
+ name: {
12
+ required: true
13
+ },
14
+ status: {
15
+ enum: [OrganizationStatus.ACTIVE, OrganizationStatus.DISABLED],
16
+ required: true,
17
+ },
18
+ number: {
19
+ type: 'integer',
20
+ minimum: 1,
21
+ required: true,
22
+ }
23
+ }, 'OrganizationBody');
24
+ //# sourceMappingURL=OrganizationAttributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationAttributes.js","sourceRoot":"","sources":["../../example/OrganizationAttributes.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AAGvC,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,uCAAiB,CAAA;IACjB,2CAAqB,CAAA;AACvB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAQY,QAAA,MAAM,GAAG,IAAI,eAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAE,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAE;QAChE,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;KACf;CACF,EAAE,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import Asset from './Asset';
2
+ import Activity from './Activity';
3
+ import Organization from './Organization';
4
+ export { Asset, Activity, Organization, };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../example/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EACL,KAAK,EACL,QAAQ,EACR,YAAY,GACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Organization = exports.Activity = exports.Asset = void 0;
7
+ const Asset_1 = __importDefault(require("./Asset"));
8
+ exports.Asset = Asset_1.default;
9
+ const Activity_1 = __importDefault(require("./Activity"));
10
+ exports.Activity = Activity_1.default;
11
+ const Organization_1 = __importDefault(require("./Organization"));
12
+ exports.Organization = Organization_1.default;
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../example/index.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAK1B,gBALK,eAAK,CAKL;AAJP,0DAAkC;AAKhC,mBALK,kBAAQ,CAKL;AAJV,kEAA0C;AAKxC,uBALK,sBAAY,CAKL"}
@@ -0,0 +1,67 @@
1
+ import Table, { type ItemAttributes } from '../Table';
2
+ import { type Context, type QueryMap, type MutationMap, type IndexOptions, type IndexAllOptions, MemoryDocument } from '@kravc/dos';
3
+ /** Document class with DynamoDB database interface. */
4
+ declare class Document<T> extends MemoryDocument<T> {
5
+ /** Returns the table instance used to store a document. */
6
+ static get table(): Table;
7
+ /** Returns prefix for new document IDs. */
8
+ static get idPrefix(): string;
9
+ /** Returns context path to get partition value from. */
10
+ static get partitionContextPath(): string;
11
+ /** Returns the partition to save a document to. */
12
+ static getPartition(context: Context, _parameters: Record<string, unknown>): string;
13
+ /** Defines limit maximum value for index action. */
14
+ static get indexLimitMax(): number;
15
+ /** Returns sort key name for a local secondary index. */
16
+ static getLocalIndexSortKeyName(indexName: string): string;
17
+ /** Returns partition key name for a global secondary index. */
18
+ static getGlobalIndexPartitionKeyName(indexName: string): string;
19
+ /** Returns sort key name for a global secondary index. */
20
+ static getGlobalIndexSortKeyName(indexName: string): string;
21
+ /** Returns true if local index, false if global index. */
22
+ static isLocalSecondaryIndex(indexName: string): boolean;
23
+ /** Returns local index props. */
24
+ static getLocalIndexProps(indexName: string): {
25
+ indexName: string;
26
+ sortKeyName: string;
27
+ };
28
+ /** Returns global index props. */
29
+ static getGlobalIndexProps(indexName: string): {
30
+ indexName: string;
31
+ sortKeyName: string;
32
+ partitionKeyName: string;
33
+ };
34
+ /** Returns composed index keys. */
35
+ static composeIndexKeys(attributes: ItemAttributes): {
36
+ [x: string]: unknown;
37
+ };
38
+ /** Implements the interface to save a document, throws an error if document exists. */
39
+ static _create<T>(attributes: T, _context: Context): Promise<void>;
40
+ /** Implements the interface to read a document. */
41
+ static _read<T>(query: QueryMap): Promise<T>;
42
+ /** Implements the interface to update a document. */
43
+ static _update<T>(query: QueryMap, mutation: MutationMap, _context: Context, previousAttributes: T): Promise<T>;
44
+ /** Implements the interface to delete a document. */
45
+ static _delete<T>(query: QueryMap, _context: Context, _previousAttributes: T): Promise<void>;
46
+ /** Returns query that ensures access to the documents collection only. */
47
+ static _getIndexQuery(query: QueryMap, { indexName }: {
48
+ indexName?: string;
49
+ }): {
50
+ indexQuery: QueryMap;
51
+ indexName?: string;
52
+ };
53
+ /** Implements the interface to get documents in batches. */
54
+ static _index<T>(query: QueryMap, options: IndexOptions): Promise<{
55
+ limit: number;
56
+ count: number;
57
+ items: T[];
58
+ lastEvaluatedKey?: string;
59
+ }>;
60
+ /** Implements the interface to get all documents. */
61
+ static _indexAll<T>(query: QueryMap, options: IndexAllOptions): Promise<{
62
+ count: number;
63
+ items: T[];
64
+ }>;
65
+ }
66
+ export default Document;
67
+ //# sourceMappingURL=Document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Document.d.ts","sourceRoot":"","sources":["../../../src/Document/Document.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,KAAK,cAAc,EAAqB,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EAEpB,cAAc,EAGf,MAAM,YAAY,CAAC;AAUpB,uDAAuD;AACvD,cAAM,QAAQ,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACzC,2DAA2D;IAC3D,MAAM,KAAK,KAAK,IAAI,KAAK,CAKxB;IAED,2CAA2C;IAC3C,MAAM,KAAK,QAAQ,IAAI,MAAM,CAE5B;IAED,wDAAwD;IACxD,MAAM,KAAK,oBAAoB,WAE9B;IAED,mDAAmD;IAEnD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAOnF,oDAAoD;IACpD,MAAM,KAAK,aAAa,IAAI,MAAM,CAEjC;IAED,yDAAyD;IACzD,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI1D,+DAA+D;IAC/D,MAAM,CAAC,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIhE,0DAA0D;IAC1D,MAAM,CAAC,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI3D,0DAA0D;IAC1D,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIxD,iCAAiC;IACjC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM;;;;IAI3C,kCAAkC;IAClC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM;;;;;IAI5C,mCAAmC;IACnC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc;;;IAalD,uFAAuF;WAE1E,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxE,mDAAmD;WACtC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAalD,qDAAqD;WACxC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAerH,qDAAqD;WAExC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlG,0EAA0E;IAC1E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG;QAC7E,UAAU,EAAE,QAAQ,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB;IAwBD,4DAA4D;WAC/C,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;QACtE,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAsBF,qDAAqD;WACxC,SAAS,CAAC,CAAC,EACtB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,EAAE,CAAC;KACZ,CAAC;CA2BH;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const config_1 = __importDefault(require("config"));
40
+ const helpers_1 = require("./helpers");
41
+ const lodash_1 = require("lodash");
42
+ const Table_1 = __importStar(require("../Table"));
43
+ const dos_1 = require("@kravc/dos");
44
+ const DEFAULT_PARTITION_PATH = 'identity.organizationId';
45
+ const QUERY_ERROR_TEMPLATE = 'Query parameter "$PATH" is required';
46
+ const ATTRIBUTE_ERROR_TEMPLATE = 'Attribute "$PATH" is required';
47
+ const INDEX_ALL_LIMIT = 300;
48
+ const INDEX_LIMIT_MAX = 999;
49
+ /** Document class with DynamoDB database interface. */
50
+ class Document extends dos_1.MemoryDocument {
51
+ /** Returns the table instance used to store a document. */
52
+ static get table() {
53
+ return new Table_1.default({
54
+ sortKey: this.idKey,
55
+ partitionKey: this.partitionKey,
56
+ });
57
+ }
58
+ /** Returns prefix for new document IDs. */
59
+ static get idPrefix() {
60
+ return config_1.default.get(`idPrefixes.${this.name}`);
61
+ }
62
+ /** Returns context path to get partition value from. */
63
+ static get partitionContextPath() {
64
+ return DEFAULT_PARTITION_PATH;
65
+ }
66
+ /** Returns the partition to save a document to. */
67
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
68
+ static getPartition(context, _parameters) {
69
+ const errorTemplate = 'Context is missing "$PATH", partition is not defined';
70
+ const partition = (0, dos_1.got)(context, this.partitionContextPath, errorTemplate);
71
+ return partition;
72
+ }
73
+ /** Defines limit maximum value for index action. */
74
+ static get indexLimitMax() {
75
+ return INDEX_LIMIT_MAX;
76
+ }
77
+ /** Returns sort key name for a local secondary index. */
78
+ static getLocalIndexSortKeyName(indexName) {
79
+ return this.table.options.getLocalIndexSortKeyName(indexName);
80
+ }
81
+ /** Returns partition key name for a global secondary index. */
82
+ static getGlobalIndexPartitionKeyName(indexName) {
83
+ return this.table.options.getGlobalIndexPartitionKeyName(indexName);
84
+ }
85
+ /** Returns sort key name for a global secondary index. */
86
+ static getGlobalIndexSortKeyName(indexName) {
87
+ return this.table.options.getGlobalIndexSortKeyName(indexName);
88
+ }
89
+ /** Returns true if local index, false if global index. */
90
+ static isLocalSecondaryIndex(indexName) {
91
+ return this.table.options.isLocalSecondaryIndex(indexName);
92
+ }
93
+ /** Returns local index props. */
94
+ static getLocalIndexProps(indexName) {
95
+ return this.table.options.getLocalIndexProps(indexName);
96
+ }
97
+ /** Returns global index props. */
98
+ static getGlobalIndexProps(indexName) {
99
+ return this.table.options.getGlobalIndexProps(indexName);
100
+ }
101
+ /** Returns composed index keys. */
102
+ static composeIndexKeys(attributes) {
103
+ const idPrefix = this.idPrefix;
104
+ const documentName = this.name;
105
+ const tableOptions = this.table.options;
106
+ return (0, helpers_1.composeIndexKeys)({
107
+ idPrefix,
108
+ attributes,
109
+ documentName,
110
+ tableOptions,
111
+ });
112
+ }
113
+ /** Implements the interface to save a document, throws an error if document exists. */
114
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
115
+ static async _create(attributes, _context) {
116
+ (0, dos_1.got)(attributes, this.idKey, ATTRIBUTE_ERROR_TEMPLATE);
117
+ (0, dos_1.got)(attributes, this.partitionKey, ATTRIBUTE_ERROR_TEMPLATE);
118
+ const indexKeys = this.composeIndexKeys(attributes);
119
+ const itemAttributes = (0, lodash_1.cloneDeep)({ ...indexKeys, ...attributes });
120
+ const isCreated = await this.table.createItem(itemAttributes);
121
+ const isDocumentExistsError = !isCreated;
122
+ if (isDocumentExistsError) {
123
+ throw new dos_1.DocumentExistsError(this, itemAttributes);
124
+ }
125
+ }
126
+ /** Implements the interface to read a document. */
127
+ static async _read(query) {
128
+ (0, dos_1.got)(query, this.idKey, QUERY_ERROR_TEMPLATE);
129
+ (0, dos_1.got)(query, this.partitionKey, ATTRIBUTE_ERROR_TEMPLATE);
130
+ const item = await this.table.getItem(query);
131
+ if (!item) {
132
+ throw new dos_1.DocumentNotFoundError(this, query);
133
+ }
134
+ return (0, lodash_1.cloneDeep)(item);
135
+ }
136
+ /** Implements the interface to update a document. */
137
+ static async _update(query, mutation, _context, previousAttributes) {
138
+ (0, dos_1.got)(query, this.idKey, QUERY_ERROR_TEMPLATE);
139
+ (0, dos_1.got)(query, this.partitionKey, QUERY_ERROR_TEMPLATE);
140
+ const indexKeys = this.composeIndexKeys({ ...previousAttributes, ...mutation });
141
+ const item = await this.table.updateItem(query, { ...indexKeys, ...mutation });
142
+ if (!item) {
143
+ throw new dos_1.DocumentNotFoundError(this, query);
144
+ }
145
+ return (0, lodash_1.cloneDeep)(item);
146
+ }
147
+ /** Implements the interface to delete a document. */
148
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
149
+ static async _delete(query, _context, _previousAttributes) {
150
+ (0, dos_1.got)(query, this.idKey, QUERY_ERROR_TEMPLATE);
151
+ (0, dos_1.got)(query, this.partitionKey, QUERY_ERROR_TEMPLATE);
152
+ const isDeleted = await this.table.deleteItem(query);
153
+ const isDocumentNotFoundError = !isDeleted;
154
+ if (isDocumentNotFoundError) {
155
+ throw new dos_1.DocumentNotFoundError(this, query);
156
+ }
157
+ }
158
+ /** Returns query that ensures access to the documents collection only. */
159
+ static _getIndexQuery(query, { indexName }) {
160
+ const indexQuery = (0, lodash_1.cloneDeep)(query);
161
+ if (!indexName) {
162
+ indexQuery[`${this.idKey}:${Table_1.SortExpressionKey.BW}`] = `${this.idPrefix}_`;
163
+ return { indexQuery, indexName };
164
+ }
165
+ const isLocalSecondaryIndex = this.isLocalSecondaryIndex(indexName);
166
+ if (isLocalSecondaryIndex) {
167
+ return { indexQuery, indexName };
168
+ }
169
+ const partitionKeyName = this.getGlobalIndexPartitionKeyName(indexName);
170
+ const partitionKey = (0, lodash_1.get)(indexQuery, partitionKeyName, QUERY_ERROR_TEMPLATE);
171
+ (0, lodash_1.set)(indexQuery, partitionKeyName, `${this.idPrefix}#${partitionKey}`);
172
+ (0, lodash_1.unset)(indexQuery, this.partitionKey);
173
+ return { indexQuery, indexName };
174
+ }
175
+ /** Implements the interface to get documents in batches. */
176
+ static async _index(query, options) {
177
+ const sort = (0, lodash_1.get)(options, 'sort', this.indexDefaultSort);
178
+ const limit = (0, lodash_1.get)(options, 'limit', this.indexDefaultLimit);
179
+ const exclusiveStartKey = (0, lodash_1.get)(options, 'exclusiveStartKey');
180
+ const { indexQuery, indexName } = this._getIndexQuery(query, options);
181
+ const { items, count, lastEvaluatedKey } = await this.table.listItems(indexQuery, {
182
+ sort,
183
+ limit,
184
+ indexName,
185
+ exclusiveStartKey,
186
+ });
187
+ return {
188
+ items: items,
189
+ limit,
190
+ count,
191
+ lastEvaluatedKey,
192
+ };
193
+ }
194
+ /** Implements the interface to get all documents. */
195
+ static async _indexAll(query, options) {
196
+ let resultItems = [];
197
+ let exclusiveStartKey;
198
+ const limit = INDEX_ALL_LIMIT;
199
+ const indexOptions = { limit, ...options };
200
+ do {
201
+ if (exclusiveStartKey) {
202
+ indexOptions.exclusiveStartKey = exclusiveStartKey;
203
+ }
204
+ const { items, lastEvaluatedKey: nextExclusiveStartKey } = await this._index(query, indexOptions);
205
+ resultItems = [...resultItems, ...items];
206
+ exclusiveStartKey = nextExclusiveStartKey;
207
+ } while (exclusiveStartKey);
208
+ const count = resultItems.length;
209
+ return {
210
+ items: resultItems,
211
+ count
212
+ };
213
+ }
214
+ }
215
+ exports.default = Document;
216
+ //# sourceMappingURL=Document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Document.js","sourceRoot":"","sources":["../../../src/Document/Document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import Document from './Document';
2
+ import { type QueryMap, type Context } from '@kravc/dos';
3
+ /** Document class that uses hash ID as id key. */
4
+ declare class DocumentWithHashId<T> extends Document<T> {
5
+ /** Returns salt for hash ID method. */
6
+ static getSalt<T>(_context: Context, _attributes: T): string;
7
+ /** Returns number key. */
8
+ static get numberKey(): string;
9
+ /** Ensures index query without index name uses lsi1 to sort documents. */
10
+ static _getIndexQuery(query: QueryMap, { indexName }: {
11
+ indexName?: string;
12
+ }): {
13
+ indexQuery: QueryMap;
14
+ indexName?: string;
15
+ };
16
+ /** Returns number for the next document. */
17
+ static _getNextDocumentNumber(context: Context): Promise<number>;
18
+ /** Ensures creation of a document with generated ID. */
19
+ static _create<T>(attributes: T, context: Context): Promise<void>;
20
+ }
21
+ export default DocumentWithHashId;
22
+ //# sourceMappingURL=DocumentWithHashId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentWithHashId.d.ts","sourceRoot":"","sources":["../../../src/Document/DocumentWithHashId.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAMpF,kDAAkD;AAClD,cAAM,kBAAkB,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC7C,uCAAuC;IAEvC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,GAAG,MAAM;IAI5D,0BAA0B;IAC1B,MAAM,KAAK,SAAS,WAEnB;IAED,0EAA0E;IAC1E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;;;;IAM5E,4CAA4C;WAC/B,sBAAsB,CAAC,OAAO,EAAE,OAAO;IAgBpD,wDAAwD;WAC3C,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAmCxE;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const hashids_1 = __importDefault(require("hashids"));
7
+ const Document_1 = __importDefault(require("./Document"));
8
+ const lodash_1 = require("lodash");
9
+ const dos_1 = require("@kravc/dos");
10
+ const CHARACTER_SET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
11
+ const DEFAULT_INDEX_NAME = 'lsi1';
12
+ const DEFAULT_NUMBER_KEY = 'number';
13
+ /** Document class that uses hash ID as id key. */
14
+ class DocumentWithHashId extends Document_1.default {
15
+ /** Returns salt for hash ID method. */
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ static getSalt(_context, _attributes) {
18
+ return this.name;
19
+ }
20
+ ;
21
+ /** Returns number key. */
22
+ static get numberKey() {
23
+ return DEFAULT_NUMBER_KEY;
24
+ }
25
+ /** Ensures index query without index name uses lsi1 to sort documents. */
26
+ static _getIndexQuery(query, { indexName }) {
27
+ return indexName
28
+ ? super._getIndexQuery(query, { indexName })
29
+ : super._getIndexQuery(query, { indexName: DEFAULT_INDEX_NAME });
30
+ }
31
+ /** Returns number for the next document. */
32
+ static async _getNextDocumentNumber(context) {
33
+ const query = {};
34
+ const options = { limit: 1, sort: this.indexDefaultSort };
35
+ const { objects: documents } = await this.index(context, query, options);
36
+ const [previousDocument] = documents;
37
+ if (!previousDocument) {
38
+ return 1;
39
+ }
40
+ const number = (0, lodash_1.get)(previousDocument.attributes, this.numberKey, 0);
41
+ return number + 1;
42
+ }
43
+ /** Ensures creation of a document with generated ID. */
44
+ static async _create(attributes, context) {
45
+ let number = (0, lodash_1.get)(attributes, this.numberKey);
46
+ if (!number) {
47
+ number = await this._getNextDocumentNumber(context);
48
+ }
49
+ const salt = this.getSalt(context, attributes);
50
+ const hashids = new hashids_1.default(salt, 0, CHARACTER_SET);
51
+ const hashId = hashids.encode(number);
52
+ const id = `${this.idPrefix}${hashId}`;
53
+ (0, lodash_1.set)(attributes, this.numberKey, number);
54
+ (0, lodash_1.set)(attributes, this.idKey, id);
55
+ try {
56
+ await super._create(attributes, context);
57
+ return;
58
+ }
59
+ catch (error) {
60
+ const isDocumentExistsError = error instanceof dos_1.DocumentExistsError;
61
+ /* istanbul ignore next */
62
+ if (!isDocumentExistsError) {
63
+ throw error;
64
+ }
65
+ }
66
+ await (0, dos_1.wait)(50);
67
+ (0, lodash_1.set)(attributes, this.numberKey, number + 1);
68
+ return this._create(attributes, context);
69
+ }
70
+ }
71
+ ;
72
+ exports.default = DocumentWithHashId;
73
+ //# sourceMappingURL=DocumentWithHashId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentWithHashId.js","sourceRoot":"","sources":["../../../src/Document/DocumentWithHashId.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Schema } from '@kravc/schema';
2
+ import { Asset, Activity, Organization } from '../../../example';
3
+ import { Context, type Identity, type Request, type ExtraContext } from '@kravc/dos';
4
+ type Props = {
5
+ request?: Request;
6
+ schemas?: Schema[];
7
+ identity?: Identity;
8
+ extraContext?: ExtraContext;
9
+ };
10
+ /** Deletes and recreates the table. */
11
+ export declare const resetTable: () => Promise<void>;
12
+ /** Creates an instance of an operation context. */
13
+ export declare const createContext: (props?: Props) => Context;
14
+ /** Creates an asset. */
15
+ export declare const createAsset: (extraAttributes?: Record<string, unknown>) => Promise<Asset>;
16
+ /** Creates an activity. */
17
+ export declare const createActivity: (extraAttributes?: Record<string, unknown>) => Promise<Activity>;
18
+ /** Creates an organization. */
19
+ export declare const createOrganization: (extraAttributes?: Record<string, unknown>) => Promise<Organization>;
20
+ export {};
21
+ //# sourceMappingURL=__helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__helpers.d.ts","sourceRoot":"","sources":["../../../../src/Document/__tests__/__helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AASzG,KAAK,KAAK,GAAG;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,UAAU,qBAAwC,CAAC;AAEhE,mDAAmD;AACnD,eAAO,MAAM,aAAa,GAAI,QAAO,KAAU,KAAG,OA+BjD,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,WAAW,GAAU,kBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,mBAe9E,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,cAAc,GAAU,kBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,sBAyBjF,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,kBAAkB,GAAU,kBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,0BAYrF,CAAC"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOrganization = exports.createActivity = exports.createAsset = exports.createContext = exports.resetTable = void 0;
4
+ const schema_1 = require("@kravc/schema");
5
+ const example_1 = require("../../../example");
6
+ const dos_1 = require("@kravc/dos");
7
+ const operationId = 'CreateAsset';
8
+ const DEFAULT_LAMBDA_REQUEST = {
9
+ headers: {},
10
+ operationId,
11
+ };
12
+ /** Deletes and recreates the table. */
13
+ const resetTable = async () => await example_1.Asset.table.reset();
14
+ exports.resetTable = resetTable;
15
+ /** Creates an instance of an operation context. */
16
+ const createContext = (props = {}) => {
17
+ const { request = DEFAULT_LAMBDA_REQUEST, schemas = [example_1.Asset.schema, example_1.Activity.schema, example_1.Organization.schema], identity = {
18
+ sub: 'USR_1',
19
+ organizationId: 'ORG_1',
20
+ email: 'john.doe@example.com',
21
+ lastName: 'Doe',
22
+ firstName: 'John',
23
+ }, extraContext = {}, } = props;
24
+ const validator = new schema_1.Validator(schemas);
25
+ const spec = {
26
+ basePath: '/api',
27
+ paths: {
28
+ [`/${operationId}`]: {
29
+ post: {
30
+ operationId,
31
+ },
32
+ }
33
+ }
34
+ };
35
+ const context = new dos_1.Context({ spec, validator }, request, extraContext);
36
+ context.identity = identity;
37
+ return context;
38
+ };
39
+ exports.createContext = createContext;
40
+ /** Creates an asset. */
41
+ const createAsset = async (extraAttributes = {}) => {
42
+ const context = (0, exports.createContext)();
43
+ const attributes = {
44
+ name: 'Text Document',
45
+ tags: ['Tag A', 'Tag B'],
46
+ type: 'CONTENT',
47
+ status: 'ACTIVE',
48
+ content: 'Text document content.',
49
+ ...extraAttributes,
50
+ };
51
+ const asset = await example_1.Asset.create(context, attributes);
52
+ return asset;
53
+ };
54
+ exports.createAsset = createAsset;
55
+ /** Creates an activity. */
56
+ const createActivity = async (extraAttributes = {}) => {
57
+ const context = (0, exports.createContext)();
58
+ const attributes = {
59
+ operationId: 'CreateAsset',
60
+ summaryTemplate: 'Asset "Text Document" has been created by {user:createdBy}',
61
+ parametersJson: '{ "mutation": { "name": "Text Document" } }',
62
+ resultDocumentJson: '{ "name": "Text Document", "createdBy": "USR_1" }',
63
+ userId: 'USR_1',
64
+ traceId: 'TRACE_ID',
65
+ userAgent: 'USER_AGENT',
66
+ ipAddress: '127.0.0.1',
67
+ identity: {
68
+ sub: 'USR_1',
69
+ email: 'john.doe@example.com',
70
+ firstName: 'John',
71
+ lastName: 'Doe',
72
+ permissions: ['assets-write'],
73
+ },
74
+ ...extraAttributes,
75
+ };
76
+ const activity = await example_1.Activity.create(context, attributes);
77
+ return activity;
78
+ };
79
+ exports.createActivity = createActivity;
80
+ /** Creates an organization. */
81
+ const createOrganization = async (extraAttributes = {}) => {
82
+ const context = (0, exports.createContext)();
83
+ const attributes = {
84
+ name: 'Organization 1',
85
+ status: 'ACTIVE',
86
+ ...extraAttributes,
87
+ };
88
+ const organization = await example_1.Organization.create(context, attributes);
89
+ return organization;
90
+ };
91
+ exports.createOrganization = createOrganization;
92
+ //# sourceMappingURL=__helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__helpers.js","sourceRoot":"","sources":["../../../../src/Document/__tests__/__helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { TableOptions } from '../../Table';
2
+ type Attributes = Record<string, unknown>;
3
+ /** Returns index keys composed from item attributes. */
4
+ declare const composeIndexKeys: ({ idPrefix, attributes, documentName, tableOptions, }: {
5
+ idPrefix: string;
6
+ attributes: Attributes;
7
+ documentName: string;
8
+ tableOptions: TableOptions;
9
+ }) => Attributes;
10
+ export default composeIndexKeys;
11
+ //# sourceMappingURL=composeIndexKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composeIndexKeys.d.ts","sourceRoot":"","sources":["../../../../src/Document/helpers/composeIndexKeys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAiD,MAAM,aAAa,CAAC;AAE/F,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAiD1C,wDAAwD;AACxD,QAAA,MAAM,gBAAgB,GAAI,uDAKvB;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;CAC5B,KAAG,UAsEH,CAAC;AAEF,eAAe,gBAAgB,CAAC"}