-
Notifications
You must be signed in to change notification settings - Fork 1
/
controller.js
91 lines (81 loc) · 2.54 KB
/
controller.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
* Created by alex on 01.08.2015.
*/
var paginator = require("paginator-express"),
_ = require('lodash'),
express = require('express');
var router = express.Router();
module.exports = function (model, customActions, options) {
var ctrl = new Controller(model, options);
_.forOwn(customActions, function (action, name) {
ctrl[name] = action;
})
return ctrl;
};
function Controller(model, customOptions) {
var options = {};
_.assign(options, customOptions);
var controller = {
list: paginator.controller(model.find().sort({_id: 1}), options.listFilter),
create: function (req, res, next) {
var m = new model(req.body);
m.save()
.then(function (result) {
res.status(201);
res.json(result);
}, next)
},
read: function (req, res, next) {
load(model, req.params.id || req.query.id, req.query.populate)
.then(function (result) {
if (result) {
res.status(200);
res.json(result)
} else {
res.status(404);
res.end();
}
}, next)
},
update: function (req, res, next) {
load(model, req.params.id || req.query.id)
.then(function (result) {
if (result) {
_.assign(result, req.body);
return result.save();
} else {
res.status(404);
res.end();
}
}, next)
.then(function (result) {
res.status(200);
res.json(result)
}, next)
},
delete: function (req, res, next) {
load(model, req.params.id || req.query.id)
.then(function (result) {
if (result) {
return result.remove();
} else {
res.status(404);
res.end();
}
}, next)
.then(function () {
res.status(204);
res.end();
}, next)
}
};
return controller;
}
function load(model, id, populate) {
var q = model.findOne({
_id: id
})
if (populate)
q.populate(populate)
return q.exec();
}