| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | const graphqlHTTP = require('express-graphql');const escape = require('escape-html');const dateFormat = require('dateformat');const { makeExecutableSchema } = require('graphql-tools');module.exports = (app, resolvers) => {        const typeDefs = require('./schema');        const schema = makeExecutableSchema({        typeDefs,        resolvers    });    app.get('/json', async(req, res) => {                const graphql = await graphqlHTTP((req, res, graphQLParams) => {                        graphQLParams.query = "{ helloWorld }";            graphQLParams.operationName = null;            graphQLParams.variables = {};                return graphqlOpts()        });            res.real_end = res.end;            res.end = (data) => {                        let toRet;            const json = JSON.parse(data.toString('utf8'));                if(json.data.helloWorld) {                toRet = json.data.helloWorld;            } else {                toRet = { helloWorld: null };            }                        setResponseHeaders(res, toRet.length);                res.real_end(toRet);        }            await graphql(req, res);    });        app.get('/db', async (req, res) => {                const graphql = await graphqlHTTP((req, res, graphQLParams) => {                    graphQLParams.query = "{ singleDatabaseQuery { id, randomNumber }}";            graphQLParams.variables = {};            graphQLParams.operationName = null;                    return graphqlOpts();        });            formatResData(res, "singleDatabaseQuery");            await graphql(req, res);    });        app.get('/queries', async (req, res) => {                const graphql = await graphqlHTTP((req, res, graphQLParams) => {                        let totalNumOfQueries = ensureQueryIsAnInt(req.query.queries);                graphQLParams.query = `{ multipleDatabaseQueries(total: ${totalNumOfQueries}) { id, randomNumber }}`            graphQLParams.variables = {};            graphQLParams.operationName = null;                return graphqlOpts();        });            formatResData(res, "multipleDatabaseQueries");            await graphql(req, res);    });        app.get('/fortunes', async (req, res) => {            const graphql = await graphqlHTTP((req, res, graphQLParams) => {                graphQLParams.query = "{ getAllFortunes { id, message } }"            graphQLParams.operationName = null;            graphQLParams.variables = {};                return graphqlOpts();        });            retrieveAndFormatAllFortunes(res);                await graphql(req, res);    });        app.get('/updates', async (req, res) => {            const totalNumOfQueries = ensureQueryIsAnInt(req.query.queries);            const graphql = await graphqlHTTP((req, res, graphQLParams) => {                graphQLParams.query = `{ getRandomAndUpdate(total: ${totalNumOfQueries}) { id, randomNumber } }`            graphQLParams.operationName = null;            graphQLParams.variables = {};                return graphqlOpts();        });            formatResData(res, 'getRandomAndUpdate');            await graphql(req, res);    });        app.get('/plaintext', (req, res) => {            const responseTxt = "Hello, World!";            res.setHeader('Content-Length', responseTxt.length);        res.setHeader('Server', 'Express-GraphQL-MySQL');        res.contentType('text/plain');        res.status(200);            res.send(responseTxt);    });        // Helper Functions        const ensureQueryIsAnInt = (queryString) => {            if(queryString === undefined) return 1;            const possibleInt = parseInt(queryString);        if(!possibleInt) return 1;            return possibleInt;    };        const graphqlOpts = (params) => {        return {            schema,            graphiql: false,            context: params || {}        }    };        const retrieveAndFormatAllFortunes = res => {            res.real_end = res.end;            res.end = async (data) => {            let toRet;            const json = JSON.parse(data.toString('utf8'));                if(json.data.getAllFortunes) {                toRet = json.data.getAllFortunes;            } else {                toRet = [];            }                const newFortune = { "id": 0, "message": "Additional fortune added at request time." };            toRet.push(newFortune);            toRet.sort((a, b) => (a.message < b.message) ? -1 : 1);                const htmlToRet = await spoofHTML(toRet);                res.contentType('html');            res.setHeader('Server', 'GraphQL-MySQL');            res.setHeader('Content-Length', htmlToRet.length + 32);            res.status(200);                res.real_end(htmlToRet);        }    };        const spoofHTML = arr => {            return new Promise((resolve, reject) => {                let count = 0;                let htmlToRet = `<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>`;                for (let fortune of arr) {                    htmlToRet += `<tr><td>${escape(fortune.id)}</td><td>${escape(fortune.message)}</td></tr>`;                count++;            }                htmlToRet += '</table></body></html>';                    if(count == arr.length)resolve(htmlToRet);            });    };        const formatResData = (res, queryName) => {            res.real_end = res.end;                res.end = (data) => {                const json = JSON.parse(data.toString('utf8'));                        let toRet = formatJson(queryName, json);                const jsonToRet = JSON.stringify(toRet);                        setResponseHeaders(res, jsonToRet.length);                res.real_end(jsonToRet);        };    };        const formatJson = (queryName, jsonData) => {            const isQueryReturningAnArray = {                singleDatabaseQuery: false,            multipleDatabaseQueries: true,            getRandomAndUpdate: true        };            if (isQueryReturningAnArray[queryName] == false) {                if(jsonData.data[`${queryName}`]) {                return {                    id: jsonData.data[`${queryName}`].id,                    randomNumber: jsonData.data[`${queryName}`].randomNumber                };            } else {                return {                    id: null,                    randomNumber: null                }            }        } else {                return jsonData.data[`${queryName}`] || [];        }    };        const setResponseHeaders = (res, jsonLength) => {            let now = new Date();            res.status(200);        res.contentType('application/json', 'charset=UTF-8');        res.setHeader('Date', dateFormat(now, "ddd, dd mmm yyyy hh:MM:ss Z"));        res.setHeader('Server', 'GraphQL-Express-MySQL');        res.setHeader('Content-Length', jsonLength);    };}
 |