Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ type {{classname}} struct {
func Assert{{classname}}Required(obj {{classname}}) error {
{{#hasRequired}}
elements := map[string]interface{}{
{{#requiredVars}} "{{baseName}}": obj.{{name}},
{{/requiredVars}} }
{{#requiredVars}}{{^isReadOnly}} "{{baseName}}": obj.{{name}},
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
{{/isReadOnly}}{{/requiredVars}} }
for name, el := range elements {
if isZero := IsZeroValue(el); isZero {
return &RequiredError{Field: name}
Expand All @@ -100,6 +100,7 @@ func Assert{{classname}}Required(obj {{classname}}) error {
{{/isMap}}
{{/parent}}
{{#Vars}}
{{^isReadOnly}}
{{#isNullable}}
{{#isModel}}
if obj.{{name}} != nil {
Expand Down Expand Up @@ -157,13 +158,15 @@ func Assert{{classname}}Required(obj {{classname}}) error {
{{/items.isModel}}
{{/isArray}}
{{/isNullable}}
{{/isReadOnly}}
{{/Vars}}
return nil
}

// Assert{{classname}}Constraints checks if the values respects the defined constraints
func Assert{{classname}}Constraints(obj {{classname}}) error {
{{#Vars}}
{{^isReadOnly}}
{{#minimum}}
if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} < {{minimum}} {
return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMinValueConstraint)}
Expand Down Expand Up @@ -229,6 +232,7 @@ func Assert{{classname}}Constraints(obj {{classname}}) error {
{{/items.isModel}}
{{/isArray}}
{{/isNullable}}
{{/isReadOnly}}
{{/Vars}}
return nil
}{{/model}}{{/models}}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,37 @@ public void verifyOrder() throws IOException {

}

@Test
public void verifyReadOnlyRequiredFieldsNotEnforced() throws IOException {
File output = Files.createTempDirectory("test").toFile();
output.deleteOnExit();

final CodegenConfigurator configurator = createDefaultCodegenConfigurator(output)
.setInputSpec("src/test/resources/3_0/go-server/readonly-required.yaml");

DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);

// AssertThingRequired must not reference the readOnly "id" field, so a
// request body that legitimately omits it is accepted. The non-readOnly
// required "name" field must still be enforced.
java.nio.file.Path modelPath = Paths.get(output + "/go/model_thing.go");
TestUtils.assertFileExists(modelPath);
TestUtils.assertFileContains(modelPath,
"func AssertThingRequired(obj Thing) error {");
TestUtils.assertFileContains(modelPath,
"\"name\": obj.Name,");
// readOnly "id" must be skipped
TestUtils.assertFileNotContains(modelPath,
"\"id\": obj.Id,");
// readOnly nested model "meta" must not be recursed into, so a
// request body that omits it (and thus omits Meta's own required
// fields) is accepted.
TestUtils.assertFileNotContains(modelPath,
"if err := AssertMetaRequired(obj.Meta); err != nil {");
}

private static CodegenConfigurator createDefaultCodegenConfigurator(File output) {
return new CodegenConfigurator()
.setGeneratorName("go-server")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
openapi: 3.0.1

info:
version: 1.0.0
title: readOnly required fields must not be enforced on request bodies

paths:
/thing:
post:
operationId: createThing
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Thing'
responses:
'201':
description: created

components:
schemas:
Thing:
type: object
properties:
id:
type: string
readOnly: true
name:
type: string
meta:
readOnly: true
allOf:
- $ref: '#/components/schemas/Meta'
required:
- id
- name
- meta
Meta:
type: object
properties:
createdBy:
type: string
required:
- createdBy
Loading