diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java index 4598ddb4669..e96d1f3889a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java @@ -64,7 +64,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { public String defaultValue; public String arrayModelType; public boolean isAlias; // Is this effectively an alias of another simple type - public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate; + public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime; public List vars = new ArrayList(); // all properties (without parent's properties) public List allVars = new ArrayList(); // all properties (with parent's properties) public List requiredVars = new ArrayList(); // a list of required properties @@ -578,6 +578,14 @@ public class CodegenModel implements IJsonSchemaValidationProperties { this.isDate = isDate; } + @Override + public boolean getIsDateTime() { return isDateTime; } + + @Override + public void setIsDateTime(boolean isDateTime) { + this.isDateTime = isDateTime; + } + // indicates if the model component has validation on the root level schema // this will be true when minItems or minProperties is set public boolean hasValidation() { @@ -679,6 +687,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { isFloat == that.isFloat && isDouble == that.isDouble && isDate == that.isDate && + isDateTime == that.isDateTime && hasVars == that.hasVars && emptyVars == that.emptyVars && hasMoreModels == that.hasMoreModels && @@ -755,7 +764,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { getDescription(), getClassVarName(), getModelJson(), getDataType(), getXmlPrefix(), getXmlNamespace(), getXmlName(), getClassFilename(), getUnescapedDescription(), getDiscriminator(), getDefaultValue(), getArrayModelType(), isAlias, isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, - isDate, + isDate, isDateTime, getVars(), getAllVars(), getRequiredVars(), getOptionalVars(), getReadOnlyVars(), getReadWriteVars(), getParentVars(), getAllowableValues(), getMandatory(), getAllMandatory(), getImports(), hasVars, isEmptyVars(), hasMoreModels, hasEnums, isEnum, isNullable, hasRequired, hasOptional, isArrayModel, @@ -802,6 +811,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { sb.append(", isFloat=").append(isFloat); sb.append(", isDouble=").append(isDouble); sb.append(", isDate=").append(isDate); + sb.append(", isDateTime=").append(isDateTime); sb.append(", vars=").append(vars); sb.append(", allVars=").append(allVars); sb.append(", requiredVars=").append(requiredVars); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java index e588d8b8baa..bb3f54deaf6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java @@ -503,5 +503,13 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { public void setIsDate(boolean isDate) { this.isDate = isDate; } + + @Override + public boolean getIsDateTime() { return isDateTime; } + + @Override + public void setIsDateTime(boolean isDateTime) { + this.isDateTime = isDateTime; + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java index 7063055a6ac..de8b5033663 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java @@ -477,6 +477,14 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti this.isDate = isDate; } + @Override + public boolean getIsDateTime() { return isDateTime; } + + @Override + public void setIsDateTime(boolean isDateTime) { + this.isDateTime = isDateTime; + } + public Map getVendorExtensions() { return vendorExtensions; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index af05c228cdd..0883444569b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -298,6 +298,14 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { this.isDate = isDate; } + @Override + public boolean getIsDateTime() { return isDateTime; } + + @Override + public void setIsDateTime(boolean isDateTime) { + this.isDateTime = isDateTime; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("CodegenResponse{"); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index f287531045f..a27b542419b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2520,6 +2520,11 @@ public class DefaultCodegen implements CodegenConfig { } else { // int32 format m.isInteger = Boolean.TRUE; } + } else if (ModelUtils.isDateTimeSchema(schema)) { + // NOTE: DateTime schemas as CodegenModel is a rare use case and may be removed at a later date. + // Sync of properties is done for consistency with other data types like CodegenParameter/CodegenProperty. + ModelUtils.syncValidationProperties(schema, m); + m.isDateTime = Boolean.TRUE; } else if (ModelUtils.isDateSchema(schema)) { // NOTE: Date schemas as CodegenModel is a rare use case and may be removed at a later date. // Sync of properties is done for consistency with other data types like CodegenParameter/CodegenProperty. diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java index 2b2986bc940..0cd11b50a57 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java @@ -64,4 +64,8 @@ public interface IJsonSchemaValidationProperties { boolean getIsDate(); void setIsDate(boolean isDate); + + boolean getIsDateTime(); + + void setIsDateTime(boolean isDateTime); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 7d7c015c72e..1899afb9fc3 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -2386,5 +2386,37 @@ public class DefaultCodegenTest { assertEquals(co.bodyParams.get(0).isDate, true); assertEquals(co.responses.get(0).isString, false); assertEquals(co.responses.get(0).isDate, true); + + modelName = "DateTimeWithValidation"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + assertEquals(cm.isString, false); + assertEquals(cm.isDateTime, true); + + modelName = "ObjectWithDateTimeWithValidation"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + assertEquals(cm.getVars().get(0).isString, false); + assertEquals(cm.getVars().get(0).isDateTime, true); + + path = "/ref_date_time_with_validation/{dateTime}"; + operation = openAPI.getPaths().get(path).getPost(); + co = codegen.fromOperation(path, "POST", operation, null); + assertEquals(co.pathParams.get(0).isString, false); + assertEquals(co.pathParams.get(0).isDateTime, true); + assertEquals(co.bodyParams.get(0).isString, false); + assertEquals(co.bodyParams.get(0).isDateTime, true); + assertEquals(co.responses.get(0).isString, false); + assertEquals(co.responses.get(0).isDateTime, true); + + path = "/date_time_with_validation/{dateTime}"; + operation = openAPI.getPaths().get(path).getPost(); + co = codegen.fromOperation(path, "POST", operation, null); + assertEquals(co.pathParams.get(0).isString, false); + assertEquals(co.pathParams.get(0).isDateTime, true); + assertEquals(co.bodyParams.get(0).isString, false); + assertEquals(co.bodyParams.get(0).isDateTime, true); + assertEquals(co.responses.get(0).isString, false); + assertEquals(co.responses.get(0).isDateTime, true); } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml index ff3e91cad63..ce2bfff7fac 100644 --- a/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/issue_7651.yaml @@ -66,6 +66,60 @@ paths: type: string format: date pattern: '^2020.*' + /ref_date_time_with_validation/{dateTime}: + post: + tags: + - isX + operationId: refDateTimeWithValidation + parameters: + - name: dateTime + in: path + required: true + schema: + $ref: '#/components/schemas/DateTimeWithValidation' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DateTimeWithValidation' + required: true + responses: + 200: + description: success + content: + application/json: + schema: + $ref: '#/components/schemas/DateTimeWithValidation' + /date_time_with_validation/{dateTime}: + post: + tags: + - isX + operationId: dateTimeWithValidation + parameters: + - name: dateTime + in: path + required: true + schema: + type: string + format: date-time + pattern: '^2020.*' + requestBody: + content: + application/json: + schema: + type: string + format: date-time + pattern: '^2020.*' + required: true + responses: + 200: + description: success + content: + application/json: + schema: + type: string + format: date-time + pattern: '^2020.*' components: schemas: DateWithValidation: @@ -79,4 +133,15 @@ components: type: string format: date pattern: '^2020.*' + DateTimeWithValidation: + type: string + format: date-time + pattern: '^2020.*' + ObjectWithDateTimeWithValidation: + type: object + properties: + dateWithValidation: + type: string + format: date-time + pattern: '^2020.*' securitySchemes: {} \ No newline at end of file