All files / lib postProcess.js

20% Statements 12/60
0% Branches 0/26
0% Functions 0/14
21.43% Lines 12/56
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()
}