-
Notifications
You must be signed in to change notification settings - Fork 2k
/
remove.js
68 lines (55 loc) · 2.11 KB
/
remove.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
/**
* Module dependencies
*/
var actionUtil = require('../actionUtil');
var _ = require('lodash');
/**
* Remove a member from an association
*
* @param {Integer|String} parentid - the unique id of the parent record
* @param {Integer|String} id - the unique id of the child record to remove
*
* @option {String} model - the identity of the model
* @option {String} alias - the name of the association attribute (aka "alias")
*/
module.exports = function remove(req, res) {
// Ensure a model and alias can be deduced from the request.
var Model = actionUtil.parseModel(req);
var relation = req.options.alias;
if (!relation) {
return res.serverError(new Error('Missing required route option, `req.options.alias`.'));
}
// The primary key of the parent record
var parentPk = req.param('parentid');
// The primary key of the child record to remove
// from the aliased collection
var childPk = actionUtil.parsePk(req);
if(_.isUndefined(childPk)) {
return res.serverError('Missing required child PK.');
}
Model
.findOne(parentPk).exec(function found(err, parentRecord) {
if (err) return res.serverError(err);
if (!parentRecord) return res.notFound();
if (!parentRecord[relation]) return res.notFound();
parentRecord[relation].remove(childPk);
parentRecord.save(function(err) {
if (err) return res.negotiate(err);
Model.findOne(parentPk)
.populate(relation)
// TODO: use populateRequest util instead
.exec(function found(err, parentRecord) {
if (err) return res.serverError(err);
if (!parentRecord) return res.serverError();
if (!parentRecord[relation]) return res.serverError();
if (!parentRecord[Model.primaryKey]) return res.serverError();
// If we have the pubsub hook, use the model class's publish method
// to notify all subscribers about the removed item
if (req._sails.hooks.pubsub) {
Model.publishRemove(parentRecord[Model.primaryKey], relation, childPk, !req._sails.config.blueprints.mirror && req);
}
return res.ok(parentRecord);
});
});
});
};