@opra/mongodb 0.31.4 → 0.31.5
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/cjs/{transform-filter.js → adapter-utils/prepare-filter.js} +22 -9
- package/cjs/adapter-utils/prepare-key-values.js +21 -0
- package/cjs/{transform-patch.js → adapter-utils/prepare-patch.js} +5 -5
- package/cjs/{transform-projection.js → adapter-utils/prepare-projection.js} +11 -11
- package/cjs/{transform-sort.js → adapter-utils/prepare-sort.js} +2 -2
- package/cjs/index.js +3 -4
- package/cjs/mongo-adapter.js +10 -100
- package/cjs/mongo-collection-service.js +131 -0
- package/cjs/{mongo-entity-service-base.js → mongo-service.js} +47 -69
- package/cjs/mongo-singleton-service.js +88 -0
- package/esm/{transform-filter.js → adapter-utils/prepare-filter.js} +21 -8
- package/esm/adapter-utils/prepare-key-values.js +17 -0
- package/esm/{transform-patch.js → adapter-utils/prepare-patch.js} +4 -4
- package/esm/{transform-projection.js → adapter-utils/prepare-projection.js} +7 -7
- package/esm/{transform-sort.js → adapter-utils/prepare-sort.js} +1 -1
- package/esm/index.js +3 -4
- package/esm/mongo-adapter.js +10 -100
- package/esm/mongo-collection-service.js +126 -0
- package/esm/{mongo-entity-service-base.js → mongo-service.js} +45 -67
- package/esm/mongo-singleton-service.js +83 -0
- package/package.json +4 -7
- package/types/adapter-utils/prepare-filter.d.ts +4 -0
- package/types/adapter-utils/prepare-key-values.d.ts +1 -0
- package/types/adapter-utils/prepare-patch.d.ts +1 -0
- package/types/adapter-utils/prepare-projection.d.ts +9 -0
- package/types/adapter-utils/prepare-sort.d.ts +2 -0
- package/types/index.d.ts +3 -4
- package/types/mongo-adapter.d.ts +10 -19
- package/types/mongo-collection-service.d.ts +70 -0
- package/types/mongo-service.d.ts +39 -0
- package/types/mongo-singleton-service.d.ts +48 -0
- package/cjs/mongo-collection.js +0 -79
- package/cjs/mongo-entity-service.js +0 -34
- package/cjs/mongo-singleton.js +0 -44
- package/cjs/transform-key-values.js +0 -14
- package/esm/mongo-collection.js +0 -75
- package/esm/mongo-entity-service.js +0 -30
- package/esm/mongo-singleton.js +0 -40
- package/esm/transform-key-values.js +0 -11
- package/types/mongo-collection.d.ts +0 -32
- package/types/mongo-entity-service-base.d.ts +0 -32
- package/types/mongo-entity-service.d.ts +0 -20
- package/types/mongo-singleton.d.ts +0 -19
- package/types/transform-filter.d.ts +0 -3
- package/types/transform-key-values.d.ts +0 -3
- package/types/transform-patch.d.ts +0 -1
- package/types/transform-projection.d.ts +0 -9
- package/types/transform-sort.d.ts +0 -2
|
@@ -12,7 +12,18 @@ const opMap = {
|
|
|
12
12
|
'in': '$in',
|
|
13
13
|
'!in': '$nin',
|
|
14
14
|
};
|
|
15
|
-
function
|
|
15
|
+
function prepareFilter(filter) {
|
|
16
|
+
if (!filter)
|
|
17
|
+
return;
|
|
18
|
+
if (typeof filter === 'string')
|
|
19
|
+
return prepareFilterAst(common_1.OpraFilter.parse(filter));
|
|
20
|
+
else if (filter instanceof common_1.OpraFilter.Expression)
|
|
21
|
+
return prepareFilterAst(filter);
|
|
22
|
+
else
|
|
23
|
+
return filter;
|
|
24
|
+
}
|
|
25
|
+
exports.default = prepareFilter;
|
|
26
|
+
function prepareFilterAst(ast, negative) {
|
|
16
27
|
if (!ast)
|
|
17
28
|
return;
|
|
18
29
|
if (ast instanceof common_1.OpraFilter.QualifiedIdentifier) {
|
|
@@ -27,21 +38,24 @@ function transformFilter(ast, negative) {
|
|
|
27
38
|
return ast.value;
|
|
28
39
|
}
|
|
29
40
|
if (ast instanceof common_1.OpraFilter.ArrayExpression) {
|
|
30
|
-
return ast.items.map(x =>
|
|
41
|
+
return ast.items.map(x => prepareFilterAst(x, negative));
|
|
31
42
|
}
|
|
32
43
|
if (ast instanceof common_1.OpraFilter.NegativeExpression) {
|
|
33
|
-
return
|
|
44
|
+
return prepareFilterAst(ast.expression, !negative);
|
|
34
45
|
}
|
|
35
46
|
if (ast instanceof common_1.OpraFilter.LogicalExpression) {
|
|
47
|
+
const items = ast.items
|
|
48
|
+
.map(x => prepareFilterAst(x, negative))
|
|
49
|
+
.filter(x => x != null);
|
|
36
50
|
if (ast.op === 'or')
|
|
37
|
-
return { $or:
|
|
38
|
-
return { $and:
|
|
51
|
+
return { $or: items };
|
|
52
|
+
return { $and: items };
|
|
39
53
|
}
|
|
40
54
|
if (ast instanceof common_1.OpraFilter.ParenthesizedExpression) {
|
|
41
|
-
return
|
|
55
|
+
return prepareFilterAst(ast.expression, negative);
|
|
42
56
|
}
|
|
43
57
|
if (ast instanceof common_1.OpraFilter.ComparisonExpression) {
|
|
44
|
-
const left =
|
|
58
|
+
const left = prepareFilterAst(ast.left, negative);
|
|
45
59
|
if (ast.right instanceof common_1.OpraFilter.QualifiedIdentifier) {
|
|
46
60
|
const op = opMap[ast.op];
|
|
47
61
|
if (op)
|
|
@@ -49,7 +63,7 @@ function transformFilter(ast, negative) {
|
|
|
49
63
|
/* istanbul ignore next */
|
|
50
64
|
throw new Error(`Invalid filter query.`);
|
|
51
65
|
}
|
|
52
|
-
let right =
|
|
66
|
+
let right = prepareFilterAst(ast.right);
|
|
53
67
|
if (right == null) {
|
|
54
68
|
const op = ast.op === '='
|
|
55
69
|
? (negative ? '!=' : '=')
|
|
@@ -107,5 +121,4 @@ function transformFilter(ast, negative) {
|
|
|
107
121
|
}
|
|
108
122
|
throw new Error(`${ast.kind} is not implemented yet`);
|
|
109
123
|
}
|
|
110
|
-
exports.default = transformFilter;
|
|
111
124
|
const wrapNot = (o, negative) => negative ? { $not: o } : o;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const putil_isplainobject_1 = tslib_1.__importDefault(require("putil-isplainobject"));
|
|
5
|
+
const defaultPrimaryKey = ['_id'];
|
|
6
|
+
function prepareKeyValues(keyValue, primaryKey) {
|
|
7
|
+
primaryKey = primaryKey || defaultPrimaryKey;
|
|
8
|
+
const b = (0, putil_isplainobject_1.default)(keyValue);
|
|
9
|
+
if (primaryKey.length > 1 && !b)
|
|
10
|
+
new TypeError(`Argument "keyValue" must be an object that contains all key values`);
|
|
11
|
+
if (primaryKey.length > 1 || b) {
|
|
12
|
+
return primaryKey.reduce((o, k) => {
|
|
13
|
+
o[k] = keyValue[k];
|
|
14
|
+
if (o[k] == null)
|
|
15
|
+
new Error(`Value of key "${k}" is required`);
|
|
16
|
+
return o;
|
|
17
|
+
}, {});
|
|
18
|
+
}
|
|
19
|
+
return { [primaryKey[0]]: keyValue };
|
|
20
|
+
}
|
|
21
|
+
exports.default = prepareKeyValues;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function
|
|
3
|
+
function preparePatch(doc) {
|
|
4
4
|
const trg = {};
|
|
5
|
-
|
|
5
|
+
_preparePatch(doc, trg);
|
|
6
6
|
return trg;
|
|
7
7
|
}
|
|
8
|
-
exports.default =
|
|
9
|
-
function
|
|
8
|
+
exports.default = preparePatch;
|
|
9
|
+
function _preparePatch(src, trg = {}, path = '') {
|
|
10
10
|
let fieldName;
|
|
11
11
|
for (const [k, v] of Object.entries(src)) {
|
|
12
12
|
fieldName = k.startsWith('*') ? k.substring(1) : k;
|
|
@@ -19,7 +19,7 @@ function _transformPatch(src, trg = {}, path = '') {
|
|
|
19
19
|
if (v && typeof v === 'object') {
|
|
20
20
|
// If field name starts with "*", do "replace" operation except "merge"
|
|
21
21
|
if (!k.startsWith('*')) {
|
|
22
|
-
|
|
22
|
+
_preparePatch(v, trg, key);
|
|
23
23
|
continue;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports._prepareExclusionProjection = exports._prepareInclusionProjection = void 0;
|
|
4
4
|
const common_1 = require("@opra/common");
|
|
5
|
-
function
|
|
5
|
+
function prepareProjection(dataType, args) {
|
|
6
6
|
const out = {};
|
|
7
7
|
// omitExclusiveFields(dataType, out);
|
|
8
8
|
const pick = args?.pick && (0, common_1.pathToObjectTree)(args.include ? [...args.pick, ...args.include] : args.pick);
|
|
9
9
|
const include = !args?.pick && args?.include && (0, common_1.pathToObjectTree)(args.include);
|
|
10
10
|
const omit = args?.omit && (0, common_1.pathToObjectTree)(args.omit);
|
|
11
11
|
if (pick || include) {
|
|
12
|
-
|
|
12
|
+
_prepareInclusionProjection(dataType, out, pick, include, omit);
|
|
13
13
|
}
|
|
14
14
|
else
|
|
15
|
-
|
|
15
|
+
_prepareExclusionProjection(dataType, out, omit, !omit);
|
|
16
16
|
return Object.keys(out).length ? out : undefined;
|
|
17
17
|
}
|
|
18
|
-
exports.default =
|
|
19
|
-
function
|
|
18
|
+
exports.default = prepareProjection;
|
|
19
|
+
function _prepareInclusionProjection(dataType, target, pick, include, omit, defaultFields) {
|
|
20
20
|
defaultFields = defaultFields ?? !pick;
|
|
21
21
|
let n;
|
|
22
22
|
for (const [k, f] of dataType.fields.entries()) {
|
|
@@ -27,26 +27,26 @@ function _transformInclusionProjection(dataType, target, pick, include, omit, de
|
|
|
27
27
|
if (n) {
|
|
28
28
|
if (f.type instanceof common_1.ComplexType && (typeof n === 'object' || typeof omit?.[k] === 'object')) {
|
|
29
29
|
target[k] = {};
|
|
30
|
-
|
|
30
|
+
_prepareInclusionProjection(f.type, target[k], pick?.[k] || include?.[k], undefined, omit?.[k], defaultFields);
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
33
|
target[k] = 1;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
exports.
|
|
38
|
-
function
|
|
37
|
+
exports._prepareInclusionProjection = _prepareInclusionProjection;
|
|
38
|
+
function _prepareExclusionProjection(dataType, target, omit, omitExclusiveFields) {
|
|
39
39
|
let n;
|
|
40
40
|
for (const [k, f] of dataType.fields.entries()) {
|
|
41
41
|
n = omit?.[k] || (omitExclusiveFields && f.exclusive);
|
|
42
42
|
if (n) {
|
|
43
43
|
if (f.type instanceof common_1.ComplexType && typeof n === 'object') {
|
|
44
44
|
target[k] = {};
|
|
45
|
-
|
|
45
|
+
_prepareExclusionProjection(f.type, target[k], omit?.[k], omitExclusiveFields);
|
|
46
46
|
continue;
|
|
47
47
|
}
|
|
48
48
|
target[k] = 0;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
exports.
|
|
52
|
+
exports._prepareExclusionProjection = _prepareExclusionProjection;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function
|
|
3
|
+
function prepareSort(sort) {
|
|
4
4
|
if (!(sort && sort.length))
|
|
5
5
|
return;
|
|
6
6
|
const out = {};
|
|
@@ -14,4 +14,4 @@ function transformSort(sort) {
|
|
|
14
14
|
});
|
|
15
15
|
return out;
|
|
16
16
|
}
|
|
17
|
-
exports.default =
|
|
17
|
+
exports.default = prepareSort;
|
package/cjs/index.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./mongo-adapter.js"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./mongo-collection.js"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./mongo-
|
|
7
|
-
tslib_1.__exportStar(require("./mongo-
|
|
8
|
-
tslib_1.__exportStar(require("./mongo-singleton.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./mongo-collection-service.js"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./mongo-service.js"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./mongo-singleton-service.js"), exports);
|
package/cjs/mongo-adapter.js
CHANGED
|
@@ -2,106 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MongoAdapter = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const transform_patch_js_1 = tslib_1.__importDefault(require("./transform-patch.js"));
|
|
11
|
-
const transform_projection_js_1 = tslib_1.__importDefault(require("./transform-projection.js"));
|
|
12
|
-
const transform_sort_js_1 = tslib_1.__importDefault(require("./transform-sort.js"));
|
|
5
|
+
const prepare_filter_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-filter.js"));
|
|
6
|
+
const prepare_key_values_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-key-values.js"));
|
|
7
|
+
const prepare_patch_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-patch.js"));
|
|
8
|
+
const prepare_projection_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-projection.js"));
|
|
9
|
+
const prepare_sort_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-sort.js"));
|
|
13
10
|
var MongoAdapter;
|
|
14
11
|
(function (MongoAdapter) {
|
|
15
|
-
MongoAdapter.
|
|
16
|
-
MongoAdapter.
|
|
17
|
-
MongoAdapter.
|
|
18
|
-
MongoAdapter.
|
|
19
|
-
MongoAdapter.
|
|
20
|
-
function transformRequest(request) {
|
|
21
|
-
const { resource } = request;
|
|
22
|
-
if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
|
|
23
|
-
const { params, endpoint } = request;
|
|
24
|
-
let options = {};
|
|
25
|
-
let filter;
|
|
26
|
-
const operation = endpoint.name;
|
|
27
|
-
if (operation === 'create' || operation === 'update' ||
|
|
28
|
-
operation === 'get' || operation === 'findMany') {
|
|
29
|
-
options.projection = MongoAdapter.transformProjection(resource.type, params);
|
|
30
|
-
}
|
|
31
|
-
if (resource instanceof common_1.Collection &&
|
|
32
|
-
(operation === 'delete' || operation === 'get' || operation === 'update')) {
|
|
33
|
-
filter = MongoAdapter.transformKeyValues(resource, request.key);
|
|
34
|
-
}
|
|
35
|
-
if (params?.filter) {
|
|
36
|
-
const f = MongoAdapter.transformFilter(params.filter);
|
|
37
|
-
filter = filter ? { $and: [filter, f] } : f;
|
|
38
|
-
}
|
|
39
|
-
if (operation === 'findMany') {
|
|
40
|
-
options.sort = params?.sort;
|
|
41
|
-
options.limit = params?.limit;
|
|
42
|
-
options.skip = params?.skip;
|
|
43
|
-
options.distinct = params?.distinct;
|
|
44
|
-
options.count = params?.count;
|
|
45
|
-
}
|
|
46
|
-
options = (0, lodash_omitby_1.default)(options, lodash_isnil_1.default);
|
|
47
|
-
switch (operation) {
|
|
48
|
-
case 'create': {
|
|
49
|
-
return {
|
|
50
|
-
method: 'insertOne',
|
|
51
|
-
data: request.data,
|
|
52
|
-
options,
|
|
53
|
-
args: [request.data, options]
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
case 'delete':
|
|
57
|
-
case 'deleteMany': {
|
|
58
|
-
return {
|
|
59
|
-
method: (operation === 'delete' ? 'deleteOne' : 'deleteMany'),
|
|
60
|
-
filter,
|
|
61
|
-
options,
|
|
62
|
-
args: [filter, options]
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
case 'get': {
|
|
66
|
-
return {
|
|
67
|
-
method: 'findOne',
|
|
68
|
-
filter,
|
|
69
|
-
options,
|
|
70
|
-
args: [filter, options]
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
case 'findMany': {
|
|
74
|
-
return {
|
|
75
|
-
method: 'find',
|
|
76
|
-
filter,
|
|
77
|
-
options,
|
|
78
|
-
args: [filter, options]
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case 'update': {
|
|
82
|
-
const data = MongoAdapter.transformPatch(request.data);
|
|
83
|
-
filter = filter || {};
|
|
84
|
-
return {
|
|
85
|
-
method: 'updateOne',
|
|
86
|
-
filter,
|
|
87
|
-
data,
|
|
88
|
-
options,
|
|
89
|
-
args: [filter, data, options]
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
case 'updateMany': {
|
|
93
|
-
const data = MongoAdapter.transformPatch(request.data);
|
|
94
|
-
return {
|
|
95
|
-
method: 'updateMany',
|
|
96
|
-
filter,
|
|
97
|
-
data,
|
|
98
|
-
options,
|
|
99
|
-
args: [filter, data, options]
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
throw new TypeError(`Unimplemented request kind (${request.resource.kind}.${request.endpoint.name})`);
|
|
105
|
-
}
|
|
106
|
-
MongoAdapter.transformRequest = transformRequest;
|
|
12
|
+
MongoAdapter.prepareKeyValues = prepare_key_values_js_1.default;
|
|
13
|
+
MongoAdapter.prepareFilter = prepare_filter_js_1.default;
|
|
14
|
+
MongoAdapter.preparePatch = prepare_patch_js_1.default;
|
|
15
|
+
MongoAdapter.prepareProjection = prepare_projection_js_1.default;
|
|
16
|
+
MongoAdapter.prepareSort = prepare_sort_js_1.default;
|
|
107
17
|
})(MongoAdapter || (exports.MongoAdapter = MongoAdapter = {}));
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MongoCollectionService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const lodash_omit_1 = tslib_1.__importDefault(require("lodash.omit"));
|
|
6
|
+
const common_1 = require("@opra/common");
|
|
7
|
+
const mongo_adapter_js_1 = require("./mongo-adapter.js");
|
|
8
|
+
const mongo_service_js_1 = require("./mongo-service.js");
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @class MongoCollectionService
|
|
12
|
+
*/
|
|
13
|
+
class MongoCollectionService extends mongo_service_js_1.MongoService {
|
|
14
|
+
constructor(dataType, options) {
|
|
15
|
+
super(dataType, options);
|
|
16
|
+
this.defaultLimit = options?.defaultLimit || 10;
|
|
17
|
+
this.keyFields = options?.keyField ?
|
|
18
|
+
(Array.isArray(options.keyField) ? options.keyField : [options.keyField]) : undefined;
|
|
19
|
+
}
|
|
20
|
+
async create(doc, options) {
|
|
21
|
+
const r = await this._rawInsertOne(doc, options);
|
|
22
|
+
if (r.insertedId) {
|
|
23
|
+
const out = await this.get(r.insertedId, options);
|
|
24
|
+
if (out)
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
/* istanbul ignore next */
|
|
28
|
+
throw new Error('Unknown error while creating document');
|
|
29
|
+
}
|
|
30
|
+
async count(options) {
|
|
31
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter) || {};
|
|
32
|
+
return this._rawCountDocuments(filter, (0, lodash_omit_1.default)(options, 'filter'));
|
|
33
|
+
}
|
|
34
|
+
async delete(id, options) {
|
|
35
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareKeyValues(id, this.keyFields);
|
|
36
|
+
const optionsFilter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter);
|
|
37
|
+
if (optionsFilter)
|
|
38
|
+
filter.$and = [...(Array.isArray(optionsFilter) ? optionsFilter : [optionsFilter])];
|
|
39
|
+
const r = await this._rawDeleteOne(filter, options);
|
|
40
|
+
return r.deletedCount;
|
|
41
|
+
}
|
|
42
|
+
async deleteMany(options) {
|
|
43
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter) || {};
|
|
44
|
+
const r = await this._rawDeleteMany(filter, (0, lodash_omit_1.default)(options, 'filter'));
|
|
45
|
+
return r.deletedCount;
|
|
46
|
+
}
|
|
47
|
+
async get(id, options) {
|
|
48
|
+
const out = await this.findOne(id, options);
|
|
49
|
+
if (!out)
|
|
50
|
+
throw new common_1.ResourceNotFoundError(this.resourceName || this.getCollectionName(), id);
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
async findOne(id, options) {
|
|
54
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareKeyValues(id, this.keyFields);
|
|
55
|
+
const optionsFilter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter);
|
|
56
|
+
if (optionsFilter)
|
|
57
|
+
filter.$and = [...(Array.isArray(optionsFilter) ? optionsFilter : [optionsFilter])];
|
|
58
|
+
const mongoOptions = {
|
|
59
|
+
...(0, lodash_omit_1.default)(options, ['sort', 'skip', 'limit', 'filter']),
|
|
60
|
+
projection: mongo_adapter_js_1.MongoAdapter.prepareProjection(this.getDataType(), options),
|
|
61
|
+
};
|
|
62
|
+
const out = await this._rawFindOne(filter, mongoOptions);
|
|
63
|
+
if (out) {
|
|
64
|
+
if (this.transformData)
|
|
65
|
+
return this.transformData(out);
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async findMany(options) {
|
|
70
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter) || {};
|
|
71
|
+
const [items, count] = await Promise.all([
|
|
72
|
+
// Promise that returns items
|
|
73
|
+
Promise.resolve().then(async () => {
|
|
74
|
+
const cursor = await this._rawFind(filter, {
|
|
75
|
+
...(0, lodash_omit_1.default)(options, 'filter'),
|
|
76
|
+
sort: options?.sort ? mongo_adapter_js_1.MongoAdapter.prepareSort(options.sort) : undefined,
|
|
77
|
+
projection: mongo_adapter_js_1.MongoAdapter.prepareProjection(this.getDataType(), options)
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
const out = [];
|
|
81
|
+
let obj;
|
|
82
|
+
while (out.length < this.defaultLimit && (obj = await cursor.next())) {
|
|
83
|
+
const v = this.transformData ? this.transformData(obj) : obj;
|
|
84
|
+
if (v)
|
|
85
|
+
out.push(obj);
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await cursor.close();
|
|
91
|
+
}
|
|
92
|
+
}),
|
|
93
|
+
// Promise that returns count
|
|
94
|
+
(options?.count ? this.count(options) : Promise.resolve()),
|
|
95
|
+
]);
|
|
96
|
+
if (options?.count)
|
|
97
|
+
this.context.response.totalMatches = count || 0;
|
|
98
|
+
return items;
|
|
99
|
+
}
|
|
100
|
+
async update(id, doc, options) {
|
|
101
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareKeyValues(id, this.keyFields);
|
|
102
|
+
const optionsFilter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter);
|
|
103
|
+
if (optionsFilter)
|
|
104
|
+
filter.$and = [...(Array.isArray(optionsFilter) ? optionsFilter : [optionsFilter])];
|
|
105
|
+
// Prevent updating _id field
|
|
106
|
+
delete doc._id;
|
|
107
|
+
const patch = mongo_adapter_js_1.MongoAdapter.preparePatch(doc);
|
|
108
|
+
const mongoOptions = {
|
|
109
|
+
...options,
|
|
110
|
+
upsert: undefined
|
|
111
|
+
};
|
|
112
|
+
const r = await this._rawUpdateOne(filter, patch, mongoOptions);
|
|
113
|
+
if (r.modifiedCount)
|
|
114
|
+
return await this.get(filter, options);
|
|
115
|
+
if (r.upsertedCount)
|
|
116
|
+
return await this.get(r.upsertedId, options);
|
|
117
|
+
}
|
|
118
|
+
async updateMany(doc, options) {
|
|
119
|
+
// Prevent updating _id field
|
|
120
|
+
delete doc._id;
|
|
121
|
+
const patch = mongo_adapter_js_1.MongoAdapter.preparePatch(doc);
|
|
122
|
+
const mongoOptions = {
|
|
123
|
+
...(0, lodash_omit_1.default)(options, 'filter'),
|
|
124
|
+
upsert: undefined
|
|
125
|
+
};
|
|
126
|
+
const filter = mongo_adapter_js_1.MongoAdapter.prepareFilter(options?.filter) || {};
|
|
127
|
+
const r = await this._rawUpdateMany(filter, patch, mongoOptions);
|
|
128
|
+
return r.matchedCount;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.MongoCollectionService = MongoCollectionService;
|