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
|
|
|
|