UNPKG

json-api-server

Version:

A NodeJS framework implementing json:api

105 lines (92 loc) 3.48 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = generateRoutes; var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _restifyErrors = require('restify-errors'); var _restifyErrors2 = _interopRequireDefault(_restifyErrors); var _sequelize = require('sequelize'); var _sequelize2 = _interopRequireDefault(_sequelize); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function generateRoutes(model, apiHelper) { return { getAll: function getAllResources(req, res, next) { return model.findAll().then(function (resources) { res.send(apiHelper.serialize(resources)); return next(); }); }, get: function getResource(req, res, next) { return model.findById(req.params.id).then(function (resource) { if (_lodash2.default.isEmpty(resource)) { return next(new _restifyErrors2.default.NotFoundError()); } res.send(apiHelper.serialize(resource)); return next(); }); }, create: function createResource(req, res, next) { var resource = apiHelper.deserialize(JSON.parse(req.body.toString('utf8'))); return model.findOrCreate({ where: resource, default: resource }).spread(function (newResource, created) { if (created) { res.send(200, apiHelper.serialize(newResource)); } else { res.send(201, apiHelper.serialize(newResource)); } return next(); }).catch(_sequelize2.default.ValidationError, function (error) { var detail = _lodash2.default.reduce(error.errors, function (msg, err) { return '' + msg + err.path + ': ' + err.message + '\n'; }, ''); res.send(400, { errors: [{ status: '400', title: 'Bad Request', detail: detail }] }); }); }, update: function updateResource(req, res, next) { var bodyJson = JSON.parse(req.body.toString('utf8')); var attributesToUpdate = _lodash2.default.get(bodyJson, 'data.attributes', {}); var updates = apiHelper.deserialize(bodyJson); return model.update(updates, { where: { id: updates.id }, fields: _lodash2.default.keys(attributesToUpdate) }).spread(function (rowsUpdated) { if (!rowsUpdated || rowsUpdated < 1) { throw Error('Could not update resource'); } return model.findById(updates.id); }).then(function (resource) { res.send(200, apiHelper.serialize(resource)); return next(); }).catch(_sequelize2.default.ValidationError, function (error) { var detail = _lodash2.default.reduce(error.errors, function (msg, err) { return '' + msg + err.path + ': ' + err.message + '\n'; }, ''); res.send(400, { errors: [{ status: '400', title: 'Bad Request', detail: detail }] }); }); }, delete: function deleteResource(req, res, next) { return model.destroy({ where: { id: req.params.id } }).then(function (numberDestroyed) { if (numberDestroyed === 1) { res.send(204); return next(); } return next(new _restifyErrors2.default.NotFoundError()); }).catch(function () { return next(new _restifyErrors2.default.NotFoundError()); }); } }; }