-
Notifications
You must be signed in to change notification settings - Fork 116
/
read.js
65 lines (51 loc) · 1.67 KB
/
read.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
'use strict';
var util = require('util'),
Base = require('./base'),
errors = require('../Errors');
var Read = function(args) {
Read.super_.call(this, args);
};
util.inherits(Read, Base);
Read.prototype.action = 'read';
Read.prototype.method = 'get';
Read.prototype.plurality = 'singular';
Read.prototype.fetch = function(req, res, context) {
var model = this.model,
endpoint = this.endpoint,
options = context.options || {},
criteria = context.criteria || {},
include = this.include,
includeAttributes = this.includeAttributes || [];
// only look up attributes we care about
options.attributes = options.attributes || this.resource.attributes;
// remove params that are already accounted for in criteria
Object.keys(criteria).forEach(function(attr) { delete req.params[attr]; });
endpoint.attributes.forEach(function(attribute) {
if (attribute in req.params) criteria[attribute] = req.params[attribute];
});
if (Object.keys(criteria).length) {
options.where = criteria;
}
if (context.include && context.include.length) {
include = include.concat(context.include);
}
if (include.length) options.include = include;
if (this.resource.associationOptions.removeForeignKeys) {
options.attributes = options.attributes.filter(function(attr) {
return includeAttributes.indexOf(attr) === -1;
});
}
if (req.query.scope) {
model = model.scope(req.query.scope);
}
return model
.find(options)
.then(function(instance) {
if (!instance) {
throw new errors.NotFoundError();
}
context.instance = instance;
return context.continue;
});
};
module.exports = Read;