Skip to content

Commit 917ad11

Browse files
committed
added support for body entities
1 parent a3ff80e commit 917ad11

File tree

5 files changed

+278
-13
lines changed

5 files changed

+278
-13
lines changed

src/main/java/io/swagger/codegen/v3/generators/scala/AkkaHttpServerCodegen.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,37 @@ public AkkaHttpServerCodegen() {
5858

5959
}
6060

61+
@Override
62+
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
63+
return setComplexTypes(objs);
64+
}
65+
66+
public static Map<String, Object> setComplexTypes(Map<String, Object> objs) {
67+
Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
68+
List<CodegenOperation> operationList = (List<CodegenOperation>) operations.get("operation");
69+
Boolean hasComplexTypes = Boolean.FALSE;
70+
Set<String> complexRequestTypes = new HashSet<>();
71+
for (CodegenOperation op : operationList) {
72+
for(CodegenParameter parameter : op.allParams) {
73+
if(!parameter.getIsPrimitiveType()){
74+
if(parameter.getIsBodyParam()){
75+
hasComplexTypes = Boolean.TRUE;
76+
complexRequestTypes.add(parameter.dataType);
77+
}
78+
}
79+
}
80+
for(CodegenResponse response : op.responses) {
81+
if(!response.getIsPrimitiveType()){
82+
hasComplexTypes = Boolean.TRUE;
83+
}
84+
}
85+
}
86+
objs.put("hasComplexTypes", hasComplexTypes);
87+
objs.put("complexRequestTypes", complexRequestTypes);
88+
89+
return objs;
90+
}
91+
6192
@Override
6293
public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, Map<String, Schema> schemas, OpenAPI openAPI){
6394
CodegenOperation codegenOperation = super.fromOperation(path, httpMethod, operation, schemas, openAPI);
@@ -157,6 +188,7 @@ private static LinkedList<TextOrMatcher> replacePathsWithMatchers(LinkedList<Str
157188
));
158189
}};
159190

191+
160192
protected static String QUERY_PARAMS_WITH_SUPPORTED_TYPE = "queryParamsWithSupportedType";
161193

162194
/**

src/main/resources/v2/scala/akka-http-server/api.mustache

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,31 @@ package {{package}}
22

33
import akka.http.scaladsl.server.Directives._
44
import akka.http.scaladsl.server.Route
5+
{{^operations.complexRequestTypes.isEmpty}}import akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller
6+
{{/operations.complexRequestTypes.isEmpty}}
57
import {{invokerPackage}}.AkkaHttpHelper._
68
{{#imports}}import {{import}}
79
{{/imports}}
810

911
{{#operations}}
1012
class {{classname}}(
11-
{{classVarName}}Service: {{classname}}Service
13+
{{classVarName}}Service: {{classname}}Service{{#hasComplexTypes}},
14+
{{classVarName}}Marshaller: {{classname}}Marshaller{{/hasComplexTypes}}
1215
) {
13-
lazy val route: Route =
16+
{{#hasComplexTypes}}import {{classVarName}}Marshaller._
17+
{{/hasComplexTypes}}
1418

19+
lazy val route: Route =
1520
{{#operation}}
1621
path({{#vendorExtensions.paths}}{{#isText}}"{{/isText}}{{value}}{{#isText}}"{{/isText}}{{#hasMore}} / {{/hasMore}}{{/vendorExtensions.paths}}) { {{^pathParams.isEmpty}}({{#pathParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/pathParams}}) => {{/pathParams.isEmpty}}
1722
{{vendorExtensions.lowercaseHttpMethod}} {
1823
{{^queryParams.isEmpty}}parameters({{#vendorExtensions.queryParamsWithSupportedType}}"{{paramName}}".as[{{dataType}}]{{^required}}.?{{/required}}{{#hasMore}}, {{/hasMore}}{{/vendorExtensions.queryParamsWithSupportedType}}) { ({{#queryParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/queryParams}}) =>{{/queryParams.isEmpty}}
1924
{{#headerParams}}{{#required}}headerValueByName{{/required}}{{^required}}optionalHeaderValueByName{{/required}}("{{paramName}}") { {{paramName}} => {{/headerParams}}
2025
{{^formParams.isEmpty}}formFields({{#formParams}}"{{paramName}}".as[{{#isPrimitiveType}}{{dataType}}{{/isPrimitiveType}}{{^isPrimitiveType}}String{{/isPrimitiveType}}]{{^required}}.?{{/required}}{{#hasMore}}, {{/hasMore}}{{/formParams}}) { ({{#formParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/formParams}}) =>{{/formParams.isEmpty}}
21-
{{classVarName}}Service.{{operationId}}({{#allParams}}{{paramName}} = {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
22-
{{^formParams.isEmpty}} }{{/formParams.isEmpty}}
26+
{{^bodyParam.isPrimitiveType}}entity(as[{{bodyParam.dataType}}]){ body =>{{/bodyParam.isPrimitiveType}}
27+
{{classVarName}}Service.{{operationId}}({{#allParams}}{{paramName}} = {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
28+
{{^bodyParam.isPrimitiveType}} }{{/bodyParam.isPrimitiveType}}
29+
{{^formParams.isEmpty}} }{{/formParams.isEmpty}}
2330
{{#headerParams}} }{{/headerParams}}
2431
{{^queryParams.isEmpty}} }{{/queryParams.isEmpty}}
2532
}
@@ -29,7 +36,6 @@ class {{classname}}(
2936

3037
trait {{classname}}Service {
3138
32-
3339
{{#operation}}
3440
/**
3541
{{#responses}} * {{#code}}Code: {{.}},{{/code}} {{#message}}Message: {{.}},{{/message}} {{#dataType}}DataType: {{.}}{{/dataType}}
@@ -38,6 +44,13 @@ trait {{classname}}Service {
3844
def {{operationId}}({{#vendorExtensions.paramsWithSupportedType}}{{paramName}}: {{^required}}Option[{{/required}}{{dataType}}{{^required}}]{{/required}}{{#hasMore}}, {{/hasMore}}{{/vendorExtensions.paramsWithSupportedType}}): Route
3945

4046
{{/operation}}
41-
4247
}
48+
49+
{{#hasComplexTypes}}
50+
trait {{classname}}Marshaller {
51+
52+
{{#complexRequestTypes}}implicit def fromRequestUnmarshaller{{.}}: FromRequestUnmarshaller[{{.}}]
53+
{{/complexRequestTypes}}
54+
}{{/hasComplexTypes}}
55+
4356
{{/operations}}

src/main/resources/v2/scala/akka-http-server/build.sbt.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ organization := "{{groupId}}"
44
scalaVersion := "2.12.6"
55

66
libraryDependencies ++= Seq(
7-
"com.typesafe.akka" %% "akka-http" % "10.1.5",
8-
"com.typesafe.akka" %% "akka-stream" % "2.5.16",
7+
"com.typesafe.akka" %% "akka-http" % "10.1.5",
8+
"com.typesafe.akka" %% "akka-stream" % "2.5.16",
99
)

src/test/java/io/swagger/codegen/v3/generators/scala/AkkaHttpServerCodegenTest.java

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,76 @@
11
package io.swagger.codegen.v3.generators.scala;
22

3-
import io.swagger.codegen.v3.CodegenModelFactory;
4-
import io.swagger.codegen.v3.CodegenModelType;
5-
import io.swagger.codegen.v3.CodegenOperation;
6-
import io.swagger.codegen.v3.CodegenParameter;
3+
import io.swagger.codegen.v3.*;
74
import org.testng.Assert;
85
import org.testng.annotations.Test;
96

10-
import java.util.LinkedList;
7+
import java.util.*;
118

129
public class AkkaHttpServerCodegenTest {
1310

11+
@Test
12+
public void testSetComplexTypes() {
13+
CodegenOperation codegenOperation1 = CodegenModelFactory.newInstance(CodegenModelType.OPERATION);
14+
CodegenOperation codegenOperation2 = CodegenModelFactory.newInstance(CodegenModelType.OPERATION);
15+
CodegenOperation codegenOperation3 = CodegenModelFactory.newInstance(CodegenModelType.OPERATION);
16+
CodegenOperation codegenOperation4 = CodegenModelFactory.newInstance(CodegenModelType.OPERATION);
17+
18+
CodegenParameter param1 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
19+
CodegenParameter param2 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
20+
CodegenParameter param3 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
21+
CodegenParameter param4 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
22+
CodegenParameter param5 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
23+
24+
param1.dataType = "Pet";
25+
param1.getVendorExtensions().put(CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME, Boolean.FALSE);
26+
param1.getVendorExtensions().put(CodegenConstants.IS_BODY_PARAM_EXT_NAME, Boolean.TRUE);
27+
param2.dataType = "Pet";
28+
param2.getVendorExtensions().put(CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME, Boolean.FALSE);
29+
param2.getVendorExtensions().put(CodegenConstants.IS_BODY_PARAM_EXT_NAME, Boolean.TRUE);
30+
param3.dataType = "User";
31+
param3.getVendorExtensions().put(CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME, Boolean.FALSE);
32+
param3.getVendorExtensions().put(CodegenConstants.IS_BODY_PARAM_EXT_NAME, Boolean.TRUE);
33+
param4.dataType = "String";
34+
param4.getVendorExtensions().put(CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME, Boolean.TRUE);
35+
param4.getVendorExtensions().put(CodegenConstants.IS_BODY_PARAM_EXT_NAME, Boolean.TRUE);
36+
param5.dataType = "Order";
37+
param5.getVendorExtensions().put(CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME, Boolean.FALSE);
38+
param5.getVendorExtensions().put(CodegenConstants.IS_QUERY_PARAM_EXT_NAME, Boolean.TRUE);
39+
40+
codegenOperation1.bodyParam = param1;
41+
codegenOperation1.bodyParams.add(param1);
42+
codegenOperation1.allParams.add(param1);
43+
codegenOperation2.bodyParam = param2;
44+
codegenOperation2.bodyParams.add(param2);
45+
codegenOperation2.allParams.add(param2);
46+
codegenOperation3.bodyParam = param3;
47+
codegenOperation3.bodyParams.add(param3);
48+
codegenOperation3.allParams.add(param3);
49+
codegenOperation4.bodyParam = param4;
50+
codegenOperation4.bodyParams.add(param4);
51+
codegenOperation4.allParams.add(param4);
52+
codegenOperation4.queryParams.add(param5);
53+
codegenOperation4.allParams.add(param5);
54+
55+
List<CodegenOperation> operationList = new LinkedList<CodegenOperation>(){{
56+
addAll(Arrays.asList(
57+
codegenOperation1,
58+
codegenOperation2,
59+
codegenOperation3,
60+
codegenOperation4
61+
));
62+
}};
63+
Map<String, Object> operation = new HashMap<>();
64+
operation.put("operation", operationList);
65+
Map<String, Object> operations = new HashMap<>();
66+
operations.put("operations", operation);
67+
68+
Map<String, Object> result = AkkaHttpServerCodegen.setComplexTypes(operations);
69+
70+
Assert.assertEquals(result.get("hasComplexTypes"), Boolean.TRUE);
71+
Assert.assertEquals(result.get("complexRequestTypes"), new HashSet<String>(){{addAll(Arrays.asList("Pet","User"));}});
72+
}
73+
1474
@Test
1575
public void testAddLowercaseHttpMethod() {
1676
CodegenOperation codegenOperation = CodegenModelFactory.newInstance(CodegenModelType.OPERATION);
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
{
2+
"openapi": "3.0.0",
3+
"info": {
4+
"title": "path parameters",
5+
"version": "1.0"
6+
},
7+
"paths": {
8+
"/pet": {
9+
"post": {
10+
"tags": [
11+
"pet"
12+
],
13+
"summary": "Add a new pet to the store",
14+
"operationId": "addPet",
15+
"responses": {
16+
"405": {
17+
"description": "Invalid input"
18+
}
19+
},
20+
"security": [
21+
{
22+
"petstore_auth": [
23+
"write:pets",
24+
"read:pets"
25+
]
26+
}
27+
],
28+
"requestBody": {
29+
"$ref": "#/components/requestBodies/Pet"
30+
}
31+
},
32+
"put": {
33+
"tags": [
34+
"pet"
35+
],
36+
"summary": "Update an existing pet",
37+
"operationId": "updatePet",
38+
"responses": {
39+
"400": {
40+
"description": "Invalid ID supplied"
41+
},
42+
"404": {
43+
"description": "Pet not found"
44+
},
45+
"405": {
46+
"description": "Validation exception"
47+
}
48+
},
49+
"requestBody": {
50+
"$ref": "#/components/requestBodies/Pet"
51+
}
52+
}
53+
}
54+
},
55+
"components": {
56+
"schemas": {
57+
"Category": {
58+
"type": "object",
59+
"properties": {
60+
"id": {
61+
"type": "integer",
62+
"format": "int64"
63+
},
64+
"name": {
65+
"type": "string"
66+
}
67+
},
68+
"xml": {
69+
"name": "Category"
70+
}
71+
},
72+
"Tag": {
73+
"type": "object",
74+
"properties": {
75+
"id": {
76+
"type": "integer",
77+
"format": "int64"
78+
},
79+
"name": {
80+
"type": "string"
81+
}
82+
},
83+
"xml": {
84+
"name": "Tag"
85+
}
86+
},
87+
"Pet": {
88+
"type": "object",
89+
"required": [
90+
"name",
91+
"photoUrls"
92+
],
93+
"properties": {
94+
"id": {
95+
"type": "integer",
96+
"format": "int64"
97+
},
98+
"category": {
99+
"$ref": "#/components/schemas/Category"
100+
},
101+
"name": {
102+
"type": "string",
103+
"example": "doggie"
104+
},
105+
"photoUrls": {
106+
"type": "array",
107+
"xml": {
108+
"name": "photoUrl",
109+
"wrapped": true
110+
},
111+
"items": {
112+
"type": "string"
113+
}
114+
},
115+
"tags": {
116+
"type": "array",
117+
"xml": {
118+
"name": "tag",
119+
"wrapped": true
120+
},
121+
"items": {
122+
"$ref": "#/components/schemas/Tag"
123+
}
124+
},
125+
"status": {
126+
"type": "string",
127+
"description": "pet status in the store",
128+
"enum": [
129+
"available",
130+
"pending",
131+
"sold"
132+
]
133+
}
134+
},
135+
"xml": {
136+
"name": "Pet"
137+
}
138+
}
139+
},
140+
"requestBodies": {
141+
"Pet": {
142+
"content": {
143+
"application/json": {
144+
"schema": {
145+
"$ref": "#/components/schemas/Pet"
146+
}
147+
},
148+
"application/xml": {
149+
"schema": {
150+
"$ref": "#/components/schemas/Pet"
151+
}
152+
}
153+
},
154+
"description": "Pet object that needs to be added to the store",
155+
"required": true
156+
}
157+
}
158+
}
159+
160+
}

0 commit comments

Comments
 (0)