@opra/mongodb 0.22.0 → 0.23.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/cjs/mongo-adapter.js +16 -17
- package/cjs/mongo-collection-resource.js +2 -2
- package/cjs/mongo-singleton-resource.js +1 -0
- package/cjs/transform-projection.js +3 -3
- package/esm/mongo-adapter.js +16 -17
- package/esm/mongo-collection-resource.js +3 -3
- package/esm/mongo-singleton-resource.js +1 -0
- package/esm/transform-projection.js +3 -3
- package/package.json +3 -3
- package/types/mongo-collection-resource.d.ts +14 -12
- package/types/mongo-entity-service.d.ts +9 -9
- package/types/mongo-singleton-resource.d.ts +7 -7
- package/types/transform-projection.d.ts +1 -1
package/cjs/mongo-adapter.js
CHANGED
|
@@ -20,36 +20,36 @@ var MongoAdapter;
|
|
|
20
20
|
function transformRequest(request) {
|
|
21
21
|
const { resource } = request;
|
|
22
22
|
if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
|
|
23
|
-
const {
|
|
23
|
+
const { params, operation } = request;
|
|
24
24
|
let options = {};
|
|
25
25
|
let filter;
|
|
26
26
|
if (operation === 'create' || operation === 'update' ||
|
|
27
27
|
operation === 'get' || operation === 'findMany') {
|
|
28
|
-
options.projection = MongoAdapter.transformProjection(resource.type,
|
|
28
|
+
options.projection = MongoAdapter.transformProjection(resource.type, params);
|
|
29
29
|
}
|
|
30
30
|
if (resource instanceof common_1.Collection &&
|
|
31
31
|
(operation === 'delete' || operation === 'get' || operation === 'update')) {
|
|
32
|
-
filter = MongoAdapter.transformKeyValues(resource,
|
|
32
|
+
filter = MongoAdapter.transformKeyValues(resource, request.key);
|
|
33
33
|
}
|
|
34
|
-
if (
|
|
35
|
-
const f = MongoAdapter.transformFilter(
|
|
34
|
+
if (params?.filter) {
|
|
35
|
+
const f = MongoAdapter.transformFilter(params.filter);
|
|
36
36
|
filter = filter ? { $and: [filter, f] } : f;
|
|
37
37
|
}
|
|
38
38
|
if (operation === 'findMany') {
|
|
39
|
-
options.sort =
|
|
40
|
-
options.limit =
|
|
41
|
-
options.skip =
|
|
42
|
-
options.distinct =
|
|
43
|
-
options.count =
|
|
39
|
+
options.sort = params?.sort;
|
|
40
|
+
options.limit = params?.limit;
|
|
41
|
+
options.skip = params?.skip;
|
|
42
|
+
options.distinct = params?.distinct;
|
|
43
|
+
options.count = params?.count;
|
|
44
44
|
}
|
|
45
45
|
options = (0, lodash_omitby_1.default)(options, lodash_isnil_1.default);
|
|
46
46
|
switch (operation) {
|
|
47
47
|
case 'create': {
|
|
48
48
|
return {
|
|
49
49
|
method: 'insertOne',
|
|
50
|
-
data:
|
|
50
|
+
data: request.data,
|
|
51
51
|
options,
|
|
52
|
-
args: [
|
|
52
|
+
args: [request.data, options]
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
case 'delete':
|
|
@@ -76,12 +76,11 @@ var MongoAdapter;
|
|
|
76
76
|
options,
|
|
77
77
|
args: [filter, options]
|
|
78
78
|
};
|
|
79
|
-
|
|
80
|
-
out.count = args.count;
|
|
79
|
+
out.count = params?.count;
|
|
81
80
|
return out;
|
|
82
81
|
}
|
|
83
82
|
case 'update': {
|
|
84
|
-
const update = MongoAdapter.transformPatch(
|
|
83
|
+
const update = MongoAdapter.transformPatch(request.data);
|
|
85
84
|
filter = filter || {};
|
|
86
85
|
return {
|
|
87
86
|
method: 'updateOne',
|
|
@@ -92,7 +91,7 @@ var MongoAdapter;
|
|
|
92
91
|
};
|
|
93
92
|
}
|
|
94
93
|
case 'updateMany': {
|
|
95
|
-
const update = MongoAdapter.transformPatch(
|
|
94
|
+
const update = MongoAdapter.transformPatch(request.data);
|
|
96
95
|
return {
|
|
97
96
|
method: 'updateMany',
|
|
98
97
|
filter,
|
|
@@ -103,7 +102,7 @@ var MongoAdapter;
|
|
|
103
102
|
}
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
|
-
throw new TypeError(`Unimplemented request kind (${request.
|
|
105
|
+
throw new TypeError(`Unimplemented request kind (${request.resource.kind}.${request.operation})`);
|
|
107
106
|
}
|
|
108
107
|
MongoAdapter.transformRequest = transformRequest;
|
|
109
108
|
})(MongoAdapter || (exports.MongoAdapter = MongoAdapter = {}));
|
|
@@ -6,9 +6,9 @@ const common_1 = require("@opra/common");
|
|
|
6
6
|
const core_1 = require("@opra/core");
|
|
7
7
|
const mongo_adapter_js_1 = require("./mongo-adapter.js");
|
|
8
8
|
// noinspection TypeScriptAbstractClassConstructorCanBeMadeProtected
|
|
9
|
-
class MongoCollectionResource
|
|
9
|
+
class MongoCollectionResource {
|
|
10
10
|
constructor(options) {
|
|
11
|
-
|
|
11
|
+
this.defaultLimit = options?.defaultLimit || 100;
|
|
12
12
|
}
|
|
13
13
|
async create(ctx) {
|
|
14
14
|
const prepared = mongo_adapter_js_1.MongoAdapter.transformRequest(ctx.request);
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MongoSingletonResource = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const common_1 = require("@opra/common");
|
|
6
|
+
const core_1 = require("@opra/core");
|
|
6
7
|
const mongo_adapter_js_1 = require("./mongo-adapter.js");
|
|
7
8
|
class MongoSingletonResource {
|
|
8
9
|
constructor() {
|
|
@@ -5,9 +5,9 @@ const common_1 = require("@opra/common");
|
|
|
5
5
|
function transformProjection(dataType, args) {
|
|
6
6
|
const out = {};
|
|
7
7
|
// omitExclusiveFields(dataType, out);
|
|
8
|
-
const pick = args
|
|
9
|
-
const include = !args
|
|
10
|
-
const omit = args
|
|
8
|
+
const pick = args?.pick && (0, common_1.pathToObjectTree)(args.include ? [...args.pick, ...args.include] : args.pick);
|
|
9
|
+
const include = !args?.pick && args?.include && (0, common_1.pathToObjectTree)(args.include);
|
|
10
|
+
const omit = args?.omit && (0, common_1.pathToObjectTree)(args.omit);
|
|
11
11
|
if (pick || include) {
|
|
12
12
|
_transformInclusionProjection(dataType, out, pick, include, omit);
|
|
13
13
|
}
|
package/esm/mongo-adapter.js
CHANGED
|
@@ -16,36 +16,36 @@ export var MongoAdapter;
|
|
|
16
16
|
function transformRequest(request) {
|
|
17
17
|
const { resource } = request;
|
|
18
18
|
if (resource instanceof Collection || resource instanceof Singleton) {
|
|
19
|
-
const {
|
|
19
|
+
const { params, operation } = request;
|
|
20
20
|
let options = {};
|
|
21
21
|
let filter;
|
|
22
22
|
if (operation === 'create' || operation === 'update' ||
|
|
23
23
|
operation === 'get' || operation === 'findMany') {
|
|
24
|
-
options.projection = MongoAdapter.transformProjection(resource.type,
|
|
24
|
+
options.projection = MongoAdapter.transformProjection(resource.type, params);
|
|
25
25
|
}
|
|
26
26
|
if (resource instanceof Collection &&
|
|
27
27
|
(operation === 'delete' || operation === 'get' || operation === 'update')) {
|
|
28
|
-
filter = MongoAdapter.transformKeyValues(resource,
|
|
28
|
+
filter = MongoAdapter.transformKeyValues(resource, request.key);
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
31
|
-
const f = MongoAdapter.transformFilter(
|
|
30
|
+
if (params?.filter) {
|
|
31
|
+
const f = MongoAdapter.transformFilter(params.filter);
|
|
32
32
|
filter = filter ? { $and: [filter, f] } : f;
|
|
33
33
|
}
|
|
34
34
|
if (operation === 'findMany') {
|
|
35
|
-
options.sort =
|
|
36
|
-
options.limit =
|
|
37
|
-
options.skip =
|
|
38
|
-
options.distinct =
|
|
39
|
-
options.count =
|
|
35
|
+
options.sort = params?.sort;
|
|
36
|
+
options.limit = params?.limit;
|
|
37
|
+
options.skip = params?.skip;
|
|
38
|
+
options.distinct = params?.distinct;
|
|
39
|
+
options.count = params?.count;
|
|
40
40
|
}
|
|
41
41
|
options = omitBy(options, isNil);
|
|
42
42
|
switch (operation) {
|
|
43
43
|
case 'create': {
|
|
44
44
|
return {
|
|
45
45
|
method: 'insertOne',
|
|
46
|
-
data:
|
|
46
|
+
data: request.data,
|
|
47
47
|
options,
|
|
48
|
-
args: [
|
|
48
|
+
args: [request.data, options]
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
case 'delete':
|
|
@@ -72,12 +72,11 @@ export var MongoAdapter;
|
|
|
72
72
|
options,
|
|
73
73
|
args: [filter, options]
|
|
74
74
|
};
|
|
75
|
-
|
|
76
|
-
out.count = args.count;
|
|
75
|
+
out.count = params?.count;
|
|
77
76
|
return out;
|
|
78
77
|
}
|
|
79
78
|
case 'update': {
|
|
80
|
-
const update = MongoAdapter.transformPatch(
|
|
79
|
+
const update = MongoAdapter.transformPatch(request.data);
|
|
81
80
|
filter = filter || {};
|
|
82
81
|
return {
|
|
83
82
|
method: 'updateOne',
|
|
@@ -88,7 +87,7 @@ export var MongoAdapter;
|
|
|
88
87
|
};
|
|
89
88
|
}
|
|
90
89
|
case 'updateMany': {
|
|
91
|
-
const update = MongoAdapter.transformPatch(
|
|
90
|
+
const update = MongoAdapter.transformPatch(request.data);
|
|
92
91
|
return {
|
|
93
92
|
method: 'updateMany',
|
|
94
93
|
filter,
|
|
@@ -99,7 +98,7 @@ export var MongoAdapter;
|
|
|
99
98
|
}
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
|
-
throw new TypeError(`Unimplemented request kind (${request.
|
|
101
|
+
throw new TypeError(`Unimplemented request kind (${request.resource.kind}.${request.operation})`);
|
|
103
102
|
}
|
|
104
103
|
MongoAdapter.transformRequest = transformRequest;
|
|
105
104
|
})(MongoAdapter || (MongoAdapter = {}));
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { Collection } from '@opra/common';
|
|
3
|
-
import {
|
|
3
|
+
import { OperationContext } from '@opra/core';
|
|
4
4
|
import { MongoAdapter } from './mongo-adapter.js';
|
|
5
5
|
// noinspection TypeScriptAbstractClassConstructorCanBeMadeProtected
|
|
6
|
-
export class MongoCollectionResource
|
|
6
|
+
export class MongoCollectionResource {
|
|
7
7
|
constructor(options) {
|
|
8
|
-
|
|
8
|
+
this.defaultLimit = options?.defaultLimit || 100;
|
|
9
9
|
}
|
|
10
10
|
async create(ctx) {
|
|
11
11
|
const prepared = MongoAdapter.transformRequest(ctx.request);
|
|
@@ -2,9 +2,9 @@ import { ComplexType, pathToObjectTree } from '@opra/common';
|
|
|
2
2
|
export default function transformProjection(dataType, args) {
|
|
3
3
|
const out = {};
|
|
4
4
|
// omitExclusiveFields(dataType, out);
|
|
5
|
-
const pick = args
|
|
6
|
-
const include = !args
|
|
7
|
-
const omit = args
|
|
5
|
+
const pick = args?.pick && pathToObjectTree(args.include ? [...args.pick, ...args.include] : args.pick);
|
|
6
|
+
const include = !args?.pick && args?.include && pathToObjectTree(args.include);
|
|
7
|
+
const omit = args?.omit && pathToObjectTree(args.omit);
|
|
8
8
|
if (pick || include) {
|
|
9
9
|
_transformInclusionProjection(dataType, out, pick, include, omit);
|
|
10
10
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opra/mongodb",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Opra MongoDB adapter package",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"ts-gems": "^2.4.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@opra/common": "^0.
|
|
37
|
-
"@opra/core": "^0.
|
|
36
|
+
"@opra/common": "^0.23.0",
|
|
37
|
+
"@opra/core": "^0.23.0",
|
|
38
38
|
"mongodb": ">=4.x.x"
|
|
39
39
|
},
|
|
40
40
|
"type": "module",
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import mongodb from 'mongodb';
|
|
2
2
|
import { Maybe } from 'ts-gems';
|
|
3
|
-
import { PartialOutput } from '@opra/common';
|
|
4
|
-
import {
|
|
3
|
+
import { Collection, CollectionResource, PartialOutput } from '@opra/common';
|
|
4
|
+
import { OperationContext } from '@opra/core';
|
|
5
5
|
import { MongoEntityService } from './mongo-entity-service.js';
|
|
6
6
|
export declare namespace MongoCollectionResource {
|
|
7
|
-
interface Options
|
|
7
|
+
interface Options {
|
|
8
|
+
defaultLimit?: number;
|
|
8
9
|
}
|
|
9
10
|
}
|
|
10
|
-
export declare abstract class MongoCollectionResource<T extends mongodb.Document
|
|
11
|
+
export declare abstract class MongoCollectionResource<T extends mongodb.Document> implements CollectionResource<T> {
|
|
12
|
+
defaultLimit?: number;
|
|
11
13
|
constructor(options?: MongoCollectionResource.Options);
|
|
12
|
-
create(ctx:
|
|
13
|
-
delete(ctx:
|
|
14
|
-
deleteMany(ctx:
|
|
15
|
-
get(ctx:
|
|
16
|
-
update(ctx:
|
|
17
|
-
updateMany(ctx:
|
|
18
|
-
findMany(ctx:
|
|
19
|
-
abstract getService(ctx:
|
|
14
|
+
create?(ctx: Collection.Create.Context): Promise<PartialOutput<T>>;
|
|
15
|
+
delete?(ctx: OperationContext): Promise<number>;
|
|
16
|
+
deleteMany?(ctx: OperationContext): Promise<number>;
|
|
17
|
+
get?(ctx: OperationContext): Promise<Maybe<PartialOutput<T>>>;
|
|
18
|
+
update?(ctx: OperationContext): Promise<Maybe<PartialOutput<T>>>;
|
|
19
|
+
updateMany?(ctx: OperationContext): Promise<number>;
|
|
20
|
+
findMany?(ctx: OperationContext): Promise<PartialOutput<T>[]>;
|
|
21
|
+
abstract getService(ctx: OperationContext): MongoEntityService<T> | Promise<MongoEntityService<T>>;
|
|
20
22
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import mongodb, { UpdateFilter } from 'mongodb';
|
|
2
2
|
import { StrictOmit } from 'ts-gems';
|
|
3
|
-
import {
|
|
3
|
+
import { OperationContext, PartialOutput } from '@opra/core';
|
|
4
4
|
export declare namespace MongoEntityService {
|
|
5
5
|
interface Options {
|
|
6
6
|
db?: mongodb.Db;
|
|
7
7
|
defaultLimit?: number;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
export declare class MongoEntityService<T extends mongodb.Document
|
|
10
|
+
export declare class MongoEntityService<T extends mongodb.Document> {
|
|
11
11
|
protected _collectionName: string;
|
|
12
|
-
context:
|
|
12
|
+
context: OperationContext;
|
|
13
13
|
defaultLimit: number;
|
|
14
14
|
db?: mongodb.Db;
|
|
15
15
|
session?: mongodb.ClientSession;
|
|
@@ -18,16 +18,16 @@ export declare class MongoEntityService<T extends mongodb.Document, TOutput = Pa
|
|
|
18
18
|
count(filter?: mongodb.Filter<T>, options?: mongodb.CountOptions): Promise<number>;
|
|
19
19
|
deleteOne(filter?: mongodb.Filter<T>, options?: mongodb.DeleteOptions): Promise<number>;
|
|
20
20
|
deleteMany(filter?: mongodb.Filter<T>, options?: mongodb.DeleteOptions): Promise<number>;
|
|
21
|
-
findOne(filter: mongodb.Filter<T>, options?: mongodb.FindOptions): Promise<
|
|
22
|
-
find(filter: mongodb.Filter<T>, options?: mongodb.FindOptions): Promise<
|
|
23
|
-
insertOne(doc: mongodb.OptionalUnlessRequiredId<T>, options?: mongodb.InsertOneOptions): Promise<
|
|
24
|
-
updateOne(filter: mongodb.Filter<T>, doc: UpdateFilter<T> | Partial<T>, options?: mongodb.UpdateOptions): Promise<
|
|
21
|
+
findOne(filter: mongodb.Filter<T>, options?: mongodb.FindOptions): Promise<PartialOutput<T> | undefined>;
|
|
22
|
+
find(filter: mongodb.Filter<T>, options?: mongodb.FindOptions): Promise<PartialOutput<T>[]>;
|
|
23
|
+
insertOne(doc: mongodb.OptionalUnlessRequiredId<T>, options?: mongodb.InsertOneOptions): Promise<PartialOutput<T>>;
|
|
24
|
+
updateOne(filter: mongodb.Filter<T>, doc: UpdateFilter<T> | Partial<T>, options?: mongodb.UpdateOptions): Promise<PartialOutput<T> | undefined>;
|
|
25
25
|
updateMany(filter: mongodb.Filter<T>, doc: UpdateFilter<T> | Partial<T>, options?: StrictOmit<mongodb.UpdateOptions, 'upsert'>): Promise<number>;
|
|
26
|
-
with(context:
|
|
26
|
+
with(context: OperationContext, db?: mongodb.Db, session?: mongodb.ClientSession): MongoEntityService<T>;
|
|
27
27
|
protected _onError(error: unknown): Promise<void>;
|
|
28
28
|
protected getDatabase(): mongodb.Db | Promise<mongodb.Db>;
|
|
29
29
|
protected getCollection(db: mongodb.Db): Promise<mongodb.Collection<T>>;
|
|
30
30
|
protected getCollectionName(): string;
|
|
31
31
|
protected onError?(error: unknown): void | Promise<void>;
|
|
32
|
-
protected transformData?(row:
|
|
32
|
+
protected transformData?(row: PartialOutput<T>): PartialOutput<T>;
|
|
33
33
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import mongodb from 'mongodb';
|
|
2
2
|
import { Maybe } from 'ts-gems';
|
|
3
3
|
import { PartialOutput } from '@opra/common';
|
|
4
|
-
import {
|
|
4
|
+
import { OperationContext } from '@opra/core';
|
|
5
5
|
import { MongoEntityService } from './mongo-entity-service.js';
|
|
6
|
-
export declare abstract class MongoSingletonResource<T extends mongodb.Document
|
|
6
|
+
export declare abstract class MongoSingletonResource<T extends mongodb.Document> {
|
|
7
7
|
defaultLimit: number;
|
|
8
|
-
create(ctx:
|
|
9
|
-
delete(ctx:
|
|
10
|
-
get(ctx:
|
|
11
|
-
update(ctx:
|
|
12
|
-
abstract getService(ctx:
|
|
8
|
+
create?(ctx: OperationContext): Promise<PartialOutput<T>>;
|
|
9
|
+
delete?(ctx: OperationContext): Promise<number>;
|
|
10
|
+
get?(ctx: OperationContext): Promise<Maybe<PartialOutput<T>>>;
|
|
11
|
+
update?(ctx: OperationContext): Promise<Maybe<PartialOutput<T>>>;
|
|
12
|
+
abstract getService(ctx: OperationContext): MongoEntityService<T> | Promise<MongoEntityService<T>>;
|
|
13
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import mongodb from 'mongodb';
|
|
2
2
|
import { ComplexType } from '@opra/common';
|
|
3
|
-
export default function transformProjection(dataType: ComplexType, args
|
|
3
|
+
export default function transformProjection(dataType: ComplexType, args?: {
|
|
4
4
|
pick?: string[];
|
|
5
5
|
omit?: string[];
|
|
6
6
|
include?: string[];
|