Skip to content

Commit 117dbb5

Browse files
authored
Merge pull request #595 from swagger-api/nodejs_generator_update
updated oas3-module on nodejs templates.
2 parents 52518eb + 2d60b05 commit 117dbb5

File tree

6 files changed

+126
-26
lines changed

6 files changed

+126
-26
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2871,7 +2871,7 @@ private void addHeaders(ApiResponse response, List<CodegenProperty> target, Map<
28712871
}
28722872
}
28732873

2874-
private static List<CodegenParameter> addHasMore(List<CodegenParameter> objs) {
2874+
protected static List<CodegenParameter> addHasMore(List<CodegenParameter> objs) {
28752875
if (objs != null) {
28762876
for (int i = 0; i < objs.size(); i++) {
28772877
objs.get(i).secondaryParam = i > 0;
@@ -3308,7 +3308,7 @@ public static String camelize(String word, boolean lowercaseFirstLetter) {
33083308

33093309
public String apiFilename(String templateName, String tag) {
33103310
String suffix = apiTemplateFiles().get(templateName);
3311-
return apiFileFolder() + '/' + toApiFilename(tag) + suffix;
3311+
return apiFileFolder() + File.separator + toApiFilename(tag) + suffix;
33123312
}
33133313

33143314
/**
@@ -4198,6 +4198,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
41984198
addParemeters(content, codegenOperation.headerParams);
41994199
addParemeters(content, codegenOperation.queryParams);
42004200
addParemeters(content, codegenOperation.pathParams);
4201+
addParemeters(content, codegenOperation.cookieParams);
42014202
}
42024203
for (CodegenContent content : codegenContents) {
42034204
Collections.sort(content.getParameters(), (CodegenParameter one, CodegenParameter another) -> {
@@ -4216,7 +4217,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
42164217
codegenOperation.getContents().addAll(codegenContents);
42174218
}
42184219

4219-
private void addParemeters(CodegenContent codegenContent, List<CodegenParameter> codegenParameters) {
4220+
protected void addParemeters(CodegenContent codegenContent, List<CodegenParameter> codegenParameters) {
42204221
if (codegenParameters == null || codegenParameters.isEmpty()) {
42214222
return;
42224223
}

src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.codegen.v3.generators.nodejs;
22

3+
import io.swagger.codegen.v3.*;
34
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
45
import com.fasterxml.jackson.core.JsonGenerator;
56
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -9,36 +10,23 @@
910
import com.google.common.collect.ArrayListMultimap;
1011
import com.google.common.collect.Lists;
1112
import com.google.common.collect.Multimap;
12-
import io.swagger.codegen.v3.CliOption;
13-
import io.swagger.codegen.v3.CodegenConstants;
14-
import io.swagger.codegen.v3.CodegenOperation;
15-
import io.swagger.codegen.v3.CodegenParameter;
16-
import io.swagger.codegen.v3.CodegenResponse;
17-
import io.swagger.codegen.v3.CodegenType;
18-
import io.swagger.codegen.v3.SupportingFile;
1913
import io.swagger.codegen.v3.utils.URLPathUtil;
2014
import io.swagger.v3.oas.models.OpenAPI;
2115
import io.swagger.v3.oas.models.Operation;
2216
import io.swagger.v3.oas.models.PathItem;
2317
import io.swagger.v3.oas.models.Paths;
2418
import io.swagger.v3.oas.models.info.Info;
2519
import io.swagger.v3.core.util.Yaml;
20+
import org.apache.commons.lang3.StringUtils;
2621
import org.slf4j.Logger;
2722
import org.slf4j.LoggerFactory;
2823

2924
import java.io.File;
3025
import java.io.IOException;
3126
import java.math.BigDecimal;
3227
import java.net.URL;
33-
import java.util.ArrayList;
34-
import java.util.Arrays;
35-
import java.util.Collection;
36-
import java.util.HashMap;
37-
import java.util.Iterator;
38-
import java.util.List;
39-
import java.util.Map;
28+
import java.util.*;
4029
import java.util.Map.Entry;
41-
import java.util.regex.Pattern;
4230

4331
public class NodeJSServerCodegen extends DefaultCodegenConfig {
4432
private static final Logger LOGGER = LoggerFactory.getLogger(NodeJSServerCodegen.class);
@@ -171,7 +159,7 @@ public String apiFilename(String templateName, String tag) {
171159
if ( templateName.equals("service.mustache") ) {
172160
String stringToMatch = File.separator + "controllers" + File.separator;
173161
String replacement = File.separator + implFolder + File.separator;
174-
result = result.replaceAll(Pattern.quote(stringToMatch), replacement);
162+
result = StringUtils.replace(result, stringToMatch, replacement);
175163
}
176164
return result;
177165
}
@@ -320,7 +308,7 @@ public void processOpts() {
320308
// "controllers",
321309
// "controller.js")
322310
// );
323-
supportingFiles.add(new SupportingFile("swagger.mustache", "api", "swagger.yaml"));
311+
supportingFiles.add(new SupportingFile("swagger.mustache", "api", "openapi.yaml"));
324312
if (getGoogleCloudFunctions()) {
325313
writeOptional(outputFolder, new SupportingFile("index-gcf.mustache", "", "index.js"));
326314
} else {
@@ -450,5 +438,26 @@ public String escapeQuotationMark(String input) {
450438
// remove " to avoid code injection
451439
return input.replace("\"", "");
452440
}
441+
442+
protected void configuresParameterForMediaType(CodegenOperation codegenOperation, List<CodegenContent> codegenContents) {
443+
if (codegenContents.isEmpty()) {
444+
CodegenContent content = new CodegenContent();
445+
content.getParameters().addAll(codegenOperation.allParams);
446+
codegenContents.add(content);
447+
448+
codegenOperation.getContents().add(content);
449+
return;
450+
}
451+
for (CodegenContent content : codegenContents) {
452+
addParemeters(content, codegenOperation.queryParams);
453+
addParemeters(content, codegenOperation.pathParams);
454+
addParemeters(content, codegenOperation.headerParams);
455+
addParemeters(content, codegenOperation.cookieParams);
456+
}
457+
for (CodegenContent content : codegenContents) {
458+
addHasMore(content.getParameters());
459+
}
460+
codegenOperation.getContents().addAll(codegenContents);
461+
}
453462
}
454463

src/main/resources/handlebars/nodejs/controller.mustache

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@ var {{classname}} = require('../{{implFolder}}/{{classname}}Service');
66
{{#operation}}
77
{{#contents}}
88

9-
module.exports.{{nickname}} = function {{nickname}} (req, res, next) {
10-
{{#parameters}}
11-
var {{paramName}} = req.swagger.params['{{baseName}}'].value;
12-
{{/parameters}}
13-
{{classname}}.{{nickname}}({{#parameters}}{{paramName}}{{#hasMore}},{{/hasMore}}{{/parameters}})
9+
module.exports.{{nickname}} = function {{nickname}} (req, res, next{{#parameters}}{{#@first}}, {{/@first}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) {
10+
{{classname}}.{{nickname}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}})
1411
.then(function (response) {
1512
utils.writeJson(res, response);
1613
})

src/main/resources/handlebars/nodejs/package.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
"connect": "^3.2.0",
2020
{{/googleCloudFunctions}}
2121
"js-yaml": "^3.3.0",
22-
"oas3-tools": "^2.0.0"
22+
"oas3-tools": "^2.0.2"
2323
}
2424
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.swagger.codegen.v3.generators.nodejs;
2+
3+
import io.swagger.codegen.v3.ClientOptInput;
4+
import io.swagger.codegen.v3.DefaultGenerator;
5+
import io.swagger.codegen.v3.config.CodegenConfigurator;
6+
import io.swagger.codegen.v3.generators.AbstractCodegenTest;
7+
import org.apache.commons.io.FileUtils;
8+
import org.junit.rules.TemporaryFolder;
9+
import org.testng.Assert;
10+
import org.testng.annotations.Test;
11+
12+
import java.io.File;
13+
14+
public class NodeJSServerCodegenTest extends AbstractCodegenTest {
15+
16+
private TemporaryFolder folder = new TemporaryFolder();
17+
18+
@Test(description = "verify that parameters are listed in following order: body, query, path, header, cookie")
19+
public void testParameterOrders() throws Exception {
20+
this.folder.create();
21+
final File output = this.folder.getRoot();
22+
23+
final CodegenConfigurator configurator = new CodegenConfigurator()
24+
.setLang("nodejs-server")
25+
.setInputSpecURL("src/test/resources/3_0_0/petstore.yaml")
26+
.setOutputDir(output.getAbsolutePath());
27+
28+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
29+
new DefaultGenerator().opts(clientOptInput).generate();
30+
31+
final File petControllerFile = new File(output, "controllers/Pet.js");
32+
final String content = FileUtils.readFileToString(petControllerFile);
33+
34+
Assert.assertTrue(content.contains("module.exports.feedPet = function feedPet (req, res, next, body, petType, status, petId, token, sessionId)"));
35+
36+
this.folder.delete();
37+
}
38+
39+
}

src/test/resources/3_0_0/petstore.yaml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,60 @@ paths:
233233
- petstore_auth:
234234
- 'write:pets'
235235
- 'read:pets'
236+
237+
/pet/feed/{petId}:
238+
post:
239+
tags:
240+
- pet
241+
summary: Find pet by ID
242+
description: schedule pet feeding
243+
operationId: feedPet
244+
parameters:
245+
- name: petId
246+
in: path
247+
description: ID of pet to return
248+
required: true
249+
schema:
250+
type: integer
251+
format: int64
252+
- name: petType
253+
in: query
254+
description: type of food
255+
required: true
256+
schema:
257+
type: string
258+
- name: status
259+
in: query
260+
description: status
261+
required: true
262+
schema:
263+
type: string
264+
- name: sessionId
265+
in: cookie
266+
description: session id
267+
required: true
268+
schema:
269+
type: string
270+
- name: token
271+
in: header
272+
description: status
273+
required: true
274+
schema:
275+
type: string
276+
requestBody:
277+
description: Pet object that needs to be added to the store
278+
content:
279+
application/json:
280+
schema:
281+
$ref: '#/components/schemas/Pet'
282+
application/xml:
283+
schema:
284+
$ref: '#/components/schemas/Pet'
285+
required: true
286+
responses:
287+
200:
288+
description: successful operation
289+
236290
'/pet/{petId}/uploadImage':
237291
post:
238292
tags:

0 commit comments

Comments
 (0)