All files / node-user-accounts-boilerplate-nahid/filters parse.js

100% Statements 43/43
100% Branches 51/51
100% Functions 6/6
100% Lines 42/42

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130          10x   11x   9x   9x   3x   3x 3x   1x       2x     9x   8x       1x   9x   2x   9x                     39x                                       39x     39x         30x   11x   11x   10x   10x   9x   10x       30x   3x 3x   27x   2x     25x   4x   2x     21x   4x     17x   2x 3x   15x   2x       39x     4x  
"use strict";
 
 
function parseFieldValues(output, searchField, field, values)
{
  for (let value of values)
  {
    if (searchField.filters && searchField.filters.length > 0)
    {
      let filter = searchField.filters[0];
 
      if (value.match(/^[a-z0-9]+:/))
      {
        let index = value.indexOf(':');
 
        filter = value.substr(0, index);
        if (searchField.filters.indexOf(filter) === -1)
        {
          filter = searchField.filters[0];
        }
        else
        {
          value = value.substr(index + 1);
        }
      }
      if (filter !== 'regex')
      {
        value = value.split('|');
      }
      else
      {
        value = [value];
      }
      if (searchField.enum)
      {
        value = value.filter((v) => v.length > 0 && searchField.enum.indexOf(v) !== -1);
      }
      output.filter.push({
        field: searchField.searchField || field,
        filter,
        value
      });
    }
  }
}
 
function getDefaultOutput(searchMetadata)
{
  return {
    offset: 0,
    limit: searchMetadata && searchMetadata.limit && searchMetadata.limit.default ? searchMetadata.limit.default : 20,
    filter: [],
    sort: false,
    order: 'asc',
    extra: [],
    returnFacets: false
  };
}
 
/**
 * Validate and parse Request.query against what is acceptable from a SearchMetadata specification
 * 
 * @param {SearchMetadata} searchMetadata
 * @param {Query} query
 * @return {ParsedQuery} will validated and parsed query filters
 */
function parse(searchMetadata, query)
{
  let output = getDefaultOutput(searchMetadata);
  // process query fields
 
  Object.keys(query)
    .sort()
    .forEach((field) =>
    {
      // filters
      if (searchMetadata.fields)
      {
        let searchField = searchMetadata.fields && searchMetadata.fields[field];
 
        if (searchField)
        {
          let values = query[field];
 
          if (!Array.isArray(values))
          {
            values = [values];
          }
          parseFieldValues(output, searchField, field, values);
        }
      }
      // paging
      if (field === 'offset')
      {
        console.log();
        output.offset = Math.max(0, parseInt(query.offset));
      }
      else if (field === 'limit' && searchMetadata.limit)
      {
        output.limit = Math.max(searchMetadata.limit.minimum, Math.min(searchMetadata.limit.maximum, parseInt(query.limit)));
      }
      // sorting
      else if (field === 'sort')
      {
        if (searchMetadata.sort && searchMetadata.sort.indexOf(query.sort) !== -1)
        {
          output.sort = query.sort;
        }
      }
      else if (field === 'order')
      {
        output.order = query.order.substr(0, 1) !== 'd' ? 'asc' : 'dsc';
      }
      // facets and extra columns
      else if (field === 'extra')
      {
        output.extra = query.extra.split(/\|/g)
          .filter((x) => x);
      }
      else if (field === 'facets' && searchMetadata.facets)
      {
        output.returnFacets = true;
      }
    });
 
  return output;
}
 
module.exports = parse;