From 27811515b4fbc5fe34077aa97020cc1482246d7b Mon Sep 17 00:00:00 2001 From: Linus Miller Date: Thu, 14 Jul 2016 18:54:01 +0200 Subject: [PATCH] First add of geolets service. --- server/routes.js | 4 +- server/services/geolets/middleware.js | 118 ++++++++++++++++++++++++++ server/services/geolets/model.js | 18 ++++ server/services/geolets/routes.js | 12 +++ 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 server/services/geolets/middleware.js create mode 100644 server/services/geolets/model.js create mode 100644 server/services/geolets/routes.js diff --git a/server/routes.js b/server/routes.js index 8ab98ef..01c0db7 100644 --- a/server/routes.js +++ b/server/routes.js @@ -8,4 +8,6 @@ module.exports = [ next(); } ] -]; +].concat( + require('./services/geolets/routes') +); diff --git a/server/services/geolets/middleware.js b/server/services/geolets/middleware.js new file mode 100644 index 0000000..dcdb533 --- /dev/null +++ b/server/services/geolets/middleware.js @@ -0,0 +1,118 @@ +'use strict'; + +const mw = { + formatQuery: require('warepot/format-query'), + paginate: require('warepot/paginate') +}; + +const mongoose = require('mongoose'); + +const Geolet = require('./model'); + +function create(req, res, next) { + Geolet.create(req.body, function (err, geolet) { + if (err) return next(err); + res.status(201).json(geolet); + }); +} + +function find(req, res, next) { + const page = Math.max(0, req.query.page) || 0; + const perPage = Math.max(0, req.query.limit) || res.locals.perPage; + + const query = Geolet.find(_.omit(req.query, 'limit', 'sort', 'page'), + null, + { sort: req.query.sort || '-dateCreated', lean: true }); + + if (perPage) + query.limit(perPage).skip(perPage * page); + + query.exec(function (err, geolets) { + res.locals.geolets = geolets; + next(err); + }); +} + +function getAll(req, res, next) { + Geolet.find({}, function (err, geolets) { + if (err) return next(err); + + res.locals.geolets = geolets; + next(); + }); +} + +function findById(req, res, next) { + if (req.params.id === 'new') return next(); + + const query = {}; + + query[mongoose.Types.ObjectId.isValid(req.params.id) ? '_id' : '_hid'] = req.params.id; + + Geolet.findOne(query, function (err, geolet) { + if (err) return next(err); + res.locals.geolet = geolet; + next(); + }); +} + +function patch(req, res, next) { + const query = {}; + + query[mongoose.Types.ObjectId.isValid(req.params.id) ? '_id' : '_hid'] = req.params.id; + + Geolet.findOne(query, function (err, geolet) { + delete req.body._id; + delete req.body.__v; + + _.extend(geolet, req.body); + + return geolet.save(function (err) { + if (err) return next(err); + + return res.status(200).json(geolet); + }); + }); +} + +function put(req, res, next) { + const query = {}; + + query[mongoose.Types.ObjectId.isValid(req.params.id) ? '_id' : '_hid'] = req.params.id; + + Geolet.findOne(query, function (err, geolet) { + _.difference(_.keys(geolet.toObject()), _.keys(req.body)).forEach(function (key) { + geolet[key] = undefined; + }); + + _.extend(geolet, _.omit(req.body, '_id', '__v')); + + return geolet.save(function (err) { + if (err) return next(err); + + return res.status(200).json(geolet); + }); + }); +} + +function remove(req, res, next) { + return Geolet.findById(req.params.id, function (err, geolet) { + if (err) return next(err); + return geolet.remove(function (err) { + if (err) return next(err); + return res.sendStatus(200); + }); + }); +} + +module.exports = { + create, + find, + getAll, + findById, + formatQuery: mw.formatQuery([ 'page', 'limit', 'sort' ]), + paginate: mw.paginate(Geolet, 10), + patch, + put, + remove +}; diff --git a/server/services/geolets/model.js b/server/services/geolets/model.js new file mode 100644 index 0000000..59d9be7 --- /dev/null +++ b/server/services/geolets/model.js @@ -0,0 +1,18 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const schema = { + latitude: Number, + longitude: Number, + title: String, + description: String, + images: [], + tags: [] +}; + +const GeoletSchema = new mongoose.Schema(schema); + +GeoletSchema.plugin(require('mongopot/plugins/base')); + +module.exports = mongoose.model('Geolet', GeoletSchema); diff --git a/server/services/geolets/routes.js b/server/services/geolets/routes.js new file mode 100644 index 0000000..09e5a24 --- /dev/null +++ b/server/services/geolets/routes.js @@ -0,0 +1,12 @@ +'use strict'; + +const mw = require('./middleware'); + +module.exports = [ + [ '/api/geolets/', 'get', [ mw.formatQuery, mw.paginate, mw.find ]], + [ '/api/geolets/', 'post', [ mw.create ]], + [ '/api/geolets/:id', 'get', [ mw.findById ]], + [ '/api/geolets/:id', 'put', [ mw.put ]], + [ '/api/geolets/:id', 'patch', [ mw.patch ]], + [ '/api/geolets/:id', 'delete', [ mw.remove ]] +];