Skip to content

Commit e7d4626

Browse files
committed
feat(resolvers): Add callback beforeRecordMutate to resolveParams for createOne, updateById, updat
For `wrapResolve` you may provide `resolveParams.beforeRecordMutate` callback. Which will be called in `createOne`, `updateById`, `updateOne` resolvers. To this callback will be provided Document, which you may change before save. Or you may return Promise.reject('Msg') in this callback, if you want prohibit operation.
1 parent 83791f7 commit e7d4626

File tree

7 files changed

+61
-1
lines changed

7 files changed

+61
-1
lines changed

src/definition.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ export type ResolverMWResolveFn = _ResolverMWResolveFn;
102102
export type ExtendedResolveParams = ResolveParams & {
103103
query: MongooseQuery,
104104
projection: ProjectionType,
105+
beforeQuery(query: mixed): Promise<*>,
106+
beforeRecordMutate(record: mixed): Promise<*>,
105107
};
106108

107109

src/resolvers/__tests__/createOne-test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ describe('createOne() ->', () => {
9595
});
9696
expect(result).property('record').instanceof(UserModel);
9797
});
98+
99+
it('should call `beforeRecordMutate` method with created `record` as arg', async () => {
100+
const result = await createOne(UserModel, UserTypeComposer).resolve({
101+
args: { record: { name: 'NewUser' } },
102+
beforeRecordMutate: (record) => {
103+
record.name = 'OverridedName';
104+
return record;
105+
}
106+
});
107+
expect(result).property('record').instanceof(UserModel);
108+
expect(result).have.deep.property('record.name', 'OverridedName');
109+
});
98110
});
99111

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

src/resolvers/__tests__/updateById-test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,19 @@ describe('updateById() ->', () => {
156156
});
157157
expect(result.record).instanceof(UserModel);
158158
});
159+
160+
it('should call `beforeRecordMutate` method with founded `record` as arg', async () => {
161+
let beforeMutationId;
162+
const result = await updateById(UserModel, UserTypeComposer).resolve({
163+
args: { record: { _id: user1.id } },
164+
beforeRecordMutate: (record) => {
165+
beforeMutationId = record.id;
166+
return record;
167+
}
168+
});
169+
expect(result.record).instanceof(UserModel);
170+
expect(beforeMutationId).to.equal(user1.id);
171+
});
159172
});
160173

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

src/resolvers/__tests__/updateOne-test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,19 @@ describe('updateOne() ->', () => {
180180
});
181181
expect(result.record).instanceof(UserModel);
182182
});
183+
184+
it('should call `beforeRecordMutate` method with founded `record` as arg', async () => {
185+
let beforeMutationId;
186+
const result = await updateOne(UserModel, UserTypeComposer).resolve({
187+
args: { filter: { _id: user1.id } },
188+
beforeRecordMutate: (record) => {
189+
beforeMutationId = record.id;
190+
return record;
191+
}
192+
});
193+
expect(result.record).instanceof(UserModel);
194+
expect(beforeMutationId).to.equal(user1.id);
195+
});
183196
});
184197

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

src/resolvers/createOne.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,15 @@ export default function createOne(
7171
);
7272
}
7373

74-
return model.create(recordData)
74+
// $FlowFixMe
75+
return Promise.resolve(new model(recordData))
76+
.then(doc => {
77+
if (resolveParams.beforeRecordMutate) {
78+
return resolveParams.beforeRecordMutate(doc);
79+
}
80+
return doc;
81+
})
82+
.then(doc => doc.save())
7583
.then(record => {
7684
if (record) {
7785
return {

src/resolvers/updateById.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ export default function updateById(
9292
(resolveParams.projection && resolveParams.projection.record) || {};
9393

9494
return findByIdResolver.resolve(resolveParams)
95+
.then(doc => {
96+
if (resolveParams.beforeRecordMutate) {
97+
return resolveParams.beforeRecordMutate(doc);
98+
}
99+
return doc;
100+
})
95101
// save changes to DB
96102
.then(doc => {
97103
if (!doc) {

src/resolvers/updateOne.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ export default function updateOne(
9898
(resolveParams.projection && resolveParams.projection.record) || {};
9999

100100
return findOneResolver.resolve(resolveParams)
101+
.then(doc => {
102+
if (resolveParams.beforeRecordMutate) {
103+
return resolveParams.beforeRecordMutate(doc);
104+
}
105+
return doc;
106+
})
101107
// save changes to DB
102108
.then(doc => {
103109
if (recordData) {

0 commit comments

Comments
 (0)