From ca5c7d8747182edb3fdd53318e96f71d3ea758ab Mon Sep 17 00:00:00 2001 From: Ruchi Dhamankar Date: Tue, 14 Mar 2023 16:47:01 +0530 Subject: [PATCH] FINERACT-1694-External-events-date-unit-change-to-milliseconds --- .../core/service/DateUtils.java | 5 +++ .../jobs/SendAsynchronousEventsTasklet.java | 2 +- .../repository/domain/ExternalEvent.java | 2 +- .../db/changelog/tenant/changelog-tenant.xml | 1 + ...eated_and_sent_at_date_external_events.xml | 41 +++++++++++++++++++ .../service/ExternalEventServiceTest.java | 28 +++++++++++++ 6 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0096_modify_created_and_sent_at_date_external_events.xml 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 eventIds) { - OffsetDateTime sentAt = DateUtils.getOffsetDateTimeOfTenant(); + OffsetDateTime sentAt = DateUtils.getOffsetDateTimeOfTenantWithMilliseconds(); // Partitioning dataset to avoid exception: PreparedStatement can have at most 65,535 parameters List> 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 @@ + 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 @@ + + + + + + + + + + + + + + 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 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(); + } + }