Passed
Push — master ( e73aee...4c1815 )
by Sergii
01:17
created

parser.js ➔ ... ➔ _.forEach   B

Complexity

Conditions 1
Paths 256

Size

Total Lines 91

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 2 Features 0
Metric Value
cc 1
c 2
b 2
f 0
nc 256
nop 2
dl 0
loc 91
rs 7.2565

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
/**
2
 * @author Donii Sergii <[email protected]>
3
 */
4
5
'use strict'
6
let _ = require('lodash')
7
let normalizeName = function (id) {
8
    /* eslint-disable */
9
    return id.replace(/\.|\-|\{|\}/g, '_').split(" ").join("_")
10
    /* eslint-enable */
11
}
12
13
let getPathToMethodName = function (opts, m, path) {
14
    if (path === '/' || path === '') {
15
        return m
16
    }
17
18
    // clean url path for requests ending with '/'
19
    let cleanPath = path.replace(/\/$/, '')
20
21
    let segments = cleanPath.split('/').slice(1)
22
    segments = _.transform(segments, function (result, segment) {
23
        if (segment[0] === '{' && segment[segment.length - 1] === '}') {
24
            segment = 'by' + segment[1].toUpperCase() + segment.substring(2, segment.length - 1)
25
        }
26
        result.push(segment)
27
    })
28
    let result = _.camelCase(segments.join('-'))
29
    return m.toLowerCase() + result[0].toUpperCase() + result.substring(1)
30
}
31
32
let getViewForSwagger2 = function (opts) {
33
    let swagger = opts.swagger
34
    let authorizedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'COPY', 'HEAD', 'OPTIONS', 'LINK', 'UNLIK', 'PURGE', 'LOCK', 'UNLOCK', 'PROPFIND']
35
    let data = {
36
        description: swagger.info.description,
37
        isSecure: swagger.securityDefinitions !== undefined,
38
        moduleName: opts.moduleName,
39
        className: opts.className,
40
        imports: opts.imports,
41
        domain: (swagger.schemes && swagger.schemes.length > 0 && swagger.host && swagger.basePath) ? swagger.schemes[0] + '://' + swagger.host + swagger.basePath.replace(/\/+$/g, '') : '',
42
        methods: [],
43
        definitions: []
44
    }
45
46
    _.forEach(swagger.paths, function (api, path) {
47
        let globalParams = []
48
        /**
49
         * @param {Object} op - meta data for the request
50
         * @param {string} m - HTTP method name - eg: 'get', 'post', 'put', 'delete'
51
         */
52
        _.forEach(api, function (op, m) {
53
            if (m.toLowerCase() === 'parameters') {
54
                globalParams = op
55
            }
56
        })
57
        _.forEach(api, function (op, m) {
58
            if (authorizedMethods.indexOf(m.toUpperCase()) === -1) {
59
                return
60
            }
61
            let method = {
62
                path: path,
63
                className: opts.className,
64
                methodName: op.operationId ? normalizeName(op.operationId) : getPathToMethodName(opts, m, path),
65
                method: m.toUpperCase(),
66
                isGET: m.toUpperCase() === 'GET',
67
                isPOST: m.toUpperCase() === 'POST',
68
                summary: op.description || op.summary,
69
                tags: op.tags,
70
                externalDocs: op.externalDocs,
71
                isSecure: swagger.security !== undefined || op.security !== undefined,
72
                parameters: [],
73
                headers: []
74
            }
75
76
            if (op.produces) {
77
                let headers = []
78
                headers.value = []
79
80
                headers.name = 'Accept'
81
                headers.value.push(op.produces.map(function (value) { return '\'' + value + '\'' }).join(', '))
82
83
                method.headers.push(headers)
84
            }
85
86
            let consumes = op.consumes || swagger.consumes
87
            if (consumes) {
88
                method.headers.push({ name: 'Content-Type', value: '\'' + consumes + '\'' })
89
            }
90
91
            let params = []
92
            if (_.isArray(op.parameters)) {
93
                params = op.parameters
94
            }
95
            params = params.concat(globalParams)
96
            _.forEach(params, function (parameter) {
97
                // Ignore parameters which contain the x-exclude-from-bindings extension
98
                if (parameter['x-exclude-from-bindings'] === true) {
99
                    return
100
                }
101
102
                // Ignore headers which are injected by proxies & app servers
103
                // eg: https://cloud.google.com/appengine/docs/go/requests#Go_Request_headers
104
                if (parameter['x-proxy-header'] && !data.isNode) {
105
                    return
106
                }
107
                if (_.isString(parameter.$ref)) {
108
                    let segments = parameter.$ref.split('/')
109
                    parameter = swagger.parameters[segments.length === 1 ? segments[0] : segments[2]]
110
                }
111
                parameter.camelCaseName = _.camelCase(parameter.name)
112
                if (parameter.enum && parameter.enum.length === 1) {
113
                    parameter.isSingleton = true
114
                    parameter.singleton = parameter.enum[0]
115
                }
116
                if (parameter.in === 'body') {
117
                    parameter.isBodyParameter = true
118
                } else if (parameter.in === 'path') {
119
                    parameter.isPathParameter = true
120
                } else if (parameter.in === 'query') {
121
                    if (parameter['x-name-pattern']) {
122
                        parameter.isPatternType = true
123
                        parameter.pattern = parameter['x-name-pattern']
124
                    }
125
                    parameter.isQueryParameter = true
126
                } else if (parameter.in === 'header') {
127
                    parameter.isHeaderParameter = true
128
                } else if (parameter.in === 'formData') {
129
                    parameter.isFormParameter = true
130
                }
131
                parameter.cardinality = parameter.required ? '' : '?'
132
                method.parameters.push(parameter)
133
            })
134
            data.methods.push(method)
135
        })
136
    })
137
138
    _.forEach(swagger.definitions, function (definition, name) {
139
        data.definitions.push({
140
            name: name
141
        })
142
    })
143
144
    return data
145
}
146
147
let getViewForSwagger1 = function (opts) {
148
    let swagger = opts.swagger
149
    let data = {
150
        description: swagger.description,
151
        moduleName: opts.moduleName,
152
        className: opts.className,
153
        domain: swagger.basePath ? swagger.basePath : '',
154
        methods: []
155
    }
156
    swagger.apis.forEach(function (api) {
157
        api.operations.forEach(function (op) {
158
            let method = {
159
                path: api.path,
160
                className: opts.className,
161
                methodName: op.nickname,
162
                method: op.method,
163
                isGET: op.method === 'GET',
164
                isPOST: op.method.toUpperCase() === 'POST',
165
                summary: op.summary,
166
                parameters: op.parameters,
167
                headers: []
168
            }
169
170
            if (op.produces) {
171
                let headers = []
172
                headers.value = []
173
174
                headers.name = 'Accept'
175
                headers.value.push(op.produces.map(function (value) { return '\'' + value + '\'' }).join(', '))
176
177
                method.headers.push(headers)
178
            }
179
180
            op.parameters = op.parameters ? op.parameters : []
181
            op.parameters.forEach(function (parameter) {
182
                parameter.camelCaseName = _.camelCase(parameter.name)
183
                if (parameter.enum && parameter.enum.length === 1) {
184
                    parameter.isSingleton = true
185
                    parameter.singleton = parameter.enum[0]
186
                }
187
                if (parameter.paramType === 'body') {
188
                    parameter.isBodyParameter = true
189
                } else if (parameter.paramType === 'path') {
190
                    parameter.isPathParameter = true
191
                } else if (parameter.paramType === 'query') {
192
                    if (parameter['x-name-pattern']) {
193
                        parameter.isPatternType = true
194
                        parameter.pattern = parameter['x-name-pattern']
195
                    }
196
                    parameter.isQueryParameter = true
197
                } else if (parameter.paramType === 'header') {
198
                    parameter.isHeaderParameter = true
199
                } else if (parameter.paramType === 'form') {
200
                    parameter.isFormParameter = true
201
                }
202
            })
203
            data.methods.push(method)
204
        })
205
    })
206
    return data
207
}
208
209
let parse = function (opts) {
210
    let data = opts.swagger.swagger === '2.0' ? getViewForSwagger2(opts) : getViewForSwagger1(opts)
211
    return data
212
}
213
214
module.exports = parse
215