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