@opra/sqb 0.15.0 → 0.16.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 (32) hide show
  1. package/cjs/augmentation/document-factory.augmentation.js +2 -0
  2. package/cjs/sqb-adapter.js +102 -199
  3. package/cjs/sqb-collection-resource.js +20 -20
  4. package/cjs/sqb-entity-service.js +86 -54
  5. package/cjs/sqb-singleton-resource.js +10 -10
  6. package/cjs/{convert-filter.js → transform-filter.js} +8 -12
  7. package/cjs/transform-key-values.js +14 -0
  8. package/esm/augmentation/document-factory.augmentation.js +32 -28
  9. package/esm/augmentation/mapped-type.augmentation.js +9 -7
  10. package/esm/augmentation/union-type.augmentation.js +7 -5
  11. package/esm/index.js +10 -7
  12. package/esm/sqb-adapter.js +110 -203
  13. package/esm/sqb-collection-resource.js +56 -52
  14. package/esm/sqb-entity-service.js +92 -56
  15. package/esm/sqb-singleton-resource.js +34 -30
  16. package/esm/transform-filter.js +68 -0
  17. package/esm/transform-key-values.js +14 -0
  18. package/package.json +8 -7
  19. package/types/sqb-adapter.d.ts +14 -0
  20. package/{esm → types}/sqb-collection-resource.d.ts +1 -1
  21. package/types/sqb-entity-service.d.ts +31 -0
  22. package/types/transform-filter.d.ts +2 -0
  23. package/types/transform-key-values.d.ts +3 -0
  24. package/esm/convert-filter.d.ts +0 -2
  25. package/esm/convert-filter.js +0 -67
  26. package/esm/sqb-adapter.d.ts +0 -64
  27. package/esm/sqb-entity-service.d.ts +0 -21
  28. /package/{esm → types}/augmentation/document-factory.augmentation.d.ts +0 -0
  29. /package/{esm → types}/augmentation/mapped-type.augmentation.d.ts +0 -0
  30. /package/{esm → types}/augmentation/union-type.augmentation.d.ts +0 -0
  31. /package/{esm → types}/index.d.ts +0 -0
  32. /package/{esm → types}/sqb-singleton-resource.d.ts +0 -0
@@ -6,47 +6,47 @@ const common_1 = require("@opra/common");
6
6
  const sqb_adapter_js_1 = require("./sqb-adapter.js");
7
7
  class SqbSingletonResource {
8
8
  async create(ctx) {
9
- const prepared = sqb_adapter_js_1.SQBAdapter.parseSingletonCreateRequest(ctx.request);
9
+ const prepared = sqb_adapter_js_1.SQBAdapter.transformRequest(ctx.request);
10
10
  const service = await this.getService(ctx);
11
11
  return service.create(ctx, prepared.data, prepared.options);
12
12
  }
13
13
  async delete(ctx) {
14
- const prepared = sqb_adapter_js_1.SQBAdapter.parseSingletonDeleteRequest(ctx.request);
14
+ const prepared = sqb_adapter_js_1.SQBAdapter.transformRequest(ctx.request);
15
15
  const service = await this.getService(ctx);
16
- return !!(await service.destroyAll(ctx, prepared.options));
16
+ return !!(await service.deleteMany(ctx, prepared.options));
17
17
  }
18
18
  async get(ctx) {
19
- const prepared = sqb_adapter_js_1.SQBAdapter.parseSingletonGetRequest(ctx.request);
19
+ const prepared = sqb_adapter_js_1.SQBAdapter.transformRequest(ctx.request);
20
20
  const service = await this.getService(ctx);
21
21
  return service.findOne(ctx, prepared.options);
22
22
  }
23
23
  async update(ctx) {
24
- const prepared = sqb_adapter_js_1.SQBAdapter.parseSingletonUpdateRequest(ctx.request);
24
+ const prepared = sqb_adapter_js_1.SQBAdapter.transformRequest(ctx.request);
25
25
  const service = await this.getService(ctx);
26
- await service.updateAll(ctx, prepared.data, prepared.options);
26
+ await service.updateMany(ctx, prepared.data, prepared.options);
27
27
  return service.findOne(ctx, prepared.options);
28
28
  }
29
29
  }
30
30
  tslib_1.__decorate([
31
- common_1.Singleton.CreateOperation(),
31
+ common_1.Singleton.Create(),
32
32
  tslib_1.__metadata("design:type", Function),
33
33
  tslib_1.__metadata("design:paramtypes", [Object]),
34
34
  tslib_1.__metadata("design:returntype", Promise)
35
35
  ], SqbSingletonResource.prototype, "create", null);
36
36
  tslib_1.__decorate([
37
- common_1.Singleton.DeleteOperation(),
37
+ common_1.Singleton.Delete(),
38
38
  tslib_1.__metadata("design:type", Function),
39
39
  tslib_1.__metadata("design:paramtypes", [Object]),
40
40
  tslib_1.__metadata("design:returntype", Promise)
41
41
  ], SqbSingletonResource.prototype, "delete", null);
42
42
  tslib_1.__decorate([
43
- common_1.Singleton.GetOperation(),
43
+ common_1.Singleton.Get(),
44
44
  tslib_1.__metadata("design:type", Function),
45
45
  tslib_1.__metadata("design:paramtypes", [Object]),
46
46
  tslib_1.__metadata("design:returntype", Promise)
47
47
  ], SqbSingletonResource.prototype, "get", null);
48
48
  tslib_1.__decorate([
49
- common_1.Singleton.UpdateOperation(),
49
+ common_1.Singleton.Update(),
50
50
  tslib_1.__metadata("design:type", Function),
51
51
  tslib_1.__metadata("design:paramtypes", [Object]),
52
52
  tslib_1.__metadata("design:returntype", Promise)
@@ -1,18 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertFilter = void 0;
4
3
  const tslib_1 = require("tslib");
5
4
  const common_1 = require("@opra/common");
6
5
  const sqb = tslib_1.__importStar(require("@sqb/builder"));
7
- function convertFilter(str) {
6
+ function transformFilter(str) {
8
7
  const ast = typeof str === 'string' ? (0, common_1.parseFilter)(str) : str;
9
8
  if (!ast)
10
9
  return;
11
10
  if (ast instanceof common_1.ComparisonExpression) {
12
11
  const left = ast.left instanceof common_1.QualifiedIdentifier
13
12
  ? sqb.Field(ast.left.value)
14
- : convertFilter(ast.left);
15
- const right = convertFilter(ast.right);
13
+ : transformFilter(ast.left);
14
+ const right = transformFilter(ast.right);
16
15
  switch (ast.op) {
17
16
  case '=':
18
17
  return sqb.Eq(left, right);
@@ -54,19 +53,16 @@ function convertFilter(str) {
54
53
  return ast.value;
55
54
  }
56
55
  if (ast instanceof common_1.ArrayExpression) {
57
- return ast.items.map(convertFilter);
56
+ return ast.items.map(transformFilter);
58
57
  }
59
58
  if (ast instanceof common_1.LogicalExpression) {
60
59
  if (ast.op === 'or')
61
- return sqb.Or(...ast.items.map(convertFilter));
62
- return sqb.And(...ast.items.map(convertFilter));
63
- }
64
- if (ast instanceof common_1.ArrayExpression) {
65
- return ast.items.map(convertFilter);
60
+ return sqb.Or(...ast.items.map(transformFilter));
61
+ return sqb.And(...ast.items.map(transformFilter));
66
62
  }
67
63
  if (ast instanceof common_1.ParenthesesExpression) {
68
- return convertFilter(ast.expression);
64
+ return transformFilter(ast.expression);
69
65
  }
70
66
  throw new Error(`${ast.type} is not implemented yet`);
71
67
  }
72
- exports.convertFilter = convertFilter;
68
+ exports.default = transformFilter;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function transformKeyValues(resource, keyValues) {
4
+ const { primaryKey } = resource;
5
+ if (primaryKey.length > 1) {
6
+ const query = {};
7
+ primaryKey.forEach((k, i) => {
8
+ query[k] = typeof keyValues === 'object' ? keyValues[k] : keyValues[i];
9
+ });
10
+ return query;
11
+ }
12
+ return { [primaryKey[0]]: keyValues };
13
+ }
14
+ exports.default = transformKeyValues;
@@ -1,16 +1,18 @@
1
- import { DocumentFactory, METADATA_KEY } from "@opra/common";
2
- import { DataType as SqbDataType, EntityMetadata, isAssociationField } from '@sqb/connect';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@opra/common");
4
+ const connect_1 = require("@sqb/connect");
3
5
  // @ts-ignore
4
- const _extractFieldSchema = DocumentFactory.prototype.extractFieldSchema;
6
+ const _extractFieldSchema = common_1.DocumentFactory.prototype.extractFieldSchema;
5
7
  // @ts-ignore
6
- DocumentFactory.prototype.extractFieldSchema = async function (target, ctor, metadata, name) {
8
+ common_1.DocumentFactory.prototype.extractFieldSchema = async function (target, ctor, metadata, name) {
7
9
  await _extractFieldSchema.call(this, target, ctor, metadata, name);
8
- const sqbMeta = EntityMetadata.get(ctor);
9
- const sqbField = sqbMeta && EntityMetadata.getField(sqbMeta, name);
10
+ const sqbMeta = connect_1.EntityMetadata.get(ctor);
11
+ const sqbField = sqbMeta && connect_1.EntityMetadata.getField(sqbMeta, name);
10
12
  if (!sqbField)
11
13
  return;
12
14
  const detectType = !metadata.type;
13
- if (isAssociationField(sqbField)) {
15
+ if ((0, connect_1.isAssociationField)(sqbField)) {
14
16
  if (!sqbField.association.returnsMany())
15
17
  delete target.isArray;
16
18
  if (!target.type) {
@@ -22,60 +24,62 @@ DocumentFactory.prototype.extractFieldSchema = async function (target, ctor, met
22
24
  }
23
25
  }
24
26
  else if (sqbField.kind === 'column') {
25
- if (sqbField.type && Reflect.hasMetadata(METADATA_KEY, sqbField.type)) {
27
+ if (typeof sqbField.enum === 'object')
28
+ metadata.enum = sqbField.enum;
29
+ if (sqbField.type && Reflect.hasMetadata(common_1.METADATA_KEY, sqbField.type)) {
26
30
  target.type = sqbField.type;
27
31
  }
28
32
  switch (sqbField.dataType) {
29
- case SqbDataType.GUID:
33
+ case connect_1.DataType.GUID:
30
34
  if (!target.type || (detectType && target.type === 'string'))
31
35
  target.type = 'guid';
32
36
  break;
33
- case SqbDataType.JSON:
37
+ case connect_1.DataType.JSON:
34
38
  if (!target.type || (detectType && target.type === 'any'))
35
39
  target.type = 'object';
36
40
  break;
37
- case SqbDataType.INTEGER:
38
- case SqbDataType.SMALLINT:
41
+ case connect_1.DataType.INTEGER:
42
+ case connect_1.DataType.SMALLINT:
39
43
  if (!target.type || (detectType && target.type === 'number'))
40
44
  target.type = 'integer';
41
45
  break;
42
- case SqbDataType.BIGINT:
46
+ case connect_1.DataType.BIGINT:
43
47
  if (!target.type || (detectType && target.type === 'number'))
44
48
  target.type = 'bigint';
45
49
  break;
46
- case SqbDataType.DATE:
50
+ case connect_1.DataType.DATE:
47
51
  if (!target.type || (detectType && (target.type === 'timestamp' || target.type === 'string')))
48
52
  target.type = 'date';
49
53
  break;
50
- case SqbDataType.TIMESTAMPTZ:
54
+ case connect_1.DataType.TIMESTAMPTZ:
51
55
  if (!target.type || (detectType && (target.type === 'timestamp' || target.type === 'string')))
52
56
  target.type = 'timestamptz';
53
57
  break;
54
- case SqbDataType.TIME:
58
+ case connect_1.DataType.TIME:
55
59
  if (!target.type || (detectType && (target.type === 'timestamp' || target.type === 'string')))
56
60
  target.type = 'time';
57
61
  break;
58
- case SqbDataType.BINARY:
62
+ case connect_1.DataType.BINARY:
59
63
  if (!target.type || (detectType && target.type === 'string'))
60
64
  target.type = 'base64';
61
65
  break;
62
66
  }
63
67
  if (!target.type) {
64
68
  switch (sqbField.dataType) {
65
- case SqbDataType.BOOL:
69
+ case connect_1.DataType.BOOL:
66
70
  target.type = 'boolean';
67
71
  break;
68
- case SqbDataType.CHAR:
69
- case SqbDataType.VARCHAR:
70
- case SqbDataType.TEXT:
72
+ case connect_1.DataType.CHAR:
73
+ case connect_1.DataType.VARCHAR:
74
+ case connect_1.DataType.TEXT:
71
75
  target.type = 'string';
72
76
  break;
73
- case SqbDataType.FLOAT:
74
- case SqbDataType.DOUBLE:
75
- case SqbDataType.NUMBER:
77
+ case connect_1.DataType.FLOAT:
78
+ case connect_1.DataType.DOUBLE:
79
+ case connect_1.DataType.NUMBER:
76
80
  target.type = 'number';
77
81
  break;
78
- case SqbDataType.TIMESTAMP:
82
+ case connect_1.DataType.TIMESTAMP:
79
83
  target.type = 'timestamp';
80
84
  break;
81
85
  }
@@ -91,14 +95,14 @@ DocumentFactory.prototype.extractFieldSchema = async function (target, ctor, met
91
95
  target.exclusive = sqbField.exclusive;
92
96
  };
93
97
  // @ts-ignore
94
- const _createCollection = DocumentFactory.prototype.createCollection;
98
+ const _createCollection = common_1.DocumentFactory.prototype.createCollection;
95
99
  // @ts-ignore
96
- DocumentFactory.prototype.createCollection = async function (name, schema) {
100
+ common_1.DocumentFactory.prototype.createCollection = async function (name, schema) {
97
101
  const { document } = this;
98
102
  const dataType = document.getComplexType(schema.type);
99
103
  // Determine primaryKey if not defined
100
104
  if (!schema.primaryKey && dataType.ctor) {
101
- const entityMetadata = EntityMetadata.get(dataType.ctor);
105
+ const entityMetadata = connect_1.EntityMetadata.get(dataType.ctor);
102
106
  if (entityMetadata?.indexes) {
103
107
  const primaryIndex = entityMetadata.indexes.find(x => x.primary);
104
108
  if (primaryIndex) {
@@ -1,12 +1,14 @@
1
- import { MappedType } from "@opra/common";
2
- import { Entity, EntityMetadata } from '@sqb/connect';
3
- const _applyMixin = MappedType._applyMixin;
4
- MappedType._applyMixin = function (target, source, options) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@opra/common");
4
+ const connect_1 = require("@sqb/connect");
5
+ const _applyMixin = common_1.MappedType._applyMixin;
6
+ common_1.MappedType._applyMixin = function (target, source, options) {
5
7
  _applyMixin.call(null, target, source, options);
6
- const srcMeta = Entity.getMetadata(source);
8
+ const srcMeta = connect_1.Entity.getMetadata(source);
7
9
  if (srcMeta) {
8
- const trgMeta = EntityMetadata.define(target);
10
+ const trgMeta = connect_1.EntityMetadata.define(target);
9
11
  const { isInheritedPredicate } = options;
10
- EntityMetadata.mixin(trgMeta, srcMeta, k => isInheritedPredicate(k));
12
+ connect_1.EntityMetadata.mixin(trgMeta, srcMeta, k => isInheritedPredicate(k));
11
13
  }
12
14
  };
@@ -1,7 +1,9 @@
1
- import { UnionType } from "@opra/common";
2
- import { Entity } from '@sqb/connect';
3
- const _applyMixin = UnionType._applyMixin;
4
- UnionType._applyMixin = function (target, ...sources) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@opra/common");
4
+ const connect_1 = require("@sqb/connect");
5
+ const _applyMixin = common_1.UnionType._applyMixin;
6
+ common_1.UnionType._applyMixin = function (target, ...sources) {
5
7
  _applyMixin.call(null, target, ...sources);
6
- Entity.mixin(target, ...sources);
8
+ connect_1.Entity.mixin(target, ...sources);
7
9
  };
package/esm/index.js CHANGED
@@ -1,7 +1,10 @@
1
- import './augmentation/document-factory.augmentation.js';
2
- import './augmentation/mapped-type.augmentation.js';
3
- import './augmentation/union-type.augmentation.js';
4
- export * from './sqb-adapter.js';
5
- export * from './sqb-collection-resource.js';
6
- export * from './sqb-entity-service.js';
7
- export * from './sqb-singleton-resource.js';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ require("./augmentation/document-factory.augmentation.js");
5
+ require("./augmentation/mapped-type.augmentation.js");
6
+ require("./augmentation/union-type.augmentation.js");
7
+ tslib_1.__exportStar(require("./sqb-adapter.js"), exports);
8
+ tslib_1.__exportStar(require("./sqb-collection-resource.js"), exports);
9
+ tslib_1.__exportStar(require("./sqb-entity-service.js"), exports);
10
+ tslib_1.__exportStar(require("./sqb-singleton-resource.js"), exports);
@@ -1,208 +1,115 @@
1
- import isNil from 'lodash.isnil';
2
- import omitBy from 'lodash.omitby';
3
- import { convertFilter } from './convert-filter.js';
4
- export var SQBAdapter;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQBAdapter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const lodash_isnil_1 = tslib_1.__importDefault(require("lodash.isnil"));
6
+ const lodash_omitby_1 = tslib_1.__importDefault(require("lodash.omitby"));
7
+ const common_1 = require("@opra/common");
8
+ const connect_1 = require("@sqb/connect");
9
+ const transform_filter_js_1 = tslib_1.__importDefault(require("./transform-filter.js"));
10
+ const transform_key_values_js_1 = tslib_1.__importDefault(require("./transform-key-values.js"));
11
+ var SQBAdapter;
5
12
  (function (SQBAdapter) {
6
- SQBAdapter.parseFilter = convertFilter;
7
- function parseCollectionCreateRequest(request) {
8
- /* istanbul ignore next */
9
- if (!(request.resourceKind === 'Collection' && request.operation === 'create'))
10
- throw new TypeError('"Request" is not a "CollectionCreateRequest"');
11
- const { args } = request;
12
- return {
13
- method: 'create',
14
- data: args.data,
15
- options: omitBy({
16
- pick: args.pick?.length ? args.pick : undefined,
17
- omit: args.omit?.length ? args.omit : undefined,
18
- include: args.include?.length ? args.include : undefined,
19
- }, isNil)
20
- };
21
- }
22
- SQBAdapter.parseCollectionCreateRequest = parseCollectionCreateRequest;
23
- function parseCollectionDeleteRequest(request) {
24
- /* istanbul ignore next */
25
- if (!(request.resourceKind === 'Collection' && request.operation === 'delete'))
26
- throw new TypeError('"Request" is not a "CollectionDeleteRequest"');
27
- const { args } = request;
28
- return {
29
- method: 'destroy',
30
- key: args.key,
31
- options: {}
32
- };
33
- }
34
- SQBAdapter.parseCollectionDeleteRequest = parseCollectionDeleteRequest;
35
- function parseCollectionDeleteManyRequest(request) {
36
- /* istanbul ignore next */
37
- if (!(request.resourceKind === 'Collection' && request.operation === 'deleteMany'))
38
- throw new TypeError('"Request" is not a "CollectionDeleteManyRequest"');
39
- const { args } = request;
40
- return {
41
- method: 'destroyAll',
42
- options: omitBy({
43
- filter: SQBAdapter.parseFilter(args.filter)
44
- }, isNil)
45
- };
46
- }
47
- SQBAdapter.parseCollectionDeleteManyRequest = parseCollectionDeleteManyRequest;
48
- function parseCollectionGetRequest(request) {
49
- /* istanbul ignore next */
50
- if (!(request.resourceKind === 'Collection' && request.operation === 'get'))
51
- throw new TypeError('"Request" is not a "CollectionGetRequest"');
52
- const { args } = request;
53
- return {
54
- method: 'findByPk',
55
- key: args.key,
56
- options: omitBy({
57
- pick: args.pick?.length ? args.pick : undefined,
58
- omit: args.omit?.length ? args.omit : undefined,
59
- include: args.include?.length ? args.include : undefined,
60
- }, isNil)
61
- };
62
- }
63
- SQBAdapter.parseCollectionGetRequest = parseCollectionGetRequest;
64
- function parseCollectionUpdateRequest(request) {
65
- /* istanbul ignore next */
66
- if (!(request.resourceKind === 'Collection' && request.operation === 'update'))
67
- throw new TypeError('"Request" is not a "CollectionUpdateRequest"');
68
- const { args } = request;
69
- return {
70
- method: 'update',
71
- key: args.key,
72
- data: args.data,
73
- options: omitBy({
74
- pick: args.pick?.length ? args.pick : undefined,
75
- omit: args.omit?.length ? args.omit : undefined,
76
- include: args.include?.length ? args.include : undefined,
77
- }, isNil)
78
- };
79
- }
80
- SQBAdapter.parseCollectionUpdateRequest = parseCollectionUpdateRequest;
81
- function parseCollectionUpdateManyRequest(request) {
82
- /* istanbul ignore next */
83
- if (!(request.resourceKind === 'Collection' && request.operation === 'updateMany'))
84
- throw new TypeError('"Request" is not a "CollectionUpdateManyRequest"');
85
- const { args } = request;
86
- return {
87
- method: 'updateAll',
88
- data: args.data,
89
- options: omitBy({
90
- filter: SQBAdapter.parseFilter(args.filter)
91
- }, isNil)
92
- };
93
- }
94
- SQBAdapter.parseCollectionUpdateManyRequest = parseCollectionUpdateManyRequest;
95
- function parseCollectionSearchRequest(request) {
96
- /* istanbul ignore next */
97
- if (!(request.resourceKind === 'Collection' && request.operation === 'search'))
98
- throw new TypeError('"Request" is not a "CollectionSearchRequest"');
99
- const { args } = request;
100
- return {
101
- method: 'findAll',
102
- options: omitBy({
103
- pick: args.pick?.length ? args.pick : undefined,
104
- omit: args.omit?.length ? args.omit : undefined,
105
- include: args.include?.length ? args.include : undefined,
106
- sort: args.sort?.length ? args.sort : undefined,
107
- limit: args.limit,
108
- offset: args.skip,
109
- distinct: args.distinct,
110
- count: args.count,
111
- filter: SQBAdapter.parseFilter(args.filter)
112
- }, isNil)
113
- };
114
- }
115
- SQBAdapter.parseCollectionSearchRequest = parseCollectionSearchRequest;
116
- function parseSingletonGetRequest(request) {
117
- /* istanbul ignore next */
118
- if (!(request.resourceKind === 'Singleton' && request.operation === 'get'))
119
- throw new TypeError('"Request" is not a "SingletonGetRequest"');
120
- const { args } = request;
121
- return {
122
- method: 'findOne',
123
- options: omitBy({
124
- pick: args.pick?.length ? args.pick : undefined,
125
- omit: args.omit?.length ? args.omit : undefined,
126
- include: args.include?.length ? args.include : undefined,
127
- }, isNil)
128
- };
129
- }
130
- SQBAdapter.parseSingletonGetRequest = parseSingletonGetRequest;
131
- function parseSingletonCreateRequest(request) {
132
- /* istanbul ignore next */
133
- if (!(request.resourceKind === 'Singleton' && request.operation === 'create'))
134
- throw new TypeError('"Request" is not a "SingletonCreateRequest"');
135
- const { args } = request;
136
- return {
137
- method: 'create',
138
- data: args.data,
139
- options: omitBy({
140
- pick: args.pick?.length ? args.pick : undefined,
141
- omit: args.omit?.length ? args.omit : undefined,
142
- include: args.include?.length ? args.include : undefined,
143
- }, isNil)
144
- };
145
- }
146
- SQBAdapter.parseSingletonCreateRequest = parseSingletonCreateRequest;
147
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
148
- function parseSingletonDeleteRequest(request) {
149
- /* istanbul ignore next */
150
- if (!(request.resourceKind === 'Singleton' && request.operation === 'delete'))
151
- throw new TypeError('"Request" is not a "SingletonDeleteRequest"');
152
- return {
153
- method: 'destroyAll',
154
- options: {},
155
- };
156
- }
157
- SQBAdapter.parseSingletonDeleteRequest = parseSingletonDeleteRequest;
158
- function parseSingletonUpdateRequest(request) {
159
- /* istanbul ignore next */
160
- if (!(request.resourceKind === 'Singleton' && request.operation === 'update'))
161
- throw new TypeError('"Request" is not a "SingletonUpdateRequest"');
162
- const { args } = request;
163
- return {
164
- method: 'updateAll',
165
- data: args.data,
166
- options: omitBy({
167
- pick: args.pick?.length ? args.pick : undefined,
168
- omit: args.omit?.length ? args.omit : undefined,
169
- include: args.include?.length ? args.include : undefined,
170
- }, isNil)
171
- };
172
- }
173
- SQBAdapter.parseSingletonUpdateRequest = parseSingletonUpdateRequest;
174
- function parseRequest(request) {
175
- if (request.resourceKind === 'Collection') {
176
- switch (request.operation) {
177
- case 'create':
178
- return parseCollectionCreateRequest(request);
179
- case 'get':
180
- return parseCollectionGetRequest(request);
181
- case 'delete':
182
- return parseCollectionDeleteRequest(request);
183
- case 'deleteMany':
184
- return parseCollectionDeleteManyRequest(request);
185
- case 'update':
186
- return parseCollectionUpdateRequest(request);
187
- case 'updateMany':
188
- return parseCollectionUpdateManyRequest(request);
189
- case 'search':
190
- return parseCollectionSearchRequest(request);
13
+ SQBAdapter.transformFilter = transform_filter_js_1.default;
14
+ SQBAdapter.transformKeyValues = transform_key_values_js_1.default;
15
+ function transformRequest(request) {
16
+ const { resource } = request;
17
+ if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
18
+ const { args, operation } = request;
19
+ let options = {};
20
+ const entityMetadata = connect_1.EntityMetadata.get(resource.type.ctor);
21
+ if (!entityMetadata)
22
+ throw new Error(`Type class "${resource.type.ctor}" is not an SQB entity`);
23
+ if (resource instanceof common_1.Collection) {
24
+ const primaryIndex = entityMetadata.indexes.find(x => x.primary);
25
+ // Check if resource primary keys are same with entity
26
+ const primaryKeys = [...(primaryIndex && primaryIndex.columns) || []];
27
+ if (primaryKeys.sort().join() !== [...resource.primaryKey].sort().join())
28
+ throw new Error('Resource primaryKey definition differs from SQB Entity primaryKey definition');
191
29
  }
192
- }
193
- else if (request.resourceKind === 'Singleton') {
194
- switch (request.operation) {
195
- case 'create':
196
- return parseSingletonCreateRequest(request);
197
- case 'delete':
198
- return parseSingletonDeleteRequest(request);
199
- case 'get':
200
- return parseSingletonGetRequest(request);
201
- case 'update':
202
- return parseSingletonUpdateRequest(request);
30
+ if (operation === 'create' || operation === 'update' ||
31
+ operation === 'get' || operation === 'findMany') {
32
+ options.pick = args.pick?.length ? args.pick : undefined;
33
+ options.omit = args.omit?.length ? args.omit : undefined;
34
+ options.include = args.include?.length ? args.include : undefined;
35
+ }
36
+ if (args.filter) {
37
+ options.filter = SQBAdapter.transformFilter(args.filter);
38
+ }
39
+ if (operation === 'findMany') {
40
+ options.sort = args.sort?.length ? args.sort : undefined;
41
+ options.limit = args.limit;
42
+ options.offset = args.skip;
43
+ options.distinct = args.distinct;
44
+ options.count = args.count;
45
+ }
46
+ options = (0, lodash_omitby_1.default)(options, lodash_isnil_1.default);
47
+ if (operation === 'create') {
48
+ return {
49
+ method: 'create',
50
+ data: args.data,
51
+ options,
52
+ args: [args.data, options]
53
+ };
54
+ }
55
+ if (operation === 'deleteMany' || (operation === 'delete' && resource instanceof common_1.Singleton)) {
56
+ return {
57
+ method: 'deleteMany',
58
+ options,
59
+ args: [options]
60
+ };
61
+ }
62
+ if (operation === 'delete') {
63
+ return {
64
+ method: 'delete',
65
+ key: args.key,
66
+ options,
67
+ args: [args.key, options]
68
+ };
69
+ }
70
+ if (operation === 'get') {
71
+ if (resource instanceof common_1.Singleton)
72
+ return {
73
+ method: 'findOne',
74
+ options,
75
+ args: [options]
76
+ };
77
+ return {
78
+ method: 'find',
79
+ key: args.key,
80
+ options,
81
+ args: [args.key, options]
82
+ };
83
+ }
84
+ if (operation === 'findMany') {
85
+ const out = {
86
+ method: 'findMany',
87
+ options,
88
+ args: [options]
89
+ };
90
+ if (args.count)
91
+ out.count = args.count;
92
+ return out;
93
+ }
94
+ if (operation === 'updateMany' || (operation === 'update' && resource instanceof common_1.Singleton)) {
95
+ return {
96
+ method: 'updateMany',
97
+ data: args.data,
98
+ options,
99
+ args: [args.data, options]
100
+ };
101
+ }
102
+ if (operation === 'update') {
103
+ return {
104
+ method: 'update',
105
+ key: args.key,
106
+ data: args.data,
107
+ options,
108
+ args: [args.key, args.data, options]
109
+ };
203
110
  }
204
111
  }
205
- throw new Error(`Unimplemented request method "${request.method}"`);
112
+ throw new Error(`Unimplemented request method "${request.operation}"`);
206
113
  }
207
- SQBAdapter.parseRequest = parseRequest;
208
- })(SQBAdapter || (SQBAdapter = {}));
114
+ SQBAdapter.transformRequest = transformRequest;
115
+ })(SQBAdapter = exports.SQBAdapter || (exports.SQBAdapter = {}));