1 | 'use strict';
|
2 |
|
3 | const Assert = require('assert');
|
4 | const Fs = require('fs');
|
5 | const Url = require('url');
|
6 | const Path = require('path');
|
7 | const Graphi = require('graphi');
|
8 | const Package = require('../package.json');
|
9 | const CloudApi = require('./cloudapi');
|
10 | const Formatters = require('./formatters');
|
11 | const Routes = require('./routes');
|
12 |
|
13 | const Schema = Fs.readFileSync(Path.join(__dirname, '/schema.graphql'));
|
14 |
|
15 | const setupCloudApi = ({ keyId, key, apiBaseUrl }) => {
|
16 | return (request, h) => {
|
17 | if (request.route.settings.auth === false) {
|
18 | return h.continue;
|
19 | }
|
20 |
|
21 | request.plugins.cloudapi = new CloudApi({
|
22 | token: request.auth && request.auth.credentials && request.auth.credentials.token,
|
23 | url: apiBaseUrl,
|
24 | keyId,
|
25 | key,
|
26 | log: request.log.bind(request)
|
27 | });
|
28 |
|
29 | return h.continue;
|
30 | };
|
31 | };
|
32 |
|
33 | const graphqlHandler = function (route, options) {
|
34 | Assert(typeof options.method === 'function', 'method must be a function');
|
35 |
|
36 | return function (request, h) {
|
37 | const fetch = request.plugins.cloudapi.fetch.bind(request.plugins.cloudapi);
|
38 | return options.method(fetch, request.payload, request);
|
39 | };
|
40 | };
|
41 |
|
42 | const register = async (server, options = {}) => {
|
43 | Assert(options.apiBaseUrl, 'options.apiBaseUrl is required');
|
44 | Assert(options.keyId, 'options.keyId is required');
|
45 | Assert(options.keyPath, 'options.keyPath is required');
|
46 |
|
47 | options.dcName = options.dcName || Url.parse(options.apiBaseUrl).host.split('.')[0];
|
48 |
|
49 | const schema = Graphi.makeExecutableSchema({
|
50 | schema: Schema.toString(),
|
51 | resolvers: Formatters
|
52 | });
|
53 |
|
54 | server.decorate('handler', 'graphql', graphqlHandler);
|
55 | server.expose('options', options);
|
56 | server.route(Routes);
|
57 |
|
58 | const graphiOptions = {
|
59 | graphiqlPath: process.env.NODE_ENV === 'development' ? '/graphiql' : options.graphiqlPath,
|
60 | schema: schema,
|
61 | authStrategy: options.authStrategy
|
62 | };
|
63 |
|
64 | await server.register({ plugin: Graphi, options: graphiOptions });
|
65 |
|
66 | const key = Fs.readFileSync(options.keyPath);
|
67 | server.ext('onPostAuth', setupCloudApi({ key, ...options }));
|
68 | };
|
69 |
|
70 | module.exports = {
|
71 | pkg: Package,
|
72 | register
|
73 | };
|