| 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
92
93 |
1x
1x
1x
1x
1x
1x
1x
1x
1x
1x
1x
1x
| 'use strict'
const postProcess = module.exports = { }
const jsonApi = require('..')
const debug = require('./debugging.js')
const rerouter = require('./rerouter.js')
const async = require('async')
postProcess._applySort = require('./postProcessing/sort.js').action
postProcess._applyFilter = require('./postProcessing/filter.js').action
postProcess._applyIncludes = require('./postProcessing/include.js').action
postProcess._applyFields = require('./postProcessing/fields.js').action
postProcess.handle = (request, response, callback) => {
async.waterfall([
next => postProcess._applySort(request, response, next),
next => postProcess._applyFilter(request, response, next),
next => postProcess._applyIncludes(request, response, next),
next => postProcess._applyFields(request, response, next)
], err => callback(err))
}
postProcess._fetchRelatedResources = (request, mainResource, callback) => {
// Fetch the other objects
let dataItems = mainResource[request.params.relation]
if (!dataItems) return callback(null, [ null ], null)
if (!(Array.isArray(dataItems))) dataItems = [ dataItems ]
let resourcesToFetch = dataItems.reduce((map, dataItem) => {
map[dataItem.type] = map[dataItem.type] || [ ]
map[dataItem.type].push(dataItem.id)
return map
}, { })
resourcesToFetch = Object.keys(resourcesToFetch).map(type => {
let ids = resourcesToFetch[type]
const urlJoiner = '&filter[id]='
ids = urlJoiner + ids.join(urlJoiner)
let uri = `${jsonApi._apiConfig.pathPrefix + type}/?${ids}`
if (request.route.query) {
uri += `&${request.route.query}`
}
return uri
})
let total = null
async.map(resourcesToFetch, (related, done) => {
debug.include(related)
rerouter.route({
method: 'GET',
uri: related,
originalRequest: request,
params: { filter: request.params.filter }
}, (err, json) => {
if (err) {
debug.include('!!', JSON.stringify(err))
return done(err.errors)
}
let data = json.data
if (json.meta && json.meta.page) {
total = (total || 0) + json.meta.page.total
}
if (!(Array.isArray(data))) data = [ data ]
return done(null, data)
})
}, (err, otherResources) => {
if (err) return callback(err)
const relatedResources = [].concat.apply([], otherResources)
return callback(null, relatedResources, total)
})
}
postProcess.fetchForeignKeys = (request, items, schema, callback) => {
if (!(Array.isArray(items))) {
items = [ items ]
}
items.forEach(item => {
for (const i in schema) {
const settings = schema[i]._settings
if (settings && settings.__as) {
item[i] = undefined
}
}
})
return callback()
}
|