UNPKG

mockingjay.js

Version:

"Provides Mockdata or downloads it from predefined REST services"

85 lines (71 loc) 2.6 kB
const request = require('superagent'); const _ = require('lodash/fp'); const express = require('express'); const encodeUrl = _.flow( encodeURIComponent, _.replace(/\./g, '%2E') ) module.exports = function getMockingjayRouter(db, dbIntegrityMode) { const router = express.Router() router.get('/db', (req, res) => { res.jsonp(db.getState()) }) const dataAccessHandler = {} dataAccessHandler[dbIntegrityMode.READONLY] = (url, method) => { return new Promise((resolve, reject) => { const path = [encodeUrl(url), method].join('.') const result = db.get(path).value() if (result) { resolve(result) } else { reject(new Error(`Response for ${url} is missing in database`)) } }) } dataAccessHandler[dbIntegrityMode.OVERWRITE] = (url, method) => { return new Promise((resolve, reject) => { request [method.toLowerCase()](url) .end((err, realRes) => { if (err) { reject(err) } else { const path = [encodeUrl(url), method].join('.') db.set(path, realRes.body).value() resolve(realRes.body) /* Since lowdb for inMemoryOnly-Mode does not provide a write-method * we can not assue it is there always. This seems to be a lowdb * fraud, we have to work around here */ if (db.write) { db.write() } } }) }) } router.param('url', (req, res, next, url) => { dataAccessHandler[dbIntegrityMode.currentValue()](url, req.method) .then((result) => { res.locals.data = result next() }) .catch((err) => { res.status(404) res.locals.data = {} next() }) }) const handleUrl = (req, res) => { if (!res.locals.data) { res.status(404) res.locals.data = {} } res.jsonp(res.locals.data) } router.get('/urls/:url', handleUrl) router.post('/urls/:url', handleUrl) router.put('/urls/:url', handleUrl) router.delete('/urls/:url', handleUrl) return router }