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);
- };
- }
|