diff --git a/fineract-avro-schemas/src/main/avro/loan/v1/LoanTransactionAdjustmentDataV1.avsc b/fineract-avro-schemas/src/main/avro/loan/v1/LoanTransactionAdjustmentDataV1.avsc index 1853e956a..cca7da97b 100644 --- a/fineract-avro-schemas/src/main/avro/loan/v1/LoanTransactionAdjustmentDataV1.avsc +++ b/fineract-avro-schemas/src/main/avro/loan/v1/LoanTransactionAdjustmentDataV1.avsc @@ -18,6 +18,17 @@ "null", "org.apache.fineract.avro.loan.v1.LoanTransactionDataV1" ] + }, + { + "default": null, + "name": "customData", + "type": [ + "null", + { + "values": "bytes", + "type": "map" + } + ] } ] } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializer.java index 8539d13cf..adec3eb6a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializer.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan; +import java.util.List; import lombok.RequiredArgsConstructor; import org.apache.avro.generic.GenericContainer; import org.apache.fineract.avro.generator.ByteBufferSerializable; @@ -26,7 +27,8 @@ import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper; -import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer; +import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventWithCustomDataSerializer; +import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.ExternalEventCustomDataSerializer; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadService; @@ -35,11 +37,13 @@ import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor -public class LoanAdjustTransactionBusinessEventSerializer implements BusinessEventSerializer { +public class LoanAdjustTransactionBusinessEventSerializer + extends AbstractBusinessEventWithCustomDataSerializer { private final LoanReadPlatformService service; private final LoanTransactionDataMapper mapper; private final LoanChargePaidByReadService loanChargePaidByReadService; + private final List> externalEventCustomDataSerializers; @Override public boolean canSerialize(BusinessEvent event) { @@ -66,11 +70,16 @@ public class LoanAdjustTransactionBusinessEventSerializer implements BusinessEve newTransactionDetailAvroDto = mapper.map(newTransactionDetailData); } - return new LoanTransactionAdjustmentDataV1(transactionToAdjustAvroDto, newTransactionDetailAvroDto); + return new LoanTransactionAdjustmentDataV1(transactionToAdjustAvroDto, newTransactionDetailAvroDto, collectCustomData(event)); } @Override public Class getSupportedSchema() { return LoanTransactionAdjustmentDataV1.class; } + + @Override + protected List> getExternalEventCustomDataSerializers() { + return externalEventCustomDataSerializers; + } } diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializerTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializerTest.java index af691bf31..1bbe3f7cd 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializerTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/serialization/serializer/loan/LoanAdjustTransactionBusinessEventSerializerTest.java @@ -19,17 +19,21 @@ package org.apache.fineract.infrastructure.event.external.service.serialization.serializer.loan; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; import java.math.BigDecimal; +import java.nio.ByteBuffer; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.fineract.avro.loan.v1.LoanTransactionAdjustmentDataV1; import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; @@ -41,6 +45,7 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustT import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapperImpl; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.ExternalIdMapper; +import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.ExternalEventCustomDataSerializer; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; @@ -87,8 +92,44 @@ public class LoanAdjustTransactionBusinessEventSerializerTest { @Test void loanTransactionReversedOnDateSerializationTest() { Loan loanForProcessing = Mockito.mock(Loan.class); + final List> externalEventCustomDataSerializers = List + .of(new ExternalEventCustomDataSerializer<>() { + + @Override + public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) { + return ByteBuffer.wrap("test_data_for_loan_adjust_transaction".getBytes(UTF_8)); + } + + @Override + public String key() { + return "test_key_1"; + } + }, new ExternalEventCustomDataSerializer<>() { + + @Override + public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) { + return ByteBuffer.wrap("test_data_for_loan_adjust_transaction_1".getBytes(UTF_8)); + } + + @Override + public String key() { + return "test_key_1"; + } + }, new ExternalEventCustomDataSerializer<>() { + + @Override + public ByteBuffer serialize(final LoanAdjustTransactionBusinessEvent event) { + return ByteBuffer.wrap("test_data_for_loan_adjust_transaction_2".getBytes(UTF_8)); + } + + @Override + public String key() { + return "test_key_2"; + } + }); LoanAdjustTransactionBusinessEventSerializer serializer = new LoanAdjustTransactionBusinessEventSerializer(service, - new LoanTransactionDataMapperImpl(avroDateTimeMapper, externalIdMapper), loanChargePaidByReadService); + new LoanTransactionDataMapperImpl(avroDateTimeMapper, externalIdMapper), loanChargePaidByReadService, + externalEventCustomDataSerializers); LoanTransaction transactionToAdjust = Mockito.mock(LoanTransaction.class); LoanAdjustTransactionBusinessEvent.Data loanAdjustTransactionBusinessEventData = new LoanAdjustTransactionBusinessEvent.Data( transactionToAdjust); @@ -112,5 +153,10 @@ public class LoanAdjustTransactionBusinessEventSerializerTest { LoanTransactionAdjustmentDataV1 loanTransactionAdjustmentDataV1 = (LoanTransactionAdjustmentDataV1) serializer .toAvroDTO(businessEvent); assertEquals(reversedLocalDate, loanTransactionAdjustmentDataV1.getTransactionToAdjust().getReversedOnDate()); + + assertNotNull(loanTransactionAdjustmentDataV1.getCustomData()); + final Map customData = loanTransactionAdjustmentDataV1.getCustomData(); + assertEquals("test_data_for_loan_adjust_transaction_1", new String(customData.get("test_key_1").array(), UTF_8)); + assertEquals("test_data_for_loan_adjust_transaction_2", new String(customData.get("test_key_2").array(), UTF_8)); } }