refactor: update lowdb and lodash

This commit is contained in:
Typicode
2016-05-08 18:53:43 +02:00
parent 293bac6f73
commit fc08f60898
8 changed files with 63 additions and 49 deletions

View File

@ -16,15 +16,15 @@
"errorhandler": "^1.2.0", "errorhandler": "^1.2.0",
"express": "^4.9.5", "express": "^4.9.5",
"got": "^3.3.0", "got": "^3.3.0",
"lodash": "^3.9.2", "lodash": "^4.11.2",
"lowdb": "^0.10.0", "lowdb": "^0.13.0-beta.2",
"method-override": "^2.1.2", "method-override": "^2.1.2",
"morgan": "^1.3.1", "morgan": "^1.3.1",
"node-uuid": "^1.4.2", "node-uuid": "^1.4.2",
"object-assign": "^4.0.1", "object-assign": "^4.0.1",
"pluralize": "^1.1.2", "pluralize": "^1.1.2",
"server-destroy": "^1.0.1", "server-destroy": "^1.0.1",
"underscore-db": "^0.9.1", "underscore-db": "^0.10.0",
"update-notifier": "^0.5.0", "update-notifier": "^0.5.0",
"yargs": "^4.2.0" "yargs": "^4.2.0"
}, },

View File

@ -136,8 +136,12 @@ module.exports = function (argv) {
if (chunk.trim().toLowerCase() === 's') { if (chunk.trim().toLowerCase() === 's') {
var filename = 'db-' + Date.now() + '.json' var filename = 'db-' + Date.now() + '.json'
var file = path.join(argv.snapshots, filename) var file = path.join(argv.snapshots, filename)
app.db.saveSync(file) app
console.log(' Saved snapshot to ' + path.relative(process.cwd(), file) + '\n') .db
.write(file)
.then(function () {
console.log(' Saved snapshot to ' + path.relative(process.cwd(), file) + '\n')
})
} }
}) })

View File

@ -1,6 +1,7 @@
var path = require('path') var path = require('path')
var got = require('got') var got = require('got')
var low = require('lowdb') var low = require('lowdb')
var fileAsync = require('lowdb/lib/file-async')
var is = require('./is') var is = require('./is')
module.exports = function (source, cb) { module.exports = function (source, cb) {
@ -27,7 +28,7 @@ module.exports = function (source, cb) {
} else if (is.JSON(source)) { } else if (is.JSON(source)) {
data = low(source).object data = low(source, { storage: fileAsync }).object
cb(null, data) cb(null, data)
} else { } else {

View File

@ -41,7 +41,7 @@ function createId (coll) {
if (_.isEmpty(coll)) { if (_.isEmpty(coll)) {
return 1 return 1
} else { } else {
var id = _.max(coll, function (doc) { var id = _.maxBy(coll, function (doc) {
return doc[idProperty] return doc[idProperty]
})[idProperty] })[idProperty]

View File

@ -4,6 +4,7 @@ var bodyParser = require('body-parser')
var _ = require('lodash') var _ = require('lodash')
var _db = require('underscore-db') var _db = require('underscore-db')
var low = require('lowdb') var low = require('lowdb')
var fileAsync = require('lowdb/lib/file-async')
var plural = require('./plural') var plural = require('./plural')
var nested = require('./nested') var nested = require('./nested')
var singular = require('./singular') var singular = require('./singular')
@ -23,9 +24,9 @@ module.exports = function (source) {
var db var db
if (_.isObject(source)) { if (_.isObject(source)) {
db = low() db = low()
db.object = source db.state(source)
} else { } else {
db = low(source) db = low(source, { storage: fileAsync })
} }
// Add underscore-db methods to db // Add underscore-db methods to db
@ -44,7 +45,7 @@ module.exports = function (source) {
// GET /db // GET /db
function showDatabase (req, res, next) { function showDatabase (req, res, next) {
res.locals.data = db.object res.locals.data = db.state()
next() next()
} }
@ -53,26 +54,24 @@ module.exports = function (source) {
router.use(nested()) router.use(nested())
// Create routes // Create routes
for (var prop in db.object) { db.forEach(function (value, key) {
var val = db.object[prop] if (_.isPlainObject(value)) {
router.use('/' + key, singular(db, key))
if (_.isPlainObject(val)) { return
router.use('/' + prop, singular(db, prop))
continue
} }
if (_.isArray(val)) { if (_.isArray(value)) {
router.use('/' + prop, plural(db, prop)) router.use('/' + key, plural(db, key))
continue return
} }
var msg = var msg =
'Type of "' + prop + '" (' + typeof val + ') ' + 'Type of "' + key + '" (' + typeof value + ') ' +
(_.isObject(source) ? '' : 'in ' + source) + ' is not supported. ' + (_.isObject(source) ? '' : 'in ' + source) + ' is not supported. ' +
'Use objects or arrays of objects.' 'Use objects or arrays of objects.'
throw new Error(msg) throw new Error(msg)
} }).value()
router.use(function (req, res) { router.use(function (req, res) {
if (!res.locals.data) { if (!res.locals.data) {
@ -83,5 +82,10 @@ module.exports = function (source) {
router.render(req, res) router.render(req, res)
}) })
router.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send(err.stack)
})
return router return router
} }

View File

@ -12,11 +12,11 @@ module.exports = function (db, name) {
function embed (resource, e) { function embed (resource, e) {
e && [].concat(e) e && [].concat(e)
.forEach(function (externalResource) { .forEach(function (externalResource) {
if (db.object[externalResource]) { if (db.get(externalResource).value) {
var query = {} var query = {}
var singularResource = pluralize.singular(name) var singularResource = pluralize.singular(name)
query[singularResource + 'Id'] = resource.id query[singularResource + 'Id'] = resource.id
resource[externalResource] = db(externalResource).where(query) resource[externalResource] = db.get(externalResource).filter(query).value()
} }
}) })
} }
@ -26,9 +26,9 @@ module.exports = function (db, name) {
e && [].concat(e) e && [].concat(e)
.forEach(function (innerResource) { .forEach(function (innerResource) {
var plural = pluralize(innerResource) var plural = pluralize(innerResource)
if (db.object[plural]) { if (db.get(plural).value()) {
var prop = innerResource + 'Id' var prop = innerResource + 'Id'
resource[innerResource] = db(plural).getById(resource[prop]) resource[innerResource] = db.get(plural).getById(resource[prop]).value()
} }
}) })
} }
@ -42,7 +42,7 @@ module.exports = function (db, name) {
function list (req, res, next) { function list (req, res, next) {
// Resource chain // Resource chain
var chain = db(name).chain() var chain = db.get(name)
// Remove q, _start, _end, ... from req.query to avoid filtering using those // Remove q, _start, _end, ... from req.query to avoid filtering using those
// parameters // parameters
@ -66,7 +66,7 @@ module.exports = function (db, name) {
// Automatically delete query parameters that can't be found // Automatically delete query parameters that can't be found
// in the database // in the database
Object.keys(req.query).forEach(function (query) { Object.keys(req.query).forEach(function (query) {
var arr = db(name).value() var arr = db.get(name).value()
for (var i in arr) { for (var i in arr) {
if ( if (
_.has(arr[i], query) || _.has(arr[i], query) ||
@ -183,7 +183,7 @@ module.exports = function (db, name) {
var _embed = req.query._embed var _embed = req.query._embed
var _expand = req.query._expand var _expand = req.query._expand
var id = utils.toNative(req.params.id) var id = utils.toNative(req.params.id)
var resource = db(name).getById(id) var resource = db.get(name).getById(id).value()
if (resource) { if (resource) {
// Clone resource to avoid making changes to the underlying object // Clone resource to avoid making changes to the underlying object
@ -209,8 +209,9 @@ module.exports = function (db, name) {
req.body[key] = utils.toNative(req.body[key]) req.body[key] = utils.toNative(req.body[key])
} }
var resource = db(name) var resource = db.get(name)
.insert(req.body) .insert(req.body)
.value()
res.status(201) res.status(201)
res.locals.data = resource res.locals.data = resource
@ -225,10 +226,13 @@ module.exports = function (db, name) {
} }
var id = utils.toNative(req.params.id) var id = utils.toNative(req.params.id)
var chain = db.get(name)
var resource = req.method === 'PATCH' ? chain = req.method === 'PATCH' ?
db(name).updateById(id, req.body) : chain.updateById(id, req.body) :
db(name).replaceById(id, req.body) chain.replaceById(id, req.body)
var resource = chain.value()
if (resource) { if (resource) {
res.locals.data = resource res.locals.data = resource
@ -239,13 +243,13 @@ module.exports = function (db, name) {
// DELETE /name/:id // DELETE /name/:id
function destroy (req, res, next) { function destroy (req, res, next) {
var resource = db(name).removeById(utils.toNative(req.params.id)) var resource = db.get(name).removeById(utils.toNative(req.params.id)).value()
// Remove dependents documents // Remove dependents documents
var removable = db._.getRemovable(db.object) var removable = db._.getRemovable(db.state())
_.each(removable, function (item) { _.each(removable, function (item) {
db(item.name).removeById(item.id) db.get(item.name).removeById(item.id).value()
}) })
if (resource) { if (resource) {

View File

@ -5,27 +5,28 @@ module.exports = function (db, name) {
var router = express.Router() var router = express.Router()
function show (req, res, next) { function show (req, res, next) {
res.locals.data = db.object[name] res.locals.data = db.get(name).value()
next() next()
} }
function create (req, res, next) { function create (req, res, next) {
res.locals.data = db.object[name] = req.body db.set(name, req.body).value()
res.locals.data = db.get(name).value()
res.status(201) res.status(201)
next() next()
} }
function update (req, res, next) { function update (req, res, next) {
if (req.method === 'PUT') { if (req.method === 'PUT') {
delete db.object[name] db.set(name, req.body)
db.object[name] = {} .value()
} else {
db.get(name)
.assign(req.body)
.value()
} }
for (var prop in req.body) { res.locals.data = db.get(name).value()
db.object[name][prop] = req.body[prop]
}
res.locals.data = db.object[name]
next() next()
} }

View File

@ -554,9 +554,9 @@ describe('Server', function () {
}) })
describe('Database #object', function () { describe('Database state', function () {
it('should be accessible', function () { it('should be accessible', function () {
assert(router.db.object) assert(router.db.state())
}) })
}) })
@ -614,11 +614,11 @@ describe('Server', function () {
describe('router.db._.id', function (done) { describe('router.db._.id', function (done) {
beforeEach(function () { beforeEach(function () {
router.db.object = { router.db.state({
posts: [ posts: [
{ _id: 1 } { _id: 1 }
] ]
} })
router.db._.id = '_id' router.db._.id = '_id'
}) })
@ -627,7 +627,7 @@ describe('Server', function () {
request(server) request(server)
.get('/posts/1') .get('/posts/1')
.expect('Content-Type', /json/) .expect('Content-Type', /json/)
.expect(router.db.object.posts[0]) .expect(router.db.state().posts[0])
.expect(200, done) .expect(200, done)
}) })