Skip to content

Commit dda449e

Browse files
committed
feat(resolvers): Add callback beforeQuery to resolveParams for updateMany, removeById, removeMany,
For `wrapResolve` you may provide `resolveParams.beforeQuery` callback, which will be called in `updateMany`, `removeById`, `removeMany`, `removeOne` resolvers. To this callback will be provided non-executed mongoose query, which you may change. Or you may return Promise.reject('Msg') in this callback, if you want prohibit operation.
1 parent e7d4626 commit dda449e

File tree

8 files changed

+85
-7
lines changed

8 files changed

+85
-7
lines changed

src/resolvers/__tests__/removeById-test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { expect } from 'chai';
44
import { GraphQLNonNull } from 'graphql';
5+
import { Query } from 'mongoose';
56
import { Resolver, TypeComposer } from 'graphql-compose';
67
import { UserModel } from '../../__mocks__/userModel.js';
78
import removeById from '../removeById';
@@ -113,6 +114,20 @@ describe('removeById() ->', () => {
113114
});
114115
expect(result.record).instanceof(UserModel);
115116
});
117+
118+
it('should call `beforeQuery` method with non-executed `query` as arg', async () => {
119+
let beforeQueryCalled = false;
120+
const result = await removeById(UserModel, UserTypeComposer).resolve({
121+
args: { _id: user.id },
122+
beforeQuery: (query) => {
123+
expect(query).instanceof(Query);
124+
beforeQueryCalled = true;
125+
return query;
126+
}
127+
});
128+
expect(beforeQueryCalled).to.be.true;
129+
expect(result.record).instanceof(UserModel);
130+
});
116131
});
117132

118133
describe('Resolver.getOutputType()', () => {

src/resolvers/__tests__/removeMany-test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { expect } from 'chai';
44
import { GraphQLInt, GraphQLNonNull } from 'graphql';
5+
import { Query } from 'mongoose';
56
import Resolver from 'graphql-compose/lib/resolver/resolver';
67
import TypeComposer from 'graphql-compose/lib/typeComposer';
78
import { UserModel } from '../../__mocks__/userModel.js';
@@ -117,6 +118,22 @@ describe('removeMany() ->', () => {
117118
});
118119
expect(result).have.property('numAffected', 2);
119120
});
121+
122+
it('should call `beforeQuery` method with non-executed `query` as arg', async () => {
123+
let beforeQueryCalled = false;
124+
const result = await removeMany(UserModel, UserTypeComposer).resolve({
125+
args: {
126+
filter: { gender: 'female' },
127+
},
128+
beforeQuery: (query) => {
129+
expect(query).instanceof(Query);
130+
beforeQueryCalled = true;
131+
return query;
132+
}
133+
});
134+
expect(beforeQueryCalled).to.be.true;
135+
expect(result).have.property('numAffected', 2);
136+
});
120137
});
121138

122139
describe('Resolver.getOutputType()', () => {

src/resolvers/__tests__/removeOne-test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { expect } from 'chai';
44
import { Resolver, TypeComposer } from 'graphql-compose';
5+
import { Query } from 'mongoose';
56
import { UserModel } from '../../__mocks__/userModel.js';
67
import removeOne from '../removeOne';
78
import GraphQLMongoID from '../../types/mongoid';
@@ -143,6 +144,20 @@ describe('removeOne() ->', () => {
143144
});
144145
expect(result.record).instanceof(UserModel);
145146
});
147+
148+
it('should call `beforeQuery` method with non-executed `query` as arg', async () => {
149+
let beforeQueryCalled = false;
150+
const result = await removeOne(UserModel, UserTypeComposer).resolve({
151+
args: { },
152+
beforeQuery: (query) => {
153+
expect(query).instanceof(Query);
154+
beforeQueryCalled = true;
155+
return query;
156+
}
157+
});
158+
expect(beforeQueryCalled).to.be.true;
159+
expect(result.record).instanceof(UserModel);
160+
});
146161
});
147162

148163
describe('Resolver.getOutputType()', () => {

src/resolvers/__tests__/updateMany-test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { expect } from 'chai';
44
import { GraphQLInt, GraphQLNonNull } from 'graphql';
5+
import { Query } from 'mongoose';
56
import { Resolver, TypeComposer } from 'graphql-compose';
67
import { UserModel } from '../../__mocks__/userModel.js';
78
import updateMany from '../updateMany';
@@ -115,6 +116,23 @@ describe('updateMany() ->', () => {
115116
});
116117
expect(result).have.deep.property('numAffected', 2);
117118
});
119+
120+
it('should call `beforeQuery` method with non-executed `query` as arg', async () => {
121+
let beforeQueryCalled = false;
122+
const result = await updateMany(UserModel, UserTypeComposer).resolve({
123+
args: {
124+
record: { gender: 'female' },
125+
},
126+
beforeQuery: (query) => {
127+
expect(query).instanceof(Query);
128+
beforeQueryCalled = true;
129+
// modify query before execution
130+
return query.where({ _id: user1.id })
131+
}
132+
});
133+
expect(beforeQueryCalled).to.be.true;
134+
expect(result).have.deep.property('numAffected', 1);
135+
});
118136
});
119137

120138
describe('Resolver.getOutputType()', () => {

src/resolvers/removeById.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ export default function removeById(
7676
resolveParams.query = model.findByIdAndRemove(args._id);
7777
projectionHelper(resolveParams);
7878

79-
return resolveParams.query.exec()
79+
return (
80+
resolveParams.beforeQuery
81+
? Promise.resolve(resolveParams.beforeQuery(resolveParams.query))
82+
: resolveParams.query.exec()
83+
)
8084
.then(record => {
8185
if (record) {
8286
return {

src/resolvers/removeMany.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,11 @@ export default function removeMany(
7575
filterHelper(resolveParams);
7676
resolveParams.query = resolveParams.query.remove();
7777

78-
return resolveParams.query
79-
.exec()
78+
return (
79+
resolveParams.beforeQuery
80+
? Promise.resolve(resolveParams.beforeQuery(resolveParams.query))
81+
: resolveParams.query.exec()
82+
)
8083
.then(res => {
8184
if (res.result && res.result.ok) {
8285
return {

src/resolvers/removeOne.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,11 @@ export default function removeOne(
7474
sortHelper(resolveParams);
7575
projectionHelper(resolveParams);
7676

77-
return resolveParams.query
78-
.exec()
77+
return (
78+
resolveParams.beforeQuery
79+
? Promise.resolve(resolveParams.beforeQuery(resolveParams.query))
80+
: resolveParams.query.exec()
81+
)
7982
.then(record => {
8083
if (record) {
8184
return {

src/resolvers/updateMany.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,11 @@ export default function updateMany(
9696
resolveParams.query = resolveParams.query.setOptions({ multi: true }); // eslint-disable-line
9797
resolveParams.query.update({ $set: toDottedObject(recordData) });
9898

99-
return resolveParams.query
100-
.exec()
99+
return (
100+
resolveParams.beforeQuery
101+
? Promise.resolve(resolveParams.beforeQuery(resolveParams.query))
102+
: resolveParams.query.exec()
103+
)
101104
.then(res => {
102105
if (res.ok) {
103106
return {

0 commit comments

Comments
 (0)