"use strict"; // let realConsoleLog = console.log.bind(console); // console.log = function(...args) { // realConsoleLog(`[console.log called from ${(new Error).stack.split("\n")[2].replace(/^\s* at /, "")}]`); // realConsoleLog(...args); // }; // let realConsoleError = console.error.bind(console); // console.error = function(...args) { // realConsoleError(`[console.error called from ${(new Error).stack.split("\n")[2].replace(/^\s* at /, "")}]`); // realConsoleError(...args); // }; const Promise = require("bluebird"); const express = require("express"); const expressPromiseRouter = require("express-promise-router"); const pipe = require("@promistream/pipe"); const fromNodeStream = require("@promistream/from-node-stream"); const map = require("@promistream/map"); const initialize = require("./initialize"); const errors = require("./errors"); return Promise.try(() => { return initialize({ knexfile: require("../knexfile") }); }).then((state) => { let { db, knex } = state; const queries = require("./queries")(state); let app = express(); let router = expressPromiseRouter(); router.get("/items/:id", (req, res) => { return Promise.try(() => { return db.Item.query(knex).findById(req.params.id); }).then((item) => { if (item != null) { res.json(item); } else { throw new errors.NotFound(`No such item exists`); } }); }); router.delete("/items/:id", (req, res) => { return Promise.try(() => { return db.Item.query(knex) .findById(req.params.id) .delete(); }).then((affectedRows) => { if (affectedRows > 0) { res.status(204).end(); } else { throw new errors.NotFound(`No such item exists`); } }); }); // MARKER: Stub out routes, replace error implementation, add response generation for HTTP errors router.get("/items/:id/metadata", (req, res) => { }); router.get("/items/:id/operations", (req, res) => { }); router.get("/items/:id/operations/:operation/expire", (req, res) => { }); router.post("/items/add", (req, res) => { }); router.put("/items/add/:id", (req, res) => { }); router.get("/items/:id", (req, res) => { }); router.get("/updates", (req, res) => { let timestamp = (req.query.timestamp != null) ? new Date(parseInt(req.query.since) * 1000) : undefined; // FIXME: Validation! return pipe([ queries.getUpdates(knex, { prefix: req.query.prefix, timestamp: timestamp }), map((item) => JSON.stringify(item) + "\n"), fromNodeStream(res) ]).read(); }); app.use(router); app.listen(3000, () => { console.log("Server listening on port 3000"); }); });