This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new ca5c7d874 
FINERACT-1694-External-events-date-unit-change-to-milliseconds
ca5c7d874 is described below

commit ca5c7d8747182edb3fdd53318e96f71d3ea758ab
Author: Ruchi Dhamankar <[email protected]>
AuthorDate: Tue Mar 14 16:47:01 2023 +0530

    FINERACT-1694-External-events-date-unit-change-to-milliseconds
---
 .../infrastructure/core/service/DateUtils.java     |  5 +++
 .../jobs/SendAsynchronousEventsTasklet.java        |  2 +-
 .../external/repository/domain/ExternalEvent.java  |  2 +-
 .../db/changelog/tenant/changelog-tenant.xml       |  1 +
 ...fy_created_and_sent_at_date_external_events.xml | 41 ++++++++++++++++++++++
 .../external/service/ExternalEventServiceTest.java | 28 +++++++++++++++
 6 files changed, 77 insertions(+), 2 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java
index a18a60f77..611d9e2be 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java
@@ -66,6 +66,11 @@ public final class DateUtils {
         return OffsetDateTime.now(zone).truncatedTo(ChronoUnit.SECONDS);
     }
 
+    public static OffsetDateTime getOffsetDateTimeOfTenantWithMilliseconds() {
+        final ZoneId zone = getDateTimeZoneOfTenant();
+        return OffsetDateTime.now(zone).truncatedTo(ChronoUnit.MILLIS);
+    }
+
     public static LocalDateTime getLocalDateTimeOfSystem() {
         return 
LocalDateTime.now(ZoneId.systemDefault()).truncatedTo(ChronoUnit.SECONDS);
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
index 9962af34a..10f4cef42 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java
@@ -98,7 +98,7 @@ public class SendAsynchronousEventsTasklet implements Tasklet 
{
     }
 
     private void markEventsAsSent(List<Long> eventIds) {
-        OffsetDateTime sentAt = DateUtils.getOffsetDateTimeOfTenant();
+        OffsetDateTime sentAt = 
DateUtils.getOffsetDateTimeOfTenantWithMilliseconds();
 
         // Partitioning dataset to avoid exception: PreparedStatement can have 
at most 65,535 parameters
         List<List<Long>> partitions = Lists.partition(eventIds, 5_000);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java
index 2ab426a55..5e3802117 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/repository/domain/ExternalEvent.java
@@ -79,7 +79,7 @@ public class ExternalEvent extends AbstractPersistableCustom {
         this.schema = schema;
         this.data = data;
         this.idempotencyKey = idempotencyKey;
-        this.createdAt = DateUtils.getOffsetDateTimeOfTenant();
+        this.createdAt = DateUtils.getOffsetDateTimeOfTenantWithMilliseconds();
         this.status = ExternalEventStatus.TO_BE_SENT;
         this.businessDate = DateUtils.getBusinessLocalDate();
     }
diff --git 
a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml 
b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
index f5b28655a..1ffe88d13 100644
--- 
a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
+++ 
b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
@@ -115,4 +115,5 @@
     <include file="parts/0093_update_general_accounting_table_reports.xml" 
relativeToChangelogFile="true" />
     <include file="parts/0094_add_external_event_default_configuration.xml" 
relativeToChangelogFile="true" />
     <include 
file="parts/0095_add_delinquency_and_arrears_display_configuration.xml" 
relativeToChangelogFile="true" />
+    <include 
file="parts/0096_modify_created_and_sent_at_date_external_events.xml" 
relativeToChangelogFile="true" />
 </databaseChangeLog>
diff --git 
a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0096_modify_created_and_sent_at_date_external_events.xml
 
b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0096_modify_created_and_sent_at_date_external_events.xml
new file mode 100644
index 000000000..771ed9f6a
--- /dev/null
+++ 
b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0096_modify_created_and_sent_at_date_external_events.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership. The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog";
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                   
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd";>
+    <changeSet id="1" author="fineract">
+        <modifyDataType columnName="created_at"
+                        newDataType="timestamp(6)"
+                        tableName="m_external_event"/>
+    </changeSet>
+    <changeSet author="fineract" id="2-postgres" context="postgresql">
+        <modifyDataType columnName="sent_at"
+                        newDataType="timestamp(6)"
+                        tableName="m_external_event"/>
+    </changeSet>
+    <changeSet author="fineract" id="2-mysql" context="mysql">
+        <modifyDataType columnName="sent_at"
+                        newDataType="timestamp(6) NULL"
+                        tableName="m_external_event"/>
+    </changeSet>
+
+</databaseChangeLog>
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventServiceTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventServiceTest.java
index 7b0101fce..590943a6e 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventServiceTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/ExternalEventServiceTest.java
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.time.LocalDate;
 import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -186,4 +187,31 @@ class ExternalEventServiceTest {
         assertThat(externalEvent.getCategory()).isEqualTo(eventCategory);
 
     }
+
+    @Test
+    public void testEventShouldSaveDatesInMilliSecondFormat() throws 
IOException {
+        // given
+        ArgumentCaptor<ExternalEvent> externalEventArgumentCaptor = 
ArgumentCaptor.forClass(ExternalEvent.class);
+        String eventSchema = 
"org.apache.fineract.avro.loan.v1.LoanAccountDataV1";
+        String eventType = "TestType";
+        String eventCategory = "TestCategory";
+        String idempotencyKey = "key";
+        BusinessEvent event = mock(BusinessEvent.class);
+        BusinessEventSerializer eventSerializer = 
mock(BusinessEventSerializer.class);
+        byte[] data = new byte[0];
+
+        given(event.getType()).willReturn(eventType);
+        given(event.getCategory()).willReturn(eventCategory);
+        
given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey);
+        given(serializerFactory.create(event)).willReturn(eventSerializer);
+        given(eventSerializer.getSupportedSchema()).will(invocation -> 
LoanAccountDataV1.class);
+        given(eventSerializer.serialize(event)).willReturn(data);
+        // when
+        underTest.postEvent(event);
+        // then
+        verify(repository).save(externalEventArgumentCaptor.capture());
+        ExternalEvent externalEvent = externalEventArgumentCaptor.getValue();
+        
assertThat(externalEvent.getCreatedAt().isSupported(ChronoUnit.MILLIS)).isTrue();
+    }
+
 }

Reply via email to