import express from 'express'; import React from 'react'; import { renderToString } from 'react-dom/server'; import { StaticRouter } from 'react-router-dom'; import serialize from 'serialize-javascript'; import { getBuildingById, getBuildingUPRNsById, getBuildingPlanningDataById, getLatestRevisionId, getUserVerifiedAttributes } from './api/services/building/base'; import { getUserById } from './api/services/user'; import { App } from './frontend/app'; import { parseBuildingURL } from './parse'; import asyncController from './api/routes/asyncController'; // reference packed assets const assets = require(process.env.RAZZLE_ASSETS_MANIFEST); const frontendRoute = asyncController(async (req: express.Request, res: express.Response) => { const context: any = {}; // TODO: remove any const data: any = {}; // TODO: remove any context.status = 200; const userId = req.session.user_id; const buildingId = parseBuildingURL(req.url); const isBuilding = (typeof (buildingId) !== 'undefined'); if (isBuilding && isNaN(buildingId)) { context.status = 404; } try { let [user, building, uprns, planningData, userVerified, latestRevisionId] = await Promise.all([ userId ? getUserById(userId) : undefined, isBuilding ? getBuildingById( buildingId, { userDataOptions: userId ? { userId, userAttributes: true } : null } ) : undefined, isBuilding ? getBuildingUPRNsById(buildingId) : undefined, isBuilding ? getBuildingPlanningDataById(buildingId) : undefined, (isBuilding && userId) ? getUserVerifiedAttributes(buildingId, userId) : {}, getLatestRevisionId() ]); if (isBuilding && typeof (building) === 'undefined') { context.status = 404; } data.user = user; data.building = building; data.user_verified = userVerified; if (data.building != null) { data.building.uprns = uprns; } if (data.building != null) { data.building.planning_data = planningData; } data.latestRevisionId = latestRevisionId; renderHTML(context, data, req, res); } catch(error) { console.error(error); data.user = undefined; data.building = undefined; data.user_verified = {} data.latestRevisionId = 0; context.status = 500; renderHTML(context, data, req, res); } }); function renderHTML(context, data, req, res) { const markup = renderToString( ); if (context.url) { res.redirect(context.url); } else { res.status(context.status).send( ` Colouring London ${ assets.client.css ? `` : '' } ${ process.env.NODE_ENV === 'production' ? `` : `` }
${markup}
` ); } } export default frontendRoute;