-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
145 lines (119 loc) · 3.85 KB
/
index.js
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
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
Author: Adam Blvck (adamblvck.com)
Product: Blockchain Ecosystem Explorer
Year: 2018 - 2020
Smartie.be
*/
const hapi = require('hapi');
const mongoose = require('mongoose');
const { graphqlHapi, graphiqlHapi } = require('apollo-server-hapi');
const schema = require('./graphql/schema');
const hapiJWTAuth = require('hapi-auth-jwt2');
const jwksRSA = require('jwks-rsa');
// load env file (containing credentials)
require('dotenv').config();
const host = process.env.DB_HOST;
const usr = process.env.DB_USER;
const pwd = process.env.DB_PASS;
const collection = 'concept-db';
const MONGO_URI = `mongodb+srv://${usr}:${pwd}@${host}/${collection}?retryWrites=true&w=majority`;
const Path = require('path');
const server = hapi.server({
port: process.env.PORT || 4000
});
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.connect(MONGO_URI);
mongoose.connection.once('open', () => {
console.log('connected to mlab database');
})
// bring your own validation function
const validateUser = function (decoded, request) {
if (decoded && decoded.email) {
return { isValid: true };
}
return { isValid: false };
};
const init = async() => {
// register JWT authorization / verification for HAPI
await server.register(hapiJWTAuth);
server.auth.strategy('jwt', 'jwt', {
complete: true,
key: jwksRSA.hapiJwt2KeyAsync({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: 'https://blockchainexplorer.eu.auth0.com/.well-known/jwks.json'
}),
validate: validateUser,
verifyOptions: {
audience: 'nmwFAcrQ4iKBlNNqjNuoFjzJwDMlkkJK', // Auth0 application ID
issuer: 'https://blockchainexplorer.eu.auth0.com/', // Auth0 authentication endpoint
algorithms: ['RS256']
},
});
server.auth.default('jwt');
// register GraphiQL, points to /graphql
await server.register({
plugin: graphiqlHapi,
options: {
path: '/graphiql',
header: {Authorization: "FvRkxz6HXjfD-d61-Iiiv5OA9Nllwmfn",
'content-type': 'application/json'},
graphiqlOptions: {
endpointURL: '/graphql'
},
route: { cors: true, auth: { mode: 'optional' } }
}
});
// register GraphQL
await server.register({
plugin: graphqlHapi,
options: {
path: '/graphql',
graphqlOptions: async (request) => {
return {
schema,
context: request.auth
}
},
// optional means that the request should have either a valid
// Authentication header, or none at all
route: { cors: true, auth: { mode: 'optional' } } // put on optional!
},
});
// register static file serving (for REACT)
await server.register(require('inert'));
await server.route({
method: 'GET',
path: '/{path*}',
handler: {
directory: {
path: Path.join(__dirname, 'app'),
listing: false,
index: true
}
},
options: {
auth: false
}
})
server.ext('onPreResponse', (request, reply) => {
let response = request.response;
// if 404 - serve React app
if (response.isBoom &&
response.output.statusCode === 404) {
return reply.file('./app/index.html');
}
return reply.continue;
});
error => {
if (error) return next(error);
server.log(['register', 'graphql', 'graphiql'], 'graphql plugins loaded successfully! 🎉');
next();
},
await server.start();
console.log(`Server running at: ${server.info.uri}`);
}
init();