'use strict'; const Promise = require("bluebird"); const express = require("express"); // const expressWs = require("express-ws"); const knex = require("knex"); const path = require("path"); const bodyParser = require("body-parser"); const expressAsyncReact = require("./express-async-react"); function projectPath(targetPath) { return path.join(__dirname, "..", targetPath); } module.exports = function () { let db = knex(require("../knexfile")); let imageStore = require("./image-store")(projectPath("./images")); let taskTracker = require("../lib/tasks/tracker")(); let apiQuery = require("./api")(); let state = {db, imageStore, taskTracker}; let app = express(); // expressWs(app); app.engine("jsx", expressAsyncReact.createEngine({ prepare: (template, locals) => { return Promise.try(() => { if (template.query != null) { let queryArguments = (template.queryArguments != null) ? template.queryArguments(locals) : {}; return apiQuery(template.query, queryArguments); } }).then((result) => { if (result == null) { return {}; } else { if (result.errors != null && result.errors.length > 0) { throw result.errors[0]; } else { return { data: result.data }; } } }); } })); app.set("view engine", "jsx"); app.set("views", projectPath("src/views")); app.locals[expressAsyncReact.Settings] = { componentPath: "template" }; app.use((req, res, next) => { res.locals.currentPath = req.originalUrl; next(); }); app.use(express.static(projectPath("public"))); app.use(bodyParser.urlencoded({ extended: true })); app.use(require("./routes/index")); app.use("/disk-images", require("./routes/disk-images")(state)); app.use("/instances", require("./routes/instances")(state)); app.use("/hardware/storage-devices", require("./routes/storage-devices")(state)); app.use((err, req, res, next) => { if (err.showChain != null) { console.log(err.showChain()); console.log("#####################"); console.log(err.getAllContext()); } else { console.log(err.stack); } res.render("error", { error: err }); }); return app; };