-
-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathcreate-link-wrap.js
More file actions
73 lines (64 loc) · 2.67 KB
/
create-link-wrap.js
File metadata and controls
73 lines (64 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function performAnotherTask(linkId) {
console.log(`We created link ${linkId}!`);
}
module.exports = function CreateLinkWrapPlugin(builder) {
builder.hook(
"GraphQLObjectType:fields:field",
(
field,
{ pgSql: sql },
{ scope: { isRootMutation, fieldName }, addArgDataGenerator }
) => {
if (!isRootMutation || fieldName !== "createLink") {
// If it's not the root mutation, or the mutation isn't the 'createLink'
// mutation then we don't want to modify it - so return the input object
// unmodified.
return field;
}
// We're going to need link.id for our `performAnotherTask`; so we're going
// to abuse addArgDataGenerator to make sure that this field is ALWAYS
// requested, even if the user doesn't specify it. We're careful to alias
// the result to a field that begins with `__` as that's forbidden by
// GraphQL and thus cannot clash with a user's fields.
addArgDataGenerator(() => ({
pgQuery: queryBuilder => {
queryBuilder.select(
// Select this value from the result of the INSERT:
sql.query`${queryBuilder.getTableAlias()}.id`,
// And give it this name in the result data:
"__createdRecordId"
);
},
}));
// It's possible that `resolve` isn't specified on a field, so in that case
// we fall back to a default resolver.
const defaultResolver = obj => obj[fieldName];
// Extract the old resolver from `field`
const { resolve: oldResolve = defaultResolver, ...rest } = field;
return {
// Copy over everything except 'resolve'
...rest,
// Add our new resolver which wraps the old resolver
async resolve(...resolveParams) {
// Perform some validation (or any other action you want to do before
// calling the old resolver)
const RESOLVE_ARGS_INDEX = 1;
const { input: { link: { title } } } = resolveParams[
RESOLVE_ARGS_INDEX
];
if (title.length < 3) {
throw new Error("Title is too short!");
}
// Call the old resolver (you SHOULD NOT modify the arguments it
// receives unless you also manipulate the AST it gets passed as the
// 4th argument; which is quite a lot of effort) and store the result.
const oldResolveResult = await oldResolve(...resolveParams);
// Perform any tasks we want to do after the record is created.
await performAnotherTask(oldResolveResult.data.__createdRecordId);
// Finally return the result.
return oldResolveResult;
},
};
}
);
};