From 81cf57980aa5f07804f5d2b885313f94ae720f03 Mon Sep 17 00:00:00 2001
From: Justin Black <justin.a.black@gmail.com>
Date: Sun, 11 Oct 2020 21:17:45 -0700
Subject: [PATCH] Adds isDateTime to CodegenModel

This reverts commit 2ec96f7f9057ea67f7362d7d23d39a00e430410a.
---
 .../openapitools/codegen/CodegenModel.java    | 14 +++-
 .../codegen/CodegenParameter.java             |  8 +++
 .../openapitools/codegen/CodegenProperty.java |  8 +++
 .../openapitools/codegen/CodegenResponse.java |  8 +++
 .../openapitools/codegen/DefaultCodegen.java  |  5 ++
 .../IJsonSchemaValidationProperties.java      |  4 ++
 .../codegen/DefaultCodegenTest.java           | 32 +++++++++
 .../src/test/resources/3_0/issue_7651.yaml    | 65 +++++++++++++++++++
 8 files changed, 142 insertions(+), 2 deletions(-)

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<CodegenProperty> vars = new ArrayList<CodegenProperty>(); // all properties (without parent's properties)
     public List<CodegenProperty> allVars = new ArrayList<CodegenProperty>(); // all properties (with parent's properties)
     public List<CodegenProperty> requiredVars = new ArrayList<CodegenProperty>(); // 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<String, Object> 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
-- 
GitLab