@@ -10,5 +10,74 @@ Expressive and composable resolvers for Apollostack's GraphQL server
10
10
Install the package:
11
11
12
12
``` bash
13
- npm install apollo-errors
13
+ npm install apollo-resolvers
14
+ ```
15
+
16
+ Create a base resolver for last-resort error masking:
17
+
18
+ ``` javascript
19
+ import { createResolver } from ' apollo-resolvers' ;
20
+ import { createError , isInstance } from ' apollo-errors' ;
21
+
22
+ const UnknownError = createError ({
23
+ message: ' An unknown error has occurred! Please try again later'
24
+ });
25
+
26
+ export const baseResolver = createResolver (
27
+ null , // don't pass a resolver function, we only care about errors
28
+
29
+ // Only mask errors that aren't already apollo-errors, such as ORM errors etc
30
+ (root , args , context , error ) => isInstance (error) ? error : new UnknownError ()
31
+ );
32
+ ```
33
+
34
+ Create a few ACL child resolvers:
35
+ ``` javascript
36
+ import { createError } from ' apollo-errors' ;
37
+
38
+ import baseResolver from ' ./baseResolver' ;
39
+
40
+ const ForbiddenError = createError ({
41
+ message: ' You are not allowed to do this'
42
+ });
43
+
44
+ const AuthenticationRequiredError = createError ({
45
+ message: ' You must be logged in to do this'
46
+ });
47
+
48
+ export const isAuthenticatedResolver = baseResolver .createResolver (
49
+ // Extract the user from context (undefined if non-existent)
50
+ (root , args , { user }) => {
51
+ if (! user) throw new AuthenticationRequiredError ();
52
+ }
53
+ );
54
+
55
+ export const isAdminResolver = isAuthenticatedResolver .createResolver (
56
+ // Extract the user and make sure they are an admin
57
+ (root , args , { user }) => {
58
+ if (! user .isAdmin ) throw new ForbiddenError ();
59
+ }
60
+ )
61
+ ```
62
+
63
+ Create a few real-work resolvers for our app:
64
+
65
+ ``` javascript
66
+ import { isAuthenticatedResolver , isAdminResolver } from ' ./acl' ;
67
+ import { createError } from ' apollo-errors' ;
68
+
69
+ const NotYourUserError = createError ({
70
+ message: ' You cannot update the profile for other users'
71
+ });
72
+
73
+ const updateMyProfile = isAuthenticatedResolver .createResolver (
74
+ (root , { input }, { user, models: { UserModel } }) => {
75
+ if (! user .isAdmin && input .id !== user .id ) throw new NotYourUserError ();
76
+ return UserModel .update (input);
77
+ }
78
+ );
79
+
80
+ const banUser = isAdminResolver .createResolver (
81
+ (root , { input }, { models: { UserModel } }) => UserModel .ban (input)
82
+ );
14
83
```
0 commit comments