src/2.0/ParametersParser.js   A
last analyzed

Size

Lines of Code 167

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 92%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
nc 1
dl 0
loc 167
ccs 46
cts 50
cp 0.92
rs 10
noi 0

1 Function

Rating   Name   Duplication   Size   Complexity  
A ParametersParser.js ➔ ??? 0 16 1
1 1
const _               = require('lodash'),
2
      ParserInterface = require('../ParserInterface')
3
4
/**
5
 * @ignore _
6
 */
7
8
/**
9
 * Parameters parser
10
 * @class ParametersParser
11
 *
12
 * @property {Array.<Swagger20ParameterObject>|Array.<Swagger20HeaderObject>} originalParameter origin parameter from constructor
13
 * @property {Array.<Swagger20ParameterObject>} parameters Parsed parameters
14
 * @property {Array.<Swagger20HeaderObject>} headers Parsed headers
15
 * @property {Array.<Swagger20ParameterObject>} querys Queries parsed parameters
16
 * @property {Array.<Swagger20ParameterObject>} formDatas Form data parser object
17
 * @property {Array.<Swagger20ParameterObject>} bodys Bodies parser parameters
18
 * @property {Array.<Swagger20ParameterObject>} enums Enums definition
19
 */
20
class ParametersParser extends ParserInterface {
21
22
  /**
23
   * Constructor
24
   *
25
   * @param {Object} parameters
26
   * @param {ParameterParserOptionsObject|undefined} options
27
   */
28
  constructor (parameters, options) {
29 5
    options = options || {}
30 5
    super()
31
32 5
    this.addEnumDescription = options.addEnumDescription || true
33
34 5
    this.originParameter = parameters
35 5
    this.parameters      = []
36 5
    this.headers         = []
37 5
    this.paths           = []
38 5
    this.querys          = []
39 5
    this.formDatas       = []
40 5
    this.bodys           = []
41 5
    this.enums           = []
42 5
    this._destroyParam()
43
  }
44
45
  /**
46
   * Destroy current parameter values
47
   *
48
   * @private
49
   */
50
  _destroyParam () {
51 10
    this._currentParam         = undefined
52 10
    this._currentOriginalParam = undefined
53
  }
54
55
  /**
56
   * Check ignore parameters
57
   * Ignore parameters which contain the x-exclude-from-bindings extension
58
   * Ignore headers which are injected by proxies & app servers
59
   * eg: https://cloud.google.com/appengine/docs/go/requests#Go_Request_headers
60
   *
61
   * @return {boolean}
62
   * @private
63
   */
64
  _checkProxyHeader () {
65 5
    return (this._currentOriginalParam['x-exclude-from-bindings'] === true) ||
66
      (typeof this._currentOriginalParam['x-proxy-header'] !== 'undefined')
67
  }
68
69
  /**
70
   * Load references name from property
71
   *
72
   * @private
73
   */
74
  _loadReference () {
75 3
    if (_.isString(this._currentOriginalParam.$ref)) {
76 1
      let segments           = this._currentOriginalParam.$ref.split('/')
77 1
      this._currentParam.ref = segments[segments.length - 1]
78
    }
79
  }
80
81
  /**
82
   * Parse enum data from parameter
83
   * If
84
   *
85
   * @private
86
   */
87
  _parseEnum () {
88 3
    if (this._currentOriginalParam.enum) {
89 2
      if (this._currentOriginalParam.enum.length === 1) {
90
        this._currentParam.isSingleton = true
91
        this._currentParam.singleton   = this._currentOriginalParam.enum[0]
92
      } else {
93 1
        let _enum = {
94
          name         : _.upperFirst(_.camelCase(this._currentOriginalParam.name)) + ' Enum',
95
          camelCaseName: _.camelCase(this._currentOriginalParam.name),
96
          values       : this._currentOriginalParam.enum,
97
        }
98
99 2
        if (this.addEnumDescription) {
100 1
          _enum.description = this._currentOriginalParam.description
101
        }
102
103 1
        this.enums.push(_enum)
104
      }
105
    }
106
  }
107
108
  /**
109
   * Parse parameter type and set property in <code>true</code>
110
   * One of is [isBodyParameter, isPathParameter, isQueryParameter, isHeaderParameter, isFormDataParameter]
111
   *
112
   * @private
113
   */
114
  _parseParameterType () {
115 3
    if (this._currentParam.in) {
116 3
      this._currentParam['is' + _.upperFirst(this._currentParam.in) + 'Parameter'] = true
117
    }
118
119 3
    let pattern
120
121 4
    if (this._currentParam.isQueryParameter && (pattern = this._currentParam['x-name-pattern'])) {
122
      this._currentParam.isPatternType = true
123
      this._currentParam.pattern       = pattern
124
    }
125
126 3
    this._currentParam.cardinality = this._currentParam.required ? '' : '?'
127
  }
128
129
  /**
130
   * Parse parameters
131
   *
132
   * @return {Array.<Swagger20ParameterObject>}
133
   */
134
  parse () {
135 5
    let _self = this
136 5
    _.each(this.originParameter, (parameter) => {
137 5
      _self._currentOriginalParam = parameter || {}
138 5
      _self._currentParam         = parameter
139
140 5
      if (_self._checkProxyHeader()) {
141 2
        return
142
      }
143
144 3
      _self._loadReference()
145 3
      _self._parseEnum()
146 3
      _self._parseParameterType()
147
148 3
      _self._currentParam.camelCaseName = _.camelCase(parameter.name)
149
150 3
      if (_self._currentParam.in) {
151 3
        _self[_self._currentParam.in + 's'].push(_self._currentParam)
152
      }
153
154 3
      _self.parameters.push(_self._currentParam)
155
    })
156
157 5
    this._destroyParam()
158
159 5
    return this.parameters
160
  }
161
}
162
163
/**
164
 * @ignore module.exports
165
 * @ignore exports
166
 */
167
module.exports = ParametersParser