From 3695c82472a2fc10f1838260d20278faacc845c3 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sun, 3 Sep 2023 12:26:41 +0100 Subject: [PATCH] Updates middleware, with both AWS and Express support --- api/_common/middleware.js | 67 ++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/api/_common/middleware.js b/api/_common/middleware.js index 362db17..2ac0629 100644 --- a/api/_common/middleware.js +++ b/api/_common/middleware.js @@ -2,37 +2,82 @@ const normalizeUrl = (url) => { return url.startsWith('http') ? url : `https://${url}`; }; +const headers = { + 'Access-Control-Allow-Origin': process.env.API_CORS_ORIGIN || '*', + 'Access-Control-Allow-Credentials': true, + 'Content-Type': 'application/json;charset=UTF-8', +}; + const commonMiddleware = (handler) => { - return async (event, context, callback) => { - const queryParams = event.queryStringParameters || event.query || {}; + // Vercel + const vercelHandler = async (request, response) => { + const queryParams = request.query || {}; const rawUrl = queryParams.url; - + if (!rawUrl) { - callback(null, { - statusCode: 500, - body: JSON.stringify({ error: 'No URL specified' }), - }); + return response.status(500).json({ error: 'No URL specified' }); } const url = normalizeUrl(rawUrl); try { - const response = await handler(url, event, context); - if (response.body && response.statusCode) { - callback(null, response); + const handlerResponse = await handler(url, request); + if (handlerResponse.body && handlerResponse.statusCode) { + response.status(handlerResponse.statusCode).json(handlerResponse.body); + } else { + response.status(200).json( + typeof handlerResponse === 'object' ? handlerResponse : JSON.parse(handlerResponse) + ); + } + } catch (error) { + response.status(500).json({ error: error.message }); + } + }; + + // Netlify + const netlifyHandler = async (event, context, callback) => { + const queryParams = event.queryStringParameters || event.query || {}; + const rawUrl = queryParams.url; + + if (!rawUrl) { + callback(null, { + statusCode: 500, + body: JSON.stringify({ error: 'No URL specified' }), + headers, + }); + return; + } + + const url = normalizeUrl(rawUrl); + + try { + const handlerResponse = await handler(url, event, context); + if (handlerResponse.body && handlerResponse.statusCode) { + callback(null, handlerResponse); } else { callback(null, { statusCode: 200, - body: typeof response === 'object' ? JSON.stringify(response) : response, + body: typeof handlerResponse === 'object' ? JSON.stringify(handlerResponse) : handlerResponse, + headers, }); } } catch (error) { callback(null, { statusCode: 500, body: JSON.stringify({ error: error.message }), + headers, }); } }; + + let platform; + if (process.env.PLATFORM === 'vercel' || process.env.VERCEL) { + platform = 'vercel'; + } else { + platform = 'netlify'; + } + return platform === 'vercel' ? vercelHandler : netlifyHandler; + }; module.exports = commonMiddleware;