forked from Hganavak/graphql-server-example
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathremote-auth.js
More file actions
132 lines (109 loc) · 3.05 KB
/
remote-auth.js
File metadata and controls
132 lines (109 loc) · 3.05 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const { ApolloServer, gql } = require('apollo-server');
const { AuthDirective } = require('./auth-directive');
const { introspectSchema, makeExecutableSchema, makeRemoteExecutableSchema, mergeSchemas, AuthenticationError } = require('graphql-tools');
const { HttpLink } = require('apollo-link-http');
const fetch = require('node-fetch');
const articles = [
{
body: 'Gonna teach you some stuff',
isPublic: true
},
{
body: 'This is all top secret',
isPublic: false
},
];
const contentItems = [
{
title: 'Sams Latex Workshop',
summary: 'A workshop about LaTeX',
article: articles[0]
},
{
title: 'Top Secret NASA Project',
summary: 'A top secret article about NASA',
article: articles[1]
}
]
// Define schema (collection of type definitions)
const typeDefs = gql`
directive @auth(
requires: Role = USER,
) on OBJECT
enum Role {
USER
STAFF
}
type ContentItem {
title: String
summary: String
article: Article
}
type Article @auth {
body: String
isPublic: Boolean
}
type Query {
contentItems: [ContentItem]
articles: [Article]
}
`;
// Define resolvers (define the technique for fetching the types defined in our schema)
const resolvers = {
Query: {
contentItems: (parent, args, context) => { return contentItems },
articles: (parent, args, context) => { return articles }
},
};
// The ApolloServer constructor requires two parameters: your schema
// definition and your set of resolvers.
const localSchema = makeExecutableSchema({
typeDefs,
resolvers,
schemaDirectives: {
auth: AuthDirective
}
});
// Set up remote schemas
// Load a remote schema and set up the http-link
getRemoteSchema = async(remoteUri) => {
try {
console.log('Loading remote schema:', remoteUri)
const link = new HttpLink({ uri: remoteUri, fetch });
const schema = await introspectSchema(link);
console.log('Loaded remote schema:', remoteUri)
return makeRemoteExecutableSchema({
schema,
link,
});
} catch(e) {
console.error(e);
}
}
// Set up the schemas and initialize the server
initialize = async () => {
// Load remote schemas here
spacexSchema = await getRemoteSchema('https://api.spacex.land/graphql');
countriesSchema = await getRemoteSchema('https://countries.trevorblades.com/');
// Merge all schemas (remote and local) here
const schema = mergeSchemas({
schemas: [
spacexSchema,
countriesSchema,
localSchema
]
});
const server = new ApolloServer({
schema,
context: ({ req }) => {
user = { upi: 'skav012' }; // Get session here
user = null;
return { user };
}
});
// The 'listen' method launches a web server.
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
}
initialize();