All files / lib/postProcessing fields.js

15% Statements 3/20
0% Branches 0/12
0% Functions 0/3
15.79% Lines 3/19
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  1x   1x   1x                                                                                  
'use strict'
const fields = module.exports = { }
 
const jsonApi = require('../jsonApi.js')
 
fields.action = (request, response, callback) => {
  const resourceList = request.params.fields
  if (!resourceList || !(resourceList instanceof Object)) return callback()
 
  const allDataItems = response.included.concat(response.data)
 
  const fields = {}
  for (const resource in resourceList) {
    if (!jsonApi._resources[resource]) {
      return callback({ // eslint-disable-line standard/no-callback-literal
        status: '403',
        code: 'EFORBIDDEN',
        title: 'Invalid field resource',
        detail: `${resource} is not a valid resource `
      })
    }
 
    fields[resource] = (`${resourceList[resource]}`).split(',')
 
    for (const j of fields[resource]) {
      if (!jsonApi._resources[resource].attributes[j]) {
        return callback({ // eslint-disable-line standard/no-callback-literal
          status: '403',
          code: 'EFORBIDDEN',
          title: 'Invalid field selection',
          detail: `${resource} do not have property ${j}`
        })
      }
    }
  }
 
  allDataItems.forEach(dataItem => {
    Object.keys(dataItem.attributes).forEach(attribute => {
      if (fields[dataItem.type] && fields[dataItem.type].indexOf(attribute) === -1) {
        delete dataItem.attributes[attribute]
      }
    })
  })
 
  return callback()
}