@feathersjs/mongodb 5.0.0-pre.32 → 5.0.0-pre.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **schema:** Check for undefined value in resolveQueryObjectId resolver ([#2914](https://github.com/feathersjs/feathers/issues/2914)) ([d9449fa](https://github.com/feathersjs/feathers/commit/d9449fa835f58fc9cec5f7254c50219494129140))
11
+
12
+ ### Features
13
+
14
+ - **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4))
15
+
16
+ # [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08)
17
+
18
+ ### Features
19
+
20
+ - **mongodb:** Add ObjectId resolvers and MongoDB option in the guide ([#2847](https://github.com/feathersjs/feathers/issues/2847)) ([c5c1fba](https://github.com/feathersjs/feathers/commit/c5c1fba5718a63412075cd3838b86b889eb0bd48))
21
+
6
22
  # [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26)
7
23
 
8
24
  **Note:** Version bump only for package @feathersjs/mongodb
package/lib/adapter.d.ts CHANGED
@@ -1,18 +1,21 @@
1
- import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions } from 'mongodb';
1
+ import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions, Document } from 'mongodb';
2
2
  import { AdapterBase, AdapterParams, AdapterServiceOptions, PaginationOptions, AdapterQuery } from '@feathersjs/adapter-commons';
3
- import { NullableId, Id, Paginated } from '@feathersjs/feathers';
3
+ import { Id, Paginated } from '@feathersjs/feathers';
4
4
  export interface MongoDBAdapterOptions extends AdapterServiceOptions {
5
5
  Model: Collection | Promise<Collection>;
6
6
  disableObjectify?: boolean;
7
7
  useEstimatedDocumentCount?: boolean;
8
8
  }
9
9
  export interface MongoDBAdapterParams<Q = AdapterQuery> extends AdapterParams<Q, Partial<MongoDBAdapterOptions>> {
10
+ pipeline?: Document[];
10
11
  mongodb?: BulkWriteOptions | FindOptions | InsertOneOptions | DeleteOptions | CountDocumentsOptions | ReplaceOptions;
11
12
  }
12
- export declare class MongoDbAdapter<T, D = Partial<T>, P extends MongoDBAdapterParams<any> = MongoDBAdapterParams> extends AdapterBase<T, D, P, MongoDBAdapterOptions> {
13
+ export type AdapterId = Id | ObjectId;
14
+ export type NullableAdapterId = AdapterId | null;
15
+ export declare class MongoDbAdapter<Result, Data = Partial<Result>, ServiceParams extends MongoDBAdapterParams<any> = MongoDBAdapterParams, PatchData = Partial<Data>> extends AdapterBase<Result, Data, PatchData, ServiceParams, MongoDBAdapterOptions, AdapterId> {
13
16
  constructor(options: MongoDBAdapterOptions);
14
- getObjectId(id: Id | ObjectId): Id | ObjectId;
15
- filterQuery(id: NullableId, params: P): {
17
+ getObjectId(id: AdapterId): AdapterId;
18
+ filterQuery(id: NullableAdapterId, params: ServiceParams): {
16
19
  filters: {
17
20
  $select: string[];
18
21
  $sort: {
@@ -25,29 +28,33 @@ export declare class MongoDbAdapter<T, D = Partial<T>, P extends MongoDBAdapterP
25
28
  [key: string]: any;
26
29
  };
27
30
  };
31
+ getModel(params: ServiceParams): Promise<Collection<Document>>;
32
+ findRaw(params: ServiceParams): Promise<import("mongodb").FindCursor<import("mongodb").WithId<Document>>>;
33
+ aggregateRaw(params: ServiceParams): Promise<import("mongodb").AggregationCursor<Document>>;
34
+ makeFeathersPipeline(params: ServiceParams): Document[];
28
35
  getSelect(select: string[] | {
29
36
  [key: string]: number;
30
37
  }): {
31
38
  [key: string]: number;
32
39
  };
33
- $findOrGet(id: NullableId, params: P): Promise<T | Paginated<T> | T[]>;
34
- normalizeId(id: NullableId, data: Partial<D>): Partial<D>;
35
- $get(id: Id, params?: P): Promise<T>;
36
- $find(params?: P & {
40
+ _findOrGet(id: NullableAdapterId, params: ServiceParams): Promise<Result | Paginated<Result> | Result[]>;
41
+ normalizeId<D>(id: NullableAdapterId, data: D): D;
42
+ _get(id: AdapterId, params?: ServiceParams): Promise<Result>;
43
+ _find(params?: ServiceParams & {
37
44
  paginate?: PaginationOptions;
38
- }): Promise<Paginated<T>>;
39
- $find(params?: P & {
45
+ }): Promise<Paginated<Result>>;
46
+ _find(params?: ServiceParams & {
40
47
  paginate: false;
41
- }): Promise<T[]>;
42
- $find(params?: P): Promise<Paginated<T> | T[]>;
43
- $create(data: D, params?: P): Promise<T>;
44
- $create(data: D[], params?: P): Promise<T[]>;
45
- $create(data: D | D[], _params?: P): Promise<T | T[]>;
46
- $patch(id: null, data: Partial<D>, params?: P): Promise<T[]>;
47
- $patch(id: Id, data: Partial<D>, params?: P): Promise<T>;
48
- $patch(id: NullableId, data: Partial<D>, _params?: P): Promise<T | T[]>;
49
- $update(id: Id, data: D, params?: P): Promise<T>;
50
- $remove(id: null, params?: P): Promise<T[]>;
51
- $remove(id: Id, params?: P): Promise<T>;
52
- $remove(id: NullableId, _params?: P): Promise<T | T[]>;
48
+ }): Promise<Result[]>;
49
+ _find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>;
50
+ _create(data: Data, params?: ServiceParams): Promise<Result>;
51
+ _create(data: Data[], params?: ServiceParams): Promise<Result[]>;
52
+ _create(data: Data | Data[], _params?: ServiceParams): Promise<Result | Result[]>;
53
+ _patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>;
54
+ _patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise<Result>;
55
+ _patch(id: NullableAdapterId, data: PatchData, _params?: ServiceParams): Promise<Result | Result[]>;
56
+ _update(id: AdapterId, data: Data, params?: ServiceParams): Promise<Result>;
57
+ _remove(id: null, params?: ServiceParams): Promise<Result[]>;
58
+ _remove(id: AdapterId, params?: ServiceParams): Promise<Result>;
59
+ _remove(id: NullableAdapterId, _params?: ServiceParams): Promise<Result | Result[]>;
53
60
  }
package/lib/adapter.js CHANGED
@@ -41,6 +41,54 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
41
41
  query
42
42
  };
43
43
  }
44
+ getModel(params) {
45
+ const { Model } = this.getOptions(params);
46
+ return Promise.resolve(Model);
47
+ }
48
+ async findRaw(params) {
49
+ const { filters, query } = this.filterQuery(null, params);
50
+ const model = await this.getModel(params);
51
+ const q = model.find(query, { ...params.mongodb });
52
+ if (filters.$select !== undefined) {
53
+ q.project(this.getSelect(filters.$select));
54
+ }
55
+ if (filters.$sort !== undefined) {
56
+ q.sort(filters.$sort);
57
+ }
58
+ if (filters.$skip !== undefined) {
59
+ q.skip(filters.$skip);
60
+ }
61
+ if (filters.$limit !== undefined) {
62
+ q.limit(filters.$limit);
63
+ }
64
+ return q;
65
+ }
66
+ async aggregateRaw(params) {
67
+ const model = await this.getModel(params);
68
+ const pipeline = params.pipeline || [];
69
+ const index = pipeline.findIndex((stage) => stage.$feathers);
70
+ const before = index >= 0 ? pipeline.slice(0, index) : [];
71
+ const feathersPipeline = this.makeFeathersPipeline(params);
72
+ const after = index >= 0 ? pipeline.slice(index + 1) : pipeline;
73
+ return model.aggregate([...before, ...feathersPipeline, ...after]);
74
+ }
75
+ makeFeathersPipeline(params) {
76
+ const { filters, query } = this.filterQuery(null, params);
77
+ const pipeline = [{ $match: query }];
78
+ if (filters.$select !== undefined) {
79
+ pipeline.push({ $project: this.getSelect(filters.$select) });
80
+ }
81
+ if (filters.$sort !== undefined) {
82
+ pipeline.push({ $sort: filters.$sort });
83
+ }
84
+ if (filters.$skip !== undefined) {
85
+ pipeline.push({ $skip: filters.$skip });
86
+ }
87
+ if (filters.$limit !== undefined) {
88
+ pipeline.push({ $limit: filters.$limit });
89
+ }
90
+ return pipeline;
91
+ }
44
92
  getSelect(select) {
45
93
  if (Array.isArray(select)) {
46
94
  return select.reduce((value, name) => ({
@@ -50,8 +98,8 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
50
98
  }
51
99
  return select;
52
100
  }
53
- async $findOrGet(id, params) {
54
- return id === null ? await this.$find(params) : await this.$get(id, params);
101
+ async _findOrGet(id, params) {
102
+ return id === null ? await this._find(params) : await this._get(id, params);
55
103
  }
56
104
  normalizeId(id, data) {
57
105
  if (this.id === '_id') {
@@ -69,8 +117,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
69
117
  }
70
118
  return data;
71
119
  }
72
- async $get(id, params = {}) {
73
- const { Model } = this.getOptions(params);
120
+ async _get(id, params = {}) {
74
121
  const { query, filters: { $select } } = this.filterQuery(id, params);
75
122
  const projection = $select
76
123
  ? {
@@ -84,7 +131,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
84
131
  ...params.mongodb,
85
132
  ...projection
86
133
  };
87
- return Promise.resolve(Model)
134
+ return this.getModel(params)
88
135
  .then((model) => model.findOne(query, findOptions))
89
136
  .then((data) => {
90
137
  if (data == null) {
@@ -94,42 +141,37 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
94
141
  })
95
142
  .catch(error_handler_1.errorHandler);
96
143
  }
97
- async $find(params = {}) {
144
+ async _find(params = {}) {
145
+ const { paginate, useEstimatedDocumentCount } = this.getOptions(params);
98
146
  const { filters, query } = this.filterQuery(null, params);
99
- const { paginate, Model, useEstimatedDocumentCount } = this.getOptions(params);
100
- const findOptions = { ...params.mongodb };
101
- const model = await Promise.resolve(Model);
102
- const q = model.find(query, findOptions);
103
- if (filters.$select !== undefined) {
104
- q.project(this.getSelect(filters.$select));
105
- }
106
- if (filters.$sort !== undefined) {
107
- q.sort(filters.$sort);
108
- }
109
- if (filters.$limit !== undefined) {
110
- q.limit(filters.$limit);
111
- }
112
- if (filters.$skip !== undefined) {
113
- q.skip(filters.$skip);
114
- }
115
- const runQuery = async (total) => ({
147
+ const useAggregation = !params.mongodb && filters.$limit !== 0;
148
+ const countDocuments = async () => {
149
+ if (paginate && paginate.default) {
150
+ const model = await this.getModel(params);
151
+ if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
152
+ return model.estimatedDocumentCount();
153
+ }
154
+ else {
155
+ return model.countDocuments(query, { ...params.mongodb });
156
+ }
157
+ }
158
+ return Promise.resolve(0);
159
+ };
160
+ const [request, total] = await Promise.all([
161
+ useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
162
+ countDocuments()
163
+ ]);
164
+ const page = {
116
165
  total,
117
166
  limit: filters.$limit,
118
167
  skip: filters.$skip || 0,
119
- data: filters.$limit === 0 ? [] : (await q.toArray())
120
- });
121
- if (paginate && paginate.default) {
122
- if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
123
- return model.estimatedDocumentCount().then(runQuery);
124
- }
125
- return model.countDocuments(query, findOptions).then(runQuery);
126
- }
127
- return runQuery(0).then((page) => page.data);
168
+ data: filters.$limit === 0 ? [] : (await request.toArray())
169
+ };
170
+ return paginate && paginate.default ? page : page.data;
128
171
  }
129
- async $create(data, params = {}) {
172
+ async _create(data, params = {}) {
130
173
  const writeOptions = params.mongodb;
131
- const { Model } = this.getOptions(params);
132
- const model = await Promise.resolve(Model);
174
+ const model = await this.getModel(params);
133
175
  const setId = (item) => {
134
176
  const entry = Object.assign({}, item);
135
177
  // Generate a MongoId if we use a custom id
@@ -150,10 +192,12 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
150
192
  .then(async (result) => model.findOne({ _id: result.insertedId }, params.mongodb));
151
193
  return promise.then((0, adapter_commons_1.select)(params, this.id)).catch(error_handler_1.errorHandler);
152
194
  }
153
- async $patch(id, _data, params = {}) {
195
+ async _patch(id, _data, params = {}) {
196
+ if (id === null && !this.allowsMulti('patch', params)) {
197
+ throw new errors_1.MethodNotAllowed('Can not patch multiple entries');
198
+ }
154
199
  const data = this.normalizeId(id, _data);
155
- const { Model } = this.getOptions(params);
156
- const model = await Promise.resolve(Model);
200
+ const model = await this.getModel(params);
157
201
  const { query, filters: { $select } } = this.filterQuery(id, params);
158
202
  const updateOptions = { ...params.mongodb };
159
203
  const modifier = Object.keys(data).reduce((current, key) => {
@@ -169,7 +213,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
169
213
  }
170
214
  return current;
171
215
  }, {});
172
- const originalIds = await this.$findOrGet(id, {
216
+ const originalIds = await this._findOrGet(id, {
173
217
  ...params,
174
218
  query: {
175
219
  ...query,
@@ -188,19 +232,23 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
188
232
  }
189
233
  };
190
234
  await model.updateMany(query, modifier, updateOptions);
191
- return this.$findOrGet(id, findParams).catch(error_handler_1.errorHandler);
235
+ return this._findOrGet(id, findParams).catch(error_handler_1.errorHandler);
192
236
  }
193
- async $update(id, data, params = {}) {
194
- const { Model } = this.getOptions(params);
195
- const model = await Promise.resolve(Model);
237
+ async _update(id, data, params = {}) {
238
+ if (id === null || Array.isArray(data)) {
239
+ throw new errors_1.BadRequest("You can not replace multiple instances. Did you mean 'patch'?");
240
+ }
241
+ const model = await this.getModel(params);
196
242
  const { query } = this.filterQuery(id, params);
197
243
  const replaceOptions = { ...params.mongodb };
198
244
  await model.replaceOne(query, this.normalizeId(id, data), replaceOptions);
199
- return this.$findOrGet(id, params).catch(error_handler_1.errorHandler);
245
+ return this._findOrGet(id, params).catch(error_handler_1.errorHandler);
200
246
  }
201
- async $remove(id, params = {}) {
202
- const { Model } = this.getOptions(params);
203
- const model = await Promise.resolve(Model);
247
+ async _remove(id, params = {}) {
248
+ if (id === null && !this.allowsMulti('remove', params)) {
249
+ throw new errors_1.MethodNotAllowed('Can not remove multiple entries');
250
+ }
251
+ const model = await this.getModel(params);
204
252
  const { query, filters: { $select } } = this.filterQuery(id, params);
205
253
  const deleteOptions = { ...params.mongodb };
206
254
  const findParams = {
@@ -211,7 +259,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
211
259
  $select
212
260
  }
213
261
  };
214
- return this.$findOrGet(id, findParams)
262
+ return this._findOrGet(id, findParams)
215
263
  .then(async (items) => {
216
264
  await model.deleteMany(query, deleteOptions);
217
265
  return items;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,22 +1,23 @@
1
1
  import { PaginationOptions } from '@feathersjs/adapter-commons';
2
- import { Paginated, ServiceMethods, Id, Params } from '@feathersjs/feathers';
3
- import { MongoDbAdapter, MongoDBAdapterParams } from './adapter';
2
+ import { Paginated, Params } from '@feathersjs/feathers';
3
+ import { AdapterId, MongoDbAdapter, MongoDBAdapterParams } from './adapter';
4
4
  export * from './adapter';
5
5
  export * from './error-handler';
6
- export declare class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = MongoDBAdapterParams> extends MongoDbAdapter<T, D, P> implements ServiceMethods<T | Paginated<T>, D, P> {
7
- find(params?: P & {
6
+ export * from './resolvers';
7
+ export declare class MongoDBService<Result = any, Data = Partial<Result>, ServiceParams extends Params<any> = MongoDBAdapterParams, PatchData = Partial<Data>> extends MongoDbAdapter<Result, Data, ServiceParams, PatchData> {
8
+ find(params?: ServiceParams & {
8
9
  paginate?: PaginationOptions;
9
- }): Promise<Paginated<T>>;
10
- find(params?: P & {
10
+ }): Promise<Paginated<Result>>;
11
+ find(params?: ServiceParams & {
11
12
  paginate: false;
12
- }): Promise<T[]>;
13
- find(params?: P): Promise<Paginated<T> | T[]>;
14
- get(id: Id, params?: P): Promise<T>;
15
- create(data: D, params?: P): Promise<T>;
16
- create(data: D[], params?: P): Promise<T[]>;
17
- update(id: Id, data: D, params?: P): Promise<T>;
18
- patch(id: Id, data: Partial<D>, params?: P): Promise<T>;
19
- patch(id: null, data: Partial<D>, params?: P): Promise<T[]>;
20
- remove(id: Id, params?: P): Promise<T>;
21
- remove(id: null, params?: P): Promise<T[]>;
13
+ }): Promise<Result[]>;
14
+ find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>;
15
+ get(id: AdapterId, params?: ServiceParams): Promise<Result>;
16
+ create(data: Data, params?: ServiceParams): Promise<Result>;
17
+ create(data: Data[], params?: ServiceParams): Promise<Result[]>;
18
+ update(id: AdapterId, data: Data, params?: ServiceParams): Promise<Result>;
19
+ patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>;
20
+ patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise<Result>;
21
+ remove(id: AdapterId, params?: ServiceParams): Promise<Result>;
22
+ remove(id: null, params?: ServiceParams): Promise<Result[]>;
22
23
  }
package/lib/index.js CHANGED
@@ -15,27 +15,49 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.MongoDBService = void 0;
18
+ const lib_1 = require("@feathersjs/errors/lib");
18
19
  const adapter_1 = require("./adapter");
19
20
  __exportStar(require("./adapter"), exports);
20
21
  __exportStar(require("./error-handler"), exports);
22
+ __exportStar(require("./resolvers"), exports);
21
23
  class MongoDBService extends adapter_1.MongoDbAdapter {
22
24
  async find(params) {
23
- return this._find(params);
25
+ return this._find({
26
+ ...params,
27
+ query: await this.sanitizeQuery(params)
28
+ });
24
29
  }
25
30
  async get(id, params) {
26
- return this._get(id, params);
31
+ return this._get(id, {
32
+ ...params,
33
+ query: await this.sanitizeQuery(params)
34
+ });
27
35
  }
28
36
  async create(data, params) {
37
+ if (Array.isArray(data) && !this.allowsMulti('create', params)) {
38
+ throw new lib_1.MethodNotAllowed('Can not create multiple entries');
39
+ }
29
40
  return this._create(data, params);
30
41
  }
31
42
  async update(id, data, params) {
32
- return this._update(id, data, params);
43
+ return this._update(id, data, {
44
+ ...params,
45
+ query: await this.sanitizeQuery(params)
46
+ });
33
47
  }
34
48
  async patch(id, data, params) {
35
- return this._patch(id, data, params);
49
+ const { $limit, ...query } = await this.sanitizeQuery(params);
50
+ return this._patch(id, data, {
51
+ ...params,
52
+ query
53
+ });
36
54
  }
37
55
  async remove(id, params) {
38
- return this._remove(id, params);
56
+ const { $limit, ...query } = await this.sanitizeQuery(params);
57
+ return this._remove(id, {
58
+ ...params,
59
+ query
60
+ });
39
61
  }
40
62
  }
41
63
  exports.MongoDBService = MongoDBService;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,uCAAgE;AAEhE,4CAAyB;AACzB,kDAA+B;AAE/B,MAAa,cACX,SAAQ,wBAAuB;IAM/B,KAAK,CAAC,IAAI,CAAC,MAAU;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAQ,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAM,EAAE,MAAU;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,IAAa,EAAE,MAAU;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAM,EAAE,IAAO,EAAE,MAAU;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IAID,KAAK,CAAC,KAAK,CAAC,EAAc,EAAE,IAAgB,EAAE,MAAU;QACtD,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,EAAc,EAAE,MAAU;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;CACF;AApCD,wCAoCC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,gDAAyD;AAEzD,uCAA8F;AAE9F,4CAAyB;AACzB,kDAA+B;AAC/B,8CAA2B;AAE3B,MAAa,cAKX,SAAQ,wBAAsD;IAI9D,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAa,EAAE,MAAsB;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACnB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,IAAmB,EAAE,MAAsB;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC9D,MAAM,IAAI,sBAAgB,CAAC,iCAAiC,CAAC,CAAA;SAC9D;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAa,EAAE,IAAU,EAAE,MAAsB;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5B,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAID,KAAK,CAAC,KAAK,CAAC,EAAqB,EAAE,IAAe,EAAE,MAAsB;QACxE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE;YAC3B,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,EAAqB,EAAE,MAAsB;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;YACtB,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;CACF;AA7DD,wCA6DC"}
@@ -0,0 +1,10 @@
1
+ import { ObjectId } from 'mongodb';
2
+ export type ObjectIdParam = string | number | ObjectId;
3
+ export type IdQueryObject<T> = {
4
+ $in?: T[];
5
+ $nin?: T[];
6
+ $ne?: T;
7
+ };
8
+ export declare function resolveObjectId(value: ObjectIdParam): Promise<ObjectId>;
9
+ export declare function resolveQueryObjectId(value: IdQueryObject<ObjectIdParam>): Promise<IdQueryObject<ObjectId>>;
10
+ export declare function resolveQueryObjectId(value: ObjectIdParam): Promise<ObjectId>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveQueryObjectId = exports.resolveObjectId = void 0;
4
+ const mongodb_1 = require("mongodb");
5
+ const toObjectId = (value) => new mongodb_1.ObjectId(value);
6
+ async function resolveObjectId(value) {
7
+ return toObjectId(value);
8
+ }
9
+ exports.resolveObjectId = resolveObjectId;
10
+ async function resolveQueryObjectId(value) {
11
+ if (!value) {
12
+ return undefined;
13
+ }
14
+ if (typeof value === 'string' || typeof value === 'number' || value instanceof mongodb_1.ObjectId) {
15
+ return toObjectId(value);
16
+ }
17
+ const convertedObject = {};
18
+ if (Array.isArray(value.$in)) {
19
+ convertedObject.$in = value.$in.map(toObjectId);
20
+ }
21
+ if (Array.isArray(value.$nin)) {
22
+ convertedObject.$nin = value.$nin.map(toObjectId);
23
+ }
24
+ if (value.$ne !== undefined) {
25
+ convertedObject.$ne = toObjectId(value.$ne);
26
+ }
27
+ return convertedObject;
28
+ }
29
+ exports.resolveQueryObjectId = resolveQueryObjectId;
30
+ //# sourceMappingURL=resolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../src/resolvers.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAUlC,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,IAAI,kBAAQ,CAAC,KAAK,CAAC,CAAA;AAEzD,KAAK,UAAU,eAAe,CAAC,KAAoB;IACxD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAFD,0CAEC;AAMM,KAAK,UAAU,oBAAoB,CAAC,KAAmD;IAC5F,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,SAAS,CAAA;KACjB;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,kBAAQ,EAAE;QACvF,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;KACzB;IAED,MAAM,eAAe,GAA4B,EAAE,CAAA;IAEnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC5B,eAAe,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;KAChD;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QAC7B,eAAe,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;KAClD;IAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;QAC3B,eAAe,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KAC5C;IAED,OAAO,eAAe,CAAA;AACxB,CAAC;AAxBD,oDAwBC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feathersjs/mongodb",
3
3
  "description": "Feathers MongoDB service adapter",
4
- "version": "5.0.0-pre.32",
4
+ "version": "5.0.0-pre.34",
5
5
  "homepage": "https://feathersjs.com",
6
6
  "main": "lib/",
7
7
  "keywords": [
@@ -51,22 +51,22 @@
51
51
  "access": "public"
52
52
  },
53
53
  "dependencies": {
54
- "@feathersjs/adapter-commons": "^5.0.0-pre.32",
55
- "@feathersjs/commons": "^5.0.0-pre.32",
56
- "@feathersjs/errors": "^5.0.0-pre.32",
57
- "@feathersjs/feathers": "^5.0.0-pre.32"
54
+ "@feathersjs/adapter-commons": "^5.0.0-pre.34",
55
+ "@feathersjs/commons": "^5.0.0-pre.34",
56
+ "@feathersjs/errors": "^5.0.0-pre.34",
57
+ "@feathersjs/feathers": "^5.0.0-pre.34"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "mongodb": "^4.5.0"
61
61
  },
62
62
  "devDependencies": {
63
- "@feathersjs/adapter-tests": "^5.0.0-pre.32",
64
- "@types/mocha": "^10.0.0",
65
- "@types/node": "^18.8.2",
66
- "mocha": "^10.0.0",
67
- "mongodb-memory-server": "^8.9.3",
63
+ "@feathersjs/adapter-tests": "^5.0.0-pre.34",
64
+ "@types/mocha": "^10.0.1",
65
+ "@types/node": "^18.11.10",
66
+ "mocha": "^10.1.0",
67
+ "mongodb-memory-server": "^8.10.1",
68
68
  "shx": "^0.3.4",
69
- "typescript": "^4.8.4"
69
+ "typescript": "^4.9.3"
70
70
  },
71
- "gitHead": "b405e205fc6d9fbd42b42c7a3f30ea4bf33d121d"
71
+ "gitHead": "42cca600d00f0b3b9d89fa79be30fcd46bc50132"
72
72
  }
package/src/adapter.ts CHANGED
@@ -6,9 +6,10 @@ import {
6
6
  InsertOneOptions,
7
7
  DeleteOptions,
8
8
  CountDocumentsOptions,
9
- ReplaceOptions
9
+ ReplaceOptions,
10
+ Document
10
11
  } from 'mongodb'
11
- import { NotFound } from '@feathersjs/errors'
12
+ import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors'
12
13
  import { _ } from '@feathersjs/commons'
13
14
  import {
14
15
  AdapterBase,
@@ -18,7 +19,7 @@ import {
18
19
  PaginationOptions,
19
20
  AdapterQuery
20
21
  } from '@feathersjs/adapter-commons'
21
- import { NullableId, Id, Paginated } from '@feathersjs/feathers'
22
+ import { Id, Paginated } from '@feathersjs/feathers'
22
23
  import { errorHandler } from './error-handler'
23
24
 
24
25
  export interface MongoDBAdapterOptions extends AdapterServiceOptions {
@@ -29,6 +30,7 @@ export interface MongoDBAdapterOptions extends AdapterServiceOptions {
29
30
 
30
31
  export interface MongoDBAdapterParams<Q = AdapterQuery>
31
32
  extends AdapterParams<Q, Partial<MongoDBAdapterOptions>> {
33
+ pipeline?: Document[]
32
34
  mongodb?:
33
35
  | BulkWriteOptions
34
36
  | FindOptions
@@ -38,12 +40,17 @@ export interface MongoDBAdapterParams<Q = AdapterQuery>
38
40
  | ReplaceOptions
39
41
  }
40
42
 
43
+ export type AdapterId = Id | ObjectId
44
+
45
+ export type NullableAdapterId = AdapterId | null
46
+
41
47
  // Create the service.
42
48
  export class MongoDbAdapter<
43
- T,
44
- D = Partial<T>,
45
- P extends MongoDBAdapterParams<any> = MongoDBAdapterParams
46
- > extends AdapterBase<T, D, P, MongoDBAdapterOptions> {
49
+ Result,
50
+ Data = Partial<Result>,
51
+ ServiceParams extends MongoDBAdapterParams<any> = MongoDBAdapterParams,
52
+ PatchData = Partial<Data>
53
+ > extends AdapterBase<Result, Data, PatchData, ServiceParams, MongoDBAdapterOptions, AdapterId> {
47
54
  constructor(options: MongoDBAdapterOptions) {
48
55
  if (!options) {
49
56
  throw new Error('MongoDB options have to be provided')
@@ -55,7 +62,7 @@ export class MongoDbAdapter<
55
62
  })
56
63
  }
57
64
 
58
- getObjectId(id: Id | ObjectId) {
65
+ getObjectId(id: AdapterId) {
59
66
  if (this.options.disableObjectify) {
60
67
  return id
61
68
  }
@@ -67,7 +74,7 @@ export class MongoDbAdapter<
67
74
  return id
68
75
  }
69
76
 
70
- filterQuery(id: NullableId, params: P) {
77
+ filterQuery(id: NullableAdapterId, params: ServiceParams) {
71
78
  const { $select, $sort, $limit, $skip, ...query } = (params.query || {}) as AdapterQuery
72
79
 
73
80
  if (id !== null) {
@@ -86,6 +93,68 @@ export class MongoDbAdapter<
86
93
  }
87
94
  }
88
95
 
96
+ getModel(params: ServiceParams) {
97
+ const { Model } = this.getOptions(params)
98
+ return Promise.resolve(Model)
99
+ }
100
+
101
+ async findRaw(params: ServiceParams) {
102
+ const { filters, query } = this.filterQuery(null, params)
103
+ const model = await this.getModel(params)
104
+ const q = model.find(query, { ...params.mongodb })
105
+
106
+ if (filters.$select !== undefined) {
107
+ q.project(this.getSelect(filters.$select))
108
+ }
109
+
110
+ if (filters.$sort !== undefined) {
111
+ q.sort(filters.$sort)
112
+ }
113
+
114
+ if (filters.$skip !== undefined) {
115
+ q.skip(filters.$skip)
116
+ }
117
+
118
+ if (filters.$limit !== undefined) {
119
+ q.limit(filters.$limit)
120
+ }
121
+
122
+ return q
123
+ }
124
+
125
+ async aggregateRaw(params: ServiceParams) {
126
+ const model = await this.getModel(params)
127
+ const pipeline = params.pipeline || []
128
+ const index = pipeline.findIndex((stage: Document) => stage.$feathers)
129
+ const before = index >= 0 ? pipeline.slice(0, index) : []
130
+ const feathersPipeline = this.makeFeathersPipeline(params)
131
+ const after = index >= 0 ? pipeline.slice(index + 1) : pipeline
132
+
133
+ return model.aggregate([...before, ...feathersPipeline, ...after])
134
+ }
135
+
136
+ makeFeathersPipeline(params: ServiceParams) {
137
+ const { filters, query } = this.filterQuery(null, params)
138
+ const pipeline: Document[] = [{ $match: query }]
139
+
140
+ if (filters.$select !== undefined) {
141
+ pipeline.push({ $project: this.getSelect(filters.$select) })
142
+ }
143
+
144
+ if (filters.$sort !== undefined) {
145
+ pipeline.push({ $sort: filters.$sort })
146
+ }
147
+
148
+ if (filters.$skip !== undefined) {
149
+ pipeline.push({ $skip: filters.$skip })
150
+ }
151
+
152
+ if (filters.$limit !== undefined) {
153
+ pipeline.push({ $limit: filters.$limit })
154
+ }
155
+ return pipeline
156
+ }
157
+
89
158
  getSelect(select: string[] | { [key: string]: number }) {
90
159
  if (Array.isArray(select)) {
91
160
  return select.reduce<{ [key: string]: number }>(
@@ -100,11 +169,11 @@ export class MongoDbAdapter<
100
169
  return select
101
170
  }
102
171
 
103
- async $findOrGet(id: NullableId, params: P) {
104
- return id === null ? await this.$find(params) : await this.$get(id, params)
172
+ async _findOrGet(id: NullableAdapterId, params: ServiceParams) {
173
+ return id === null ? await this._find(params) : await this._get(id, params)
105
174
  }
106
175
 
107
- normalizeId(id: NullableId, data: Partial<D>): Partial<D> {
176
+ normalizeId<D>(id: NullableAdapterId, data: D): D {
108
177
  if (this.id === '_id') {
109
178
  // Default Mongo IDs cannot be updated. The Mongo library handles
110
179
  // this automatically.
@@ -120,8 +189,7 @@ export class MongoDbAdapter<
120
189
  return data
121
190
  }
122
191
 
123
- async $get(id: Id, params: P = {} as P): Promise<T> {
124
- const { Model } = this.getOptions(params)
192
+ async _get(id: AdapterId, params: ServiceParams = {} as ServiceParams): Promise<Result> {
125
193
  const {
126
194
  query,
127
195
  filters: { $select }
@@ -139,7 +207,7 @@ export class MongoDbAdapter<
139
207
  ...projection
140
208
  }
141
209
 
142
- return Promise.resolve(Model)
210
+ return this.getModel(params)
143
211
  .then((model) => model.findOne(query, findOptions))
144
212
  .then((data) => {
145
213
  if (data == null) {
@@ -151,57 +219,50 @@ export class MongoDbAdapter<
151
219
  .catch(errorHandler)
152
220
  }
153
221
 
154
- async $find(params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T>>
155
- async $find(params?: P & { paginate: false }): Promise<T[]>
156
- async $find(params?: P): Promise<Paginated<T> | T[]>
157
- async $find(params: P = {} as P): Promise<Paginated<T> | T[]> {
222
+ async _find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise<Paginated<Result>>
223
+ async _find(params?: ServiceParams & { paginate: false }): Promise<Result[]>
224
+ async _find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>
225
+ async _find(params: ServiceParams = {} as ServiceParams): Promise<Paginated<Result> | Result[]> {
226
+ const { paginate, useEstimatedDocumentCount } = this.getOptions(params)
158
227
  const { filters, query } = this.filterQuery(null, params)
159
- const { paginate, Model, useEstimatedDocumentCount } = this.getOptions(params)
160
- const findOptions = { ...params.mongodb }
161
- const model = await Promise.resolve(Model)
162
- const q = model.find(query, findOptions)
163
-
164
- if (filters.$select !== undefined) {
165
- q.project(this.getSelect(filters.$select))
166
- }
167
-
168
- if (filters.$sort !== undefined) {
169
- q.sort(filters.$sort)
170
- }
171
-
172
- if (filters.$limit !== undefined) {
173
- q.limit(filters.$limit)
228
+ const useAggregation = !params.mongodb && filters.$limit !== 0
229
+
230
+ const countDocuments = async () => {
231
+ if (paginate && paginate.default) {
232
+ const model = await this.getModel(params)
233
+ if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
234
+ return model.estimatedDocumentCount()
235
+ } else {
236
+ return model.countDocuments(query, { ...params.mongodb })
237
+ }
238
+ }
239
+ return Promise.resolve(0)
174
240
  }
175
241
 
176
- if (filters.$skip !== undefined) {
177
- q.skip(filters.$skip)
178
- }
242
+ const [request, total] = await Promise.all([
243
+ useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
244
+ countDocuments()
245
+ ])
179
246
 
180
- const runQuery = async (total: number) => ({
247
+ const page = {
181
248
  total,
182
249
  limit: filters.$limit,
183
250
  skip: filters.$skip || 0,
184
- data: filters.$limit === 0 ? [] : ((await q.toArray()) as any as T[])
185
- })
186
-
187
- if (paginate && paginate.default) {
188
- if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
189
- return model.estimatedDocumentCount().then(runQuery)
190
- }
191
-
192
- return model.countDocuments(query, findOptions).then(runQuery)
251
+ data: filters.$limit === 0 ? [] : ((await request.toArray()) as any as Result[])
193
252
  }
194
253
 
195
- return runQuery(0).then((page) => page.data)
254
+ return paginate && paginate.default ? page : page.data
196
255
  }
197
256
 
198
- async $create(data: D, params?: P): Promise<T>
199
- async $create(data: D[], params?: P): Promise<T[]>
200
- async $create(data: D | D[], _params?: P): Promise<T | T[]>
201
- async $create(data: D | D[], params: P = {} as P): Promise<T | T[]> {
257
+ async _create(data: Data, params?: ServiceParams): Promise<Result>
258
+ async _create(data: Data[], params?: ServiceParams): Promise<Result[]>
259
+ async _create(data: Data | Data[], _params?: ServiceParams): Promise<Result | Result[]>
260
+ async _create(
261
+ data: Data | Data[],
262
+ params: ServiceParams = {} as ServiceParams
263
+ ): Promise<Result | Result[]> {
202
264
  const writeOptions = params.mongodb
203
- const { Model } = this.getOptions(params)
204
- const model = await Promise.resolve(Model)
265
+ const model = await this.getModel(params)
205
266
  const setId = (item: any) => {
206
267
  const entry = Object.assign({}, item)
207
268
 
@@ -231,13 +292,20 @@ export class MongoDbAdapter<
231
292
  return promise.then(select(params, this.id)).catch(errorHandler)
232
293
  }
233
294
 
234
- async $patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
235
- async $patch(id: Id, data: Partial<D>, params?: P): Promise<T>
236
- async $patch(id: NullableId, data: Partial<D>, _params?: P): Promise<T | T[]>
237
- async $patch(id: NullableId, _data: Partial<D>, params: P = {} as P): Promise<T | T[]> {
295
+ async _patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>
296
+ async _patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise<Result>
297
+ async _patch(id: NullableAdapterId, data: PatchData, _params?: ServiceParams): Promise<Result | Result[]>
298
+ async _patch(
299
+ id: NullableAdapterId,
300
+ _data: PatchData,
301
+ params: ServiceParams = {} as ServiceParams
302
+ ): Promise<Result | Result[]> {
303
+ if (id === null && !this.allowsMulti('patch', params)) {
304
+ throw new MethodNotAllowed('Can not patch multiple entries')
305
+ }
306
+
238
307
  const data = this.normalizeId(id, _data)
239
- const { Model } = this.getOptions(params)
240
- const model = await Promise.resolve(Model)
308
+ const model = await this.getModel(params)
241
309
  const {
242
310
  query,
243
311
  filters: { $select }
@@ -257,7 +325,7 @@ export class MongoDbAdapter<
257
325
 
258
326
  return current
259
327
  }, {} as any)
260
- const originalIds = await this.$findOrGet(id, {
328
+ const originalIds = await this._findOrGet(id, {
261
329
  ...params,
262
330
  query: {
263
331
  ...query,
@@ -278,26 +346,35 @@ export class MongoDbAdapter<
278
346
 
279
347
  await model.updateMany(query, modifier, updateOptions)
280
348
 
281
- return this.$findOrGet(id, findParams).catch(errorHandler)
349
+ return this._findOrGet(id, findParams).catch(errorHandler)
282
350
  }
283
351
 
284
- async $update(id: Id, data: D, params: P = {} as P): Promise<T> {
285
- const { Model } = this.getOptions(params)
286
- const model = await Promise.resolve(Model)
352
+ async _update(id: AdapterId, data: Data, params: ServiceParams = {} as ServiceParams): Promise<Result> {
353
+ if (id === null || Array.isArray(data)) {
354
+ throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?")
355
+ }
356
+
357
+ const model = await this.getModel(params)
287
358
  const { query } = this.filterQuery(id, params)
288
359
  const replaceOptions = { ...params.mongodb }
289
360
 
290
361
  await model.replaceOne(query, this.normalizeId(id, data), replaceOptions)
291
362
 
292
- return this.$findOrGet(id, params).catch(errorHandler)
363
+ return this._findOrGet(id, params).catch(errorHandler)
293
364
  }
294
365
 
295
- async $remove(id: null, params?: P): Promise<T[]>
296
- async $remove(id: Id, params?: P): Promise<T>
297
- async $remove(id: NullableId, _params?: P): Promise<T | T[]>
298
- async $remove(id: NullableId, params: P = {} as P): Promise<T | T[]> {
299
- const { Model } = this.getOptions(params)
300
- const model = await Promise.resolve(Model)
366
+ async _remove(id: null, params?: ServiceParams): Promise<Result[]>
367
+ async _remove(id: AdapterId, params?: ServiceParams): Promise<Result>
368
+ async _remove(id: NullableAdapterId, _params?: ServiceParams): Promise<Result | Result[]>
369
+ async _remove(
370
+ id: NullableAdapterId | ObjectId,
371
+ params: ServiceParams = {} as ServiceParams
372
+ ): Promise<Result | Result[]> {
373
+ if (id === null && !this.allowsMulti('remove', params)) {
374
+ throw new MethodNotAllowed('Can not remove multiple entries')
375
+ }
376
+
377
+ const model = await this.getModel(params)
301
378
  const {
302
379
  query,
303
380
  filters: { $select }
@@ -312,7 +389,7 @@ export class MongoDbAdapter<
312
389
  }
313
390
  }
314
391
 
315
- return this.$findOrGet(id, findParams)
392
+ return this._findOrGet(id, findParams)
316
393
  .then(async (items) => {
317
394
  await model.deleteMany(query, deleteOptions)
318
395
  return items
package/src/index.ts CHANGED
@@ -1,44 +1,71 @@
1
1
  import { PaginationOptions } from '@feathersjs/adapter-commons'
2
- import { Paginated, ServiceMethods, Id, NullableId, Params } from '@feathersjs/feathers'
3
- import { MongoDbAdapter, MongoDBAdapterParams } from './adapter'
2
+ import { MethodNotAllowed } from '@feathersjs/errors/lib'
3
+ import { Paginated, Params } from '@feathersjs/feathers'
4
+ import { AdapterId, MongoDbAdapter, MongoDBAdapterParams, NullableAdapterId } from './adapter'
4
5
 
5
6
  export * from './adapter'
6
7
  export * from './error-handler'
8
+ export * from './resolvers'
7
9
 
8
- export class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = MongoDBAdapterParams>
9
- extends MongoDbAdapter<T, D, P>
10
- implements ServiceMethods<T | Paginated<T>, D, P>
11
- {
12
- async find(params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T>>
13
- async find(params?: P & { paginate: false }): Promise<T[]>
14
- async find(params?: P): Promise<Paginated<T> | T[]>
15
- async find(params?: P): Promise<Paginated<T> | T[]> {
16
- return this._find(params) as any
10
+ export class MongoDBService<
11
+ Result = any,
12
+ Data = Partial<Result>,
13
+ ServiceParams extends Params<any> = MongoDBAdapterParams,
14
+ PatchData = Partial<Data>
15
+ > extends MongoDbAdapter<Result, Data, ServiceParams, PatchData> {
16
+ async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise<Paginated<Result>>
17
+ async find(params?: ServiceParams & { paginate: false }): Promise<Result[]>
18
+ async find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>
19
+ async find(params?: ServiceParams): Promise<Paginated<Result> | Result[]> {
20
+ return this._find({
21
+ ...params,
22
+ query: await this.sanitizeQuery(params)
23
+ })
17
24
  }
18
25
 
19
- async get(id: Id, params?: P): Promise<T> {
20
- return this._get(id, params)
26
+ async get(id: AdapterId, params?: ServiceParams): Promise<Result> {
27
+ return this._get(id, {
28
+ ...params,
29
+ query: await this.sanitizeQuery(params)
30
+ })
21
31
  }
22
32
 
23
- async create(data: D, params?: P): Promise<T>
24
- async create(data: D[], params?: P): Promise<T[]>
25
- async create(data: D | D[], params?: P): Promise<T | T[]> {
33
+ async create(data: Data, params?: ServiceParams): Promise<Result>
34
+ async create(data: Data[], params?: ServiceParams): Promise<Result[]>
35
+ async create(data: Data | Data[], params?: ServiceParams): Promise<Result | Result[]> {
36
+ if (Array.isArray(data) && !this.allowsMulti('create', params)) {
37
+ throw new MethodNotAllowed('Can not create multiple entries')
38
+ }
39
+
26
40
  return this._create(data, params)
27
41
  }
28
42
 
29
- async update(id: Id, data: D, params?: P): Promise<T> {
30
- return this._update(id, data, params)
43
+ async update(id: AdapterId, data: Data, params?: ServiceParams): Promise<Result> {
44
+ return this._update(id, data, {
45
+ ...params,
46
+ query: await this.sanitizeQuery(params)
47
+ })
31
48
  }
32
49
 
33
- async patch(id: Id, data: Partial<D>, params?: P): Promise<T>
34
- async patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
35
- async patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]> {
36
- return this._patch(id, data, params)
50
+ async patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>
51
+ async patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise<Result>
52
+ async patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise<Result | Result[]> {
53
+ const { $limit, ...query } = await this.sanitizeQuery(params)
54
+
55
+ return this._patch(id, data, {
56
+ ...params,
57
+ query
58
+ })
37
59
  }
38
60
 
39
- async remove(id: Id, params?: P): Promise<T>
40
- async remove(id: null, params?: P): Promise<T[]>
41
- async remove(id: NullableId, params?: P): Promise<T | T[]> {
42
- return this._remove(id, params)
61
+ async remove(id: AdapterId, params?: ServiceParams): Promise<Result>
62
+ async remove(id: null, params?: ServiceParams): Promise<Result[]>
63
+ async remove(id: NullableAdapterId, params?: ServiceParams): Promise<Result | Result[]> {
64
+ const { $limit, ...query } = await this.sanitizeQuery(params)
65
+
66
+ return this._remove(id, {
67
+ ...params,
68
+ query
69
+ })
43
70
  }
44
71
  }
@@ -0,0 +1,45 @@
1
+ import { ObjectId } from 'mongodb'
2
+
3
+ export type ObjectIdParam = string | number | ObjectId
4
+
5
+ export type IdQueryObject<T> = {
6
+ $in?: T[]
7
+ $nin?: T[]
8
+ $ne?: T
9
+ }
10
+
11
+ const toObjectId = (value: ObjectIdParam) => new ObjectId(value)
12
+
13
+ export async function resolveObjectId(value: ObjectIdParam) {
14
+ return toObjectId(value)
15
+ }
16
+
17
+ export async function resolveQueryObjectId(
18
+ value: IdQueryObject<ObjectIdParam>
19
+ ): Promise<IdQueryObject<ObjectId>>
20
+ export async function resolveQueryObjectId(value: ObjectIdParam): Promise<ObjectId>
21
+ export async function resolveQueryObjectId(value: ObjectIdParam | IdQueryObject<ObjectIdParam>) {
22
+ if (!value) {
23
+ return undefined
24
+ }
25
+
26
+ if (typeof value === 'string' || typeof value === 'number' || value instanceof ObjectId) {
27
+ return toObjectId(value)
28
+ }
29
+
30
+ const convertedObject: IdQueryObject<ObjectId> = {}
31
+
32
+ if (Array.isArray(value.$in)) {
33
+ convertedObject.$in = value.$in.map(toObjectId)
34
+ }
35
+
36
+ if (Array.isArray(value.$nin)) {
37
+ convertedObject.$nin = value.$nin.map(toObjectId)
38
+ }
39
+
40
+ if (value.$ne !== undefined) {
41
+ convertedObject.$ne = toObjectId(value.$ne)
42
+ }
43
+
44
+ return convertedObject
45
+ }