Skip to content

Commit 5ab1c9c

Browse files
yilinjuangwing328
authored andcommitted
Fix logic of getNullableType of csharp server and client. (#3537)
* Fix default nullable * Fix tests * Update samples * Fix template default value * Update samples * Also fix for interface * update samples
1 parent 2bbebf9 commit 5ab1c9c

451 files changed

Lines changed: 9690 additions & 3829 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ public AbstractCSharpCodegen() {
160160
"Int64",
161161
"Float",
162162
"Guid?",
163+
"Guid",
163164
"System.IO.Stream", // not really a primitive, we include it to avoid model import
164165
"Object")
165166
);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.swagger.v3.oas.models.media.Schema;
2323
import io.swagger.v3.parser.util.SchemaTypeUtil;
2424
import org.openapitools.codegen.*;
25+
import org.openapitools.codegen.utils.ModelUtils;
2526
import org.openapitools.codegen.utils.URLPathUtils;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
@@ -353,7 +354,7 @@ public void processOpts() {
353354
supportingFiles.add(new SupportingFile("Filters" + File.separator + "GeneratePathParamsValidationFilter.mustache",
354355
packageFolder + File.separator + "Filters", "GeneratePathParamsValidationFilter.cs"));
355356
}
356-
357+
357358
supportingFiles.add(new SupportingFile("Authentication" + File.separator + "ApiAuthentication.mustache",packageFolder + File.separator + "Authentication", "ApiAuthentication.cs"));
358359
}
359360

@@ -407,12 +408,12 @@ public String toRegularExpression(String pattern) {
407408

408409
@Override
409410
public String getNullableType(Schema p, String type) {
410-
boolean isNullableExpected = p.getNullable() == null || (p.getNullable() != null && p.getNullable());
411-
412-
if (isNullableExpected && languageSpecificPrimitives.contains(type + "?")) {
413-
return type + "?";
414-
} else if (languageSpecificPrimitives.contains(type)) {
415-
return type;
411+
if (languageSpecificPrimitives.contains(type)) {
412+
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
413+
return type + "?";
414+
} else {
415+
return type;
416+
}
416417
} else {
417418
return null;
418419
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -879,15 +879,15 @@ public String toInstantiationType(Schema schema) {
879879
return null;
880880
}
881881
}
882-
882+
883883
@Override
884884
public String getNullableType(Schema p, String type) {
885-
boolean isNullableExpected = p.getNullable() == null || (p.getNullable() != null && p.getNullable());
886-
887-
if (isNullableExpected && languageSpecificPrimitives.contains(type + "?")) {
888-
return type + "?";
889-
} else if (languageSpecificPrimitives.contains(type)) {
890-
return type;
885+
if (languageSpecificPrimitives.contains(type)) {
886+
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
887+
return type + "?";
888+
} else {
889+
return type;
890+
}
891891
} else {
892892
return null;
893893
}

modules/openapi-generator/src/main/resources/csharp/api.mustache

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace {{packageName}}.{{apiPackage}}
3232
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
3333
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
3434
{{/allParams}}/// <returns>{{#returnType}}{{returnType}}{{/returnType}}</returns>
35-
{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
35+
{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
3636

3737
/// <summary>
3838
/// {{summary}}
@@ -43,7 +43,7 @@ namespace {{packageName}}.{{apiPackage}}
4343
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
4444
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
4545
{{/allParams}}/// <returns>ApiResponse of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Object(void){{/returnType}}</returns>
46-
ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
46+
ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
4747
{{/operation}}
4848
#endregion Synchronous Operations
4949
{{#supportsAsync}}
@@ -58,7 +58,7 @@ namespace {{packageName}}.{{apiPackage}}
5858
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
5959
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
6060
{{/allParams}}/// <returns>Task of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}</returns>
61-
{{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
61+
{{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
6262

6363
/// <summary>
6464
/// {{summary}}
@@ -69,7 +69,7 @@ namespace {{packageName}}.{{apiPackage}}
6969
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
7070
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
7171
{{/allParams}}/// <returns>Task of ApiResponse{{#returnType}} ({{returnType}}){{/returnType}}</returns>
72-
System.Threading.Tasks.Task<ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}>> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
72+
System.Threading.Tasks.Task<ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}>> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
7373
{{/operation}}
7474
#endregion Asynchronous Operations
7575
{{/supportsAsync}}
@@ -190,7 +190,7 @@ namespace {{packageName}}.{{apiPackage}}
190190
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
191191
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
192192
{{/allParams}}/// <returns>{{#returnType}}{{returnType}}{{/returnType}}</returns>
193-
public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
193+
public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
194194
{
195195
{{#returnType}}ApiResponse<{{{returnType}}}> localVarResponse = {{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
196196
return localVarResponse.Data;{{/returnType}}{{^returnType}}{{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{/returnType}}
@@ -202,7 +202,7 @@ namespace {{packageName}}.{{apiPackage}}
202202
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
203203
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
204204
{{/allParams}}/// <returns>ApiResponse of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Object(void){{/returnType}}</returns>
205-
public ApiResponse<{{#returnType}} {{{returnType}}} {{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
205+
public ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
206206
{
207207
{{#allParams}}
208208
{{#required}}
@@ -325,7 +325,7 @@ namespace {{packageName}}.{{apiPackage}}
325325
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
326326
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
327327
{{/allParams}}/// <returns>Task of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}</returns>
328-
{{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
328+
{{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
329329
{
330330
{{#returnType}}ApiResponse<{{{returnType}}}> localVarResponse = await {{operationId}}AsyncWithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
331331
return localVarResponse.Data;{{/returnType}}{{^returnType}}await {{operationId}}AsyncWithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{/returnType}}
@@ -338,7 +338,7 @@ namespace {{packageName}}.{{apiPackage}}
338338
/// <exception cref="{{packageName}}.Client.ApiException">Thrown when fails to make API call</exception>
339339
{{#allParams}}/// <param name="{{paramName}}">{{description}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
340340
{{/allParams}}/// <returns>Task of ApiResponse{{#returnType}} ({{returnType}}){{/returnType}}</returns>
341-
public async System.Threading.Tasks.Task<ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}>> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
341+
public async System.Threading.Tasks.Task<ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}>> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = default({{{dataType}}}){{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
342342
{
343343
{{#allParams}}
344344
{{#required}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ public void simpleModelTest() {
141141

142142
final CodegenProperty property1 = cm.vars.get(0);
143143
Assert.assertEquals(property1.baseName, "id");
144-
Assert.assertEquals(property1.dataType, "long?");
144+
Assert.assertEquals(property1.dataType, "long");
145145
Assert.assertEquals(property1.name, "Id");
146146
Assert.assertNull(property1.defaultValue);
147-
Assert.assertEquals(property1.baseType, "long?");
147+
Assert.assertEquals(property1.baseType, "long");
148148
Assert.assertTrue(property1.hasMore);
149149
Assert.assertTrue(property1.required);
150150
Assert.assertTrue(property1.isPrimitiveType);
@@ -161,10 +161,10 @@ public void simpleModelTest() {
161161

162162
final CodegenProperty property3 = cm.vars.get(2);
163163
Assert.assertEquals(property3.baseName, "createdAt");
164-
Assert.assertEquals(property3.dataType, "DateTime?");
164+
Assert.assertEquals(property3.dataType, "DateTime");
165165
Assert.assertEquals(property3.name, "CreatedAt");
166166
Assert.assertNull(property3.defaultValue);
167-
Assert.assertEquals(property3.baseType, "DateTime?");
167+
Assert.assertEquals(property3.baseType, "DateTime");
168168
Assert.assertFalse(property3.hasMore);
169169
Assert.assertFalse(property3.required);
170170
}
@@ -209,7 +209,59 @@ public void nonNullablePropertyTest() {
209209
Assert.assertFalse(property2.required);
210210
Assert.assertTrue(property2.isPrimitiveType);
211211
Assert.assertTrue(property2.isContainer);
212-
212+
213+
final CodegenProperty property3 = cm.vars.get(2);
214+
Assert.assertEquals(property3.baseName, "name");
215+
Assert.assertEquals(property3.dataType, "string");
216+
Assert.assertEquals(property3.name, "Name");
217+
Assert.assertNull(property3.defaultValue);
218+
Assert.assertEquals(property3.baseType, "string");
219+
Assert.assertFalse(property3.hasMore);
220+
Assert.assertFalse(property3.required);
221+
Assert.assertTrue(property3.isPrimitiveType);
222+
}
223+
224+
@Test(description = "convert a model with a nullable property")
225+
public void nullablePropertyTest() {
226+
final Schema model = new Schema()
227+
.description("a sample model")
228+
.addProperties("id", new IntegerSchema().format(SchemaTypeUtil.INTEGER64_FORMAT).nullable(true))
229+
.addProperties("urls", new ArraySchema()
230+
.items(new StringSchema()))
231+
.addProperties("name", new StringSchema().nullable(true))
232+
.addRequiredItem("id");
233+
final DefaultCodegen codegen = new CSharpClientCodegen();
234+
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
235+
codegen.setOpenAPI(openAPI);
236+
final CodegenModel cm = codegen.fromModel("sample", model);
237+
238+
Assert.assertEquals(cm.name, "sample");
239+
Assert.assertEquals(cm.classname, "Sample");
240+
Assert.assertEquals(cm.description, "a sample model");
241+
Assert.assertEquals(cm.vars.size(), 3);
242+
243+
final CodegenProperty property1 = cm.vars.get(0);
244+
Assert.assertEquals(property1.baseName, "id");
245+
Assert.assertEquals(property1.dataType, "long?");
246+
Assert.assertEquals(property1.name, "Id");
247+
Assert.assertNull(property1.defaultValue);
248+
Assert.assertEquals(property1.baseType, "long?");
249+
Assert.assertTrue(property1.hasMore);
250+
Assert.assertTrue(property1.required);
251+
Assert.assertTrue(property1.isPrimitiveType);
252+
253+
final CodegenProperty property2 = cm.vars.get(1);
254+
Assert.assertEquals(property2.baseName, "urls");
255+
Assert.assertEquals(property2.dataType, "List<string>");
256+
Assert.assertEquals(property2.name, "Urls");
257+
Assert.assertNull(property2.defaultValue);
258+
Assert.assertEquals(property2.baseType, "List");
259+
Assert.assertTrue(property2.hasMore);
260+
Assert.assertEquals(property2.containerType, "array");
261+
Assert.assertFalse(property2.required);
262+
Assert.assertTrue(property2.isPrimitiveType);
263+
Assert.assertTrue(property2.isContainer);
264+
213265
final CodegenProperty property3 = cm.vars.get(2);
214266
Assert.assertEquals(property3.baseName, "name");
215267
Assert.assertEquals(property3.dataType, "string");
@@ -241,10 +293,10 @@ public void listPropertyTest() {
241293

242294
final CodegenProperty property1 = cm.vars.get(0);
243295
Assert.assertEquals(property1.baseName, "id");
244-
Assert.assertEquals(property1.dataType, "long?");
296+
Assert.assertEquals(property1.dataType, "long");
245297
Assert.assertEquals(property1.name, "Id");
246298
Assert.assertNull(property1.defaultValue);
247-
Assert.assertEquals(property1.baseType, "long?");
299+
Assert.assertEquals(property1.baseType, "long");
248300
Assert.assertTrue(property1.hasMore);
249301
Assert.assertTrue(property1.required);
250302
Assert.assertTrue(property1.isPrimitiveType);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.0.0-SNAPSHOT
1+
4.1.0-SNAPSHOT

samples/client/petstore/csharp-dotnet2/OpenAPIClientTest/Lib/OpenAPIClient/docs/UserApi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ namespace Example
117117

118118
Name | Type | Description | Notes
119119
------------- | ------------- | ------------- | -------------
120-
**body** | [**List<User>**](List.md)| List of user object |
120+
**body** | [**List<User>**](User.md)| List of user object |
121121

122122
### Return type
123123

@@ -176,7 +176,7 @@ namespace Example
176176

177177
Name | Type | Description | Notes
178178
------------- | ------------- | ------------- | -------------
179-
**body** | [**List<User>**](List.md)| List of user object |
179+
**body** | [**List<User>**](User.md)| List of user object |
180180

181181
### Return type
182182

samples/client/petstore/csharp-netcore/OpenAPIClient/docs/FormatTest.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Name | Type | Description | Notes
1414
**Binary** | **System.IO.Stream** | | [optional]
1515
**Date** | **DateTime** | |
1616
**DateTime** | **DateTime** | | [optional]
17-
**Uuid** | [**Guid**](Guid.md) | | [optional]
17+
**Uuid** | **Guid** | | [optional]
1818
**Password** | **string** | |
1919

2020
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

samples/client/petstore/csharp-netcore/OpenAPIClient/docs/MixedPropertiesAndAdditionalPropertiesClass.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
Name | Type | Description | Notes
55
------------ | ------------- | ------------- | -------------
6-
**Uuid** | [**Guid**](Guid.md) | | [optional]
6+
**Uuid** | **Guid** | | [optional]
77
**DateTime** | **DateTime** | | [optional]
88
**Map** | [**Dictionary&lt;string, Animal&gt;**](Animal.md) | | [optional]
99

samples/client/petstore/csharp-netcore/OpenAPIClientCore/docs/FormatTest.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Name | Type | Description | Notes
1414
**Binary** | **System.IO.Stream** | | [optional]
1515
**Date** | **DateTime** | |
1616
**DateTime** | **DateTime** | | [optional]
17-
**Uuid** | [**Guid**](Guid.md) | | [optional]
17+
**Uuid** | **Guid** | | [optional]
1818
**Password** | **string** | |
1919

2020
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0 commit comments

Comments
 (0)