FINERACT-1926: Fineract Asset Externalization events

- [x] Change events
- [x] Create data enricher
- [x] Core changes
- [x] Remove AbstractBusinessEventSerializer
- [x] BusinessEventSerializer.toAvroDto added and change the event serializers
This commit is contained in:
Janos Haber
2023-06-06 15:20:42 +02:00
committed by Adam Saghy
parent e4754b299b
commit 99470c0cf8
42 changed files with 372 additions and 110 deletions
@@ -27,6 +27,30 @@
"string" "string"
] ]
}, },
{
"default": null,
"name": "externalOwnerId",
"type": [
"null",
"string"
]
},
{
"default": null,
"name": "settlementDate",
"type": [
"null",
"string"
]
},
{
"default": null,
"name": "purchasePriceRatio",
"type": [
"null",
"string"
]
},
{ {
"default": null, "default": null,
"name": "status", "name": "status",
@@ -241,6 +241,14 @@
"string" "string"
] ]
}, },
{
"default": null,
"name": "externalOwnerId",
"type": [
"null",
"string"
]
},
{ {
"default": null, "default": null,
"name": "submittedOnDate", "name": "submittedOnDate",
@@ -147,6 +147,14 @@
"string" "string"
] ]
}, },
{
"default": null,
"name": "externalOwnerId",
"type": [
"null",
"string"
]
},
{ {
"default": null, "default": null,
"name": "transfer", "name": "transfer",
+1
View File
@@ -23,6 +23,7 @@ dependencies {
// Note that we never use 'api', because Fineract at least currently is a simple monolithic application ("WAR"), not a library. // Note that we never use 'api', because Fineract at least currently is a simple monolithic application ("WAR"), not a library.
// We also (normally should have) no need to ever use 'compileOnly'. // We also (normally should have) no need to ever use 'compileOnly'.
// implementation dependencies are directly used (compiled against) in src/main (and src/test) // implementation dependencies are directly used (compiled against) in src/main (and src/test)
// //
implementation( implementation(
@@ -0,0 +1,26 @@
/**
* 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.
*/
package org.apache.fineract.infrastructure.core.service;
public interface DataEnricher<T> {
boolean isDataTypeSupported(Class<T> dataType);
void enrich(T data);
}
@@ -0,0 +1,45 @@
/**
* 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.
*/
package org.apache.fineract.infrastructure.core.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DataEnricherProcessor {
private final List<DataEnricher<?>> enhancers;
@Autowired
public DataEnricherProcessor(Optional<List<DataEnricher<?>>> enhancers) {
this.enhancers = enhancers.orElse(new ArrayList<>());
}
public <T> T enrich(T source) {
for (DataEnricher enhancer : enhancers) {
if (enhancer.isDataTypeSupported(source.getClass())) {
enhancer.enrich(source);
}
}
return source;
}
}
+4
View File
@@ -26,6 +26,10 @@ dependencies {
// //
implementation(project(path: ':fineract-core')) implementation(project(path: ':fineract-core'))
implementation(project(path: ':fineract-loan')) implementation(project(path: ':fineract-loan'))
implementation('org.apache.avro:avro')
implementation(
project(path: ':fineract-avro-schemas')
)
implementation( implementation(
'org.springframework.boot:spring-boot-starter-web', 'org.springframework.boot:spring-boot-starter-web',
@@ -50,6 +50,7 @@ import org.apache.fineract.investor.data.ExternalTransferData;
import org.apache.fineract.investor.data.ExternalTransferResponseData; import org.apache.fineract.investor.data.ExternalTransferResponseData;
import org.apache.fineract.investor.service.ExternalAssetOwnersReadService; import org.apache.fineract.investor.service.ExternalAssetOwnersReadService;
import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformServiceCommon; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformServiceCommon;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -57,6 +58,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@Tag(name = "External Asset Owners", description = "External Asset Owners") @Tag(name = "External Asset Owners", description = "External Asset Owners")
@RequiredArgsConstructor @RequiredArgsConstructor
@ConditionalOnProperty(value = "fineract.module.external-asset-owner.enabled", havingValue = "true")
public class ExternalAssetOwnersApiResource { public class ExternalAssetOwnersApiResource {
private final PlatformUserRightsContext platformUserRightsContext; private final PlatformUserRightsContext platformUserRightsContext;
@@ -41,6 +41,12 @@ public interface ExternalAssetOwnerTransferRepository
@Query("select e from ExternalAssetOwnerTransfer e where e.loanId = :loanId and e.id = (select max(ex.id) from ExternalAssetOwnerTransfer ex where ex.loanId = :loanId)") @Query("select e from ExternalAssetOwnerTransfer e where e.loanId = :loanId and e.id = (select max(ex.id) from ExternalAssetOwnerTransfer ex where ex.loanId = :loanId)")
Optional<ExternalAssetOwnerTransfer> findLatestByLoanId(@Param("loanId") Long loanId); Optional<ExternalAssetOwnerTransfer> findLatestByLoanId(@Param("loanId") Long loanId);
@Query("select m.ownerTransfer from ExternalAssetOwnerTransferLoanMapping m inner join fetch m.ownerTransfer o where m.loanId = :loanId")
Optional<ExternalAssetOwnerTransfer> findActiveByLoanId(@Param("loanId") Long loanId);
@Query("select m.ownerTransfer.owner from ExternalAssetOwnerTransferLoanMapping m where m.loanId = :loanId")
Optional<ExternalAssetOwner> findActiveOwnerByLoanId(@Param("loanId") Long loanId);
@Query("SELECT t FROM ExternalAssetOwnerTransfer t WHERE t.loanId = :loanId AND t.effectiveDateTo > :effectiveDate") @Query("SELECT t FROM ExternalAssetOwnerTransfer t WHERE t.loanId = :loanId AND t.effectiveDateTo > :effectiveDate")
List<ExternalAssetOwnerTransfer> findEffectiveTransfers(@Param("loanId") Long loanId, @Param("effectiveDate") LocalDate effectiveDate); List<ExternalAssetOwnerTransfer> findEffectiveTransfers(@Param("loanId") Long loanId, @Param("effectiveDate") LocalDate effectiveDate);
} }
@@ -0,0 +1,55 @@
/**
* 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.
*/
package org.apache.fineract.investor.enricher;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
import org.apache.fineract.infrastructure.core.domain.ExternalId;
import org.apache.fineract.infrastructure.core.service.DataEnricher;
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.investor.domain.ExternalAssetOwnerTransferRepository;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class LoanAccountDataV1Enricher implements DataEnricher<LoanAccountDataV1> {
private final ExternalAssetOwnerTransferRepository externalAssetOwnerTransferRepository;
private final ExternalIdMapper externalIdMapper;
private final AvroDateTimeMapper avroDateTimeMapper;
@Override
public boolean isDataTypeSupported(Class<LoanAccountDataV1> dataType) {
return dataType.isAssignableFrom(LoanAccountDataV1.class);
}
@Override
public void enrich(LoanAccountDataV1 data) {
externalAssetOwnerTransferRepository.findActiveByLoanId(data.getId()).ifPresent(transfer -> {
ExternalId transferOwnerExternalId = transfer.getOwner().getExternalId();
data.setExternalOwnerId(externalIdMapper.mapExternalId(transferOwnerExternalId));
data.setSettlementDate(avroDateTimeMapper.mapLocalDate(transfer.getSettlementDate()));
data.setPurchasePriceRatio(transfer.getPurchasePriceRatio());
if (data.getCharges() != null) {
data.getCharges().forEach(charge -> charge.setExternalOwnerId(externalIdMapper.mapExternalId(transferOwnerExternalId)));
}
});
}
}
@@ -0,0 +1,45 @@
/**
* 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.
*/
package org.apache.fineract.investor.enricher;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.avro.loan.v1.LoanChargeDataV1;
import org.apache.fineract.infrastructure.core.service.DataEnricher;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.ExternalIdMapper;
import org.apache.fineract.investor.domain.ExternalAssetOwnerTransferRepository;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class LoanChargeDataV1Enricher implements DataEnricher<LoanChargeDataV1> {
private final ExternalAssetOwnerTransferRepository externalAssetOwnerTransferRepository;
private final ExternalIdMapper externalIdMapper;
@Override
public boolean isDataTypeSupported(Class<LoanChargeDataV1> dataType) {
return dataType.isAssignableFrom(LoanChargeDataV1.class);
}
@Override
public void enrich(LoanChargeDataV1 data) {
externalAssetOwnerTransferRepository.findActiveOwnerByLoanId(data.getLoanId())
.ifPresent(owner -> data.setExternalOwnerId(externalIdMapper.mapExternalId(owner.getExternalId())));
}
}
@@ -0,0 +1,29 @@
/**
* 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.
*/
package org.apache.fineract.infrastructure.core.config;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AbstractFineractModuleProperties {
private boolean enabled;
}
@@ -65,6 +65,8 @@ public class FineractProperties {
private FineractSamplingProperties sampling; private FineractSamplingProperties sampling;
private FineractModulesProperties module;
@Getter @Getter
@Setter @Setter
public static class FineractTenantProperties { public static class FineractTenantProperties {
@@ -403,4 +405,17 @@ public class FineractProperties {
private String sampledClasses; private String sampledClasses;
private int resetPeriodSec; private int resetPeriodSec;
} }
@Getter
@Setter
public static class FineractModulesProperties {
private FineractExternalAssetOwnerModuleProperties externalAssetOwner;
}
@Getter
@Setter
public static class FineractExternalAssetOwnerModuleProperties extends AbstractFineractModuleProperties {
}
} }
@@ -21,12 +21,15 @@ package org.apache.fineract.infrastructure.event.external.service;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.avro.BulkMessageItemV1; import org.apache.fineract.avro.BulkMessageItemV1;
import org.apache.fineract.avro.BulkMessagePayloadV1; import org.apache.fineract.avro.BulkMessagePayloadV1;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.core.service.DataEnricherProcessor;
import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.external.repository.ExternalEventRepository; import org.apache.fineract.infrastructure.event.external.repository.ExternalEventRepository;
@@ -50,6 +53,7 @@ public class ExternalEventService {
private final BusinessEventSerializerFactory serializerFactory; private final BusinessEventSerializerFactory serializerFactory;
private final ByteBufferConverter byteBufferConverter; private final ByteBufferConverter byteBufferConverter;
private final BulkMessageItemFactory bulkMessageItemFactory; private final BulkMessageItemFactory bulkMessageItemFactory;
private final DataEnricherProcessor dataEnricherProcessor;
private EntityManager entityManager; private EntityManager entityManager;
@@ -98,7 +102,9 @@ public class ExternalEventService {
String idempotencyKey = idempotencyKeyGenerator.generate(event); String idempotencyKey = idempotencyKeyGenerator.generate(event);
BusinessEventSerializer serializer = serializerFactory.create(event); BusinessEventSerializer serializer = serializerFactory.create(event);
String schema = serializer.getSupportedSchema().getName(); String schema = serializer.getSupportedSchema().getName();
byte[] data = serializer.serialize(event); ByteBufferSerializable avroDto = dataEnricherProcessor.enrich(serializer.toAvroDTO(event));
ByteBuffer buffer = avroDto.toByteBuffer();
byte[] data = byteBufferConverter.convert(buffer);
Long aggregateRootId = event.getAggregateRootId(); Long aggregateRootId = event.getAggregateRootId();
return new ExternalEvent(eventType, eventCategory, schema, data, idempotencyKey, aggregateRootId); return new ExternalEvent(eventType, eventCategory, schema, data, idempotencyKey, aggregateRootId);
@@ -22,6 +22,8 @@ import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.fineract.avro.BulkMessageItemV1; import org.apache.fineract.avro.BulkMessageItemV1;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.core.service.DataEnricherProcessor;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializerFactory; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializerFactory;
@@ -34,10 +36,13 @@ public class BulkMessageItemFactory {
private final BusinessEventSerializerFactory serializerFactory; private final BusinessEventSerializerFactory serializerFactory;
private final ByteBufferConverter byteBufferConverter; private final ByteBufferConverter byteBufferConverter;
private final DataEnricherProcessor dataEnricherProcessor;
public BulkMessageItemV1 createBulkMessageItem(int id, BusinessEvent<?> event) throws IOException { public BulkMessageItemV1 createBulkMessageItem(int id, BusinessEvent<?> event) throws IOException {
BusinessEventSerializer eventSerializer = serializerFactory.create(event); BusinessEventSerializer eventSerializer = serializerFactory.create(event);
byte[] serializedContent = eventSerializer.serialize(event); ByteBufferSerializable avroDto = dataEnricherProcessor.enrich(eventSerializer.toAvroDTO(event));
ByteBuffer buffer = avroDto.toByteBuffer();
byte[] serializedContent = byteBufferConverter.convert(buffer);
String type = event.getType(); String type = event.getType();
String category = "nocategory"; // TODO: switch this to the actual category when implemented String category = "nocategory"; // TODO: switch this to the actual category when implemented
String schema = eventSerializer.getSupportedSchema().getName(); String schema = eventSerializer.getSupportedSchema().getName();
@@ -24,7 +24,7 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
@Mapper(config = AvroMapperConfig.class, uses = { LoanTransactionDataMapper.class }) @Mapper(config = AvroMapperConfig.class, uses = { LoanTransactionDataMapper.class, LoanChargeDataMapper.class })
public interface LoanAccountDataMapper { public interface LoanAccountDataMapper {
// TODO: avoid prefix "is" in class attributes; I would recommend to fix this also in the Avro structures // TODO: avoid prefix "is" in class attributes; I would recommend to fix this also in the Avro structures
@@ -32,5 +32,9 @@ public interface LoanAccountDataMapper {
@Mapping(source = "floatingInterestRate", target = "isFloatingInterestRate") @Mapping(source = "floatingInterestRate", target = "isFloatingInterestRate")
@Mapping(source = "topup", target = "isTopup") @Mapping(source = "topup", target = "isTopup")
@Mapping(source = "interestRecalculationEnabled", target = "isInterestRecalculationEnabled") @Mapping(source = "interestRecalculationEnabled", target = "isInterestRecalculationEnabled")
@Mapping(target = "externalOwnerId", ignore = true)
@Mapping(target = "settlementDate", ignore = true)
@Mapping(target = "purchasePriceRatio", ignore = true)
LoanAccountDataV1 map(LoanAccountData source); LoanAccountDataV1 map(LoanAccountData source);
} }
@@ -23,10 +23,12 @@ import org.apache.fineract.avro.loan.v1.LoanChargeDataV1;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroMapperConfig; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroMapperConfig;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(config = AvroMapperConfig.class) @Mapper(config = AvroMapperConfig.class)
public interface LoanChargeDataMapper { public interface LoanChargeDataMapper {
@Mapping(target = "externalOwnerId", ignore = true)
LoanChargeDataV1 map(LoanChargeData source); LoanChargeDataV1 map(LoanChargeData source);
LoanChargeDataRangeViewV1 mapRangeView(LoanChargeData source); LoanChargeDataRangeViewV1 mapRangeView(LoanChargeData source);
@@ -29,5 +29,6 @@ public interface LoanTransactionDataMapper {
// unpaidCharges are calculated and set explicitly based on if needed (only for charge-off transaction yet) // unpaidCharges are calculated and set explicitly based on if needed (only for charge-off transaction yet)
@Mapping(target = "unpaidCharges", ignore = true) @Mapping(target = "unpaidCharges", ignore = true)
@Mapping(target = "externalOwnerId", ignore = true)
LoanTransactionDataV1 map(LoanTransactionData source); LoanTransactionDataV1 map(LoanTransactionData source);
} }
@@ -1,44 +0,0 @@
/**
* 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.
*/
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer;
import java.io.IOException;
import java.nio.ByteBuffer;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter;
import org.springframework.beans.factory.annotation.Autowired;
@RequiredArgsConstructor
public abstract class AbstractBusinessEventSerializer implements BusinessEventSerializer {
@Setter(onMethod = @__({ @Autowired }))
private ByteBufferConverter byteBufferConverter;
@Override
public <T> byte[] serialize(BusinessEvent<T> rawEvent) throws IOException {
ByteBufferSerializable avroDto = toAvroDTO(rawEvent);
ByteBuffer buffer = avroDto.toByteBuffer();
return byteBufferConverter.convert(buffer);
}
protected abstract <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent);
}
@@ -18,15 +18,16 @@
*/ */
package org.apache.fineract.infrastructure.event.external.service.serialization.serializer; package org.apache.fineract.infrastructure.event.external.service.serialization.serializer;
import java.io.IOException;
import org.apache.avro.generic.GenericContainer; import org.apache.avro.generic.GenericContainer;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
public interface BusinessEventSerializer { public interface BusinessEventSerializer {
<T> boolean canSerialize(BusinessEvent<T> event); <T> boolean canSerialize(BusinessEvent<T> event);
<T> byte[] serialize(BusinessEvent<T> rawEvent) throws IOException;
Class<? extends GenericContainer> getSupportedSchema(); Class<? extends GenericContainer> getSupportedSchema();
<T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent);
} }
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.client.ClientBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.client.ClientBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.client.ClientDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.client.ClientDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class ClientBusinessEventSerializer extends AbstractBusinessEventSerializer { public class ClientBusinessEventSerializer implements BusinessEventSerializer {
private final ClientReadPlatformService service; private final ClientReadPlatformService service;
private final ClientDataMapper mapper; private final ClientDataMapper mapper;
@@ -43,7 +43,7 @@ public class ClientBusinessEventSerializer extends AbstractBusinessEventSerializ
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
ClientBusinessEvent event = (ClientBusinessEvent) rawEvent; ClientBusinessEvent event = (ClientBusinessEvent) rawEvent;
ClientData data = service.retrieveOne(event.get().getId()); ClientData data = service.retrieveOne(event.get().getId());
return mapper.map(data); return mapper.map(data);
@@ -25,7 +25,7 @@ import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.deposit.FixedDepositAccountBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.deposit.FixedDepositAccountBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.fixeddeposit.FixedDepositAccountDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.fixeddeposit.FixedDepositAccountDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.savings.DepositAccountType; import org.apache.fineract.portfolio.savings.DepositAccountType;
import org.apache.fineract.portfolio.savings.data.FixedDepositAccountData; import org.apache.fineract.portfolio.savings.data.FixedDepositAccountData;
import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class FixedDepositAccountBusinessEventSerializer extends AbstractBusinessEventSerializer { public class FixedDepositAccountBusinessEventSerializer implements BusinessEventSerializer {
private final DepositAccountReadPlatformService service; private final DepositAccountReadPlatformService service;
private final FixedDepositAccountDataMapper mapper; private final FixedDepositAccountDataMapper mapper;
@@ -44,7 +44,7 @@ public class FixedDepositAccountBusinessEventSerializer extends AbstractBusiness
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
FixedDepositAccountBusinessEvent event = (FixedDepositAccountBusinessEvent) rawEvent; FixedDepositAccountBusinessEvent event = (FixedDepositAccountBusinessEvent) rawEvent;
FixedDepositAccountData data = (FixedDepositAccountData) service.retrieveOne(DepositAccountType.FIXED_DEPOSIT, event.get().getId()); FixedDepositAccountData data = (FixedDepositAccountData) service.retrieveOne(DepositAccountType.FIXED_DEPOSIT, event.get().getId());
return mapper.map(data); return mapper.map(data);
@@ -25,12 +25,12 @@ import org.apache.fineract.avro.generic.v1.CommandProcessingResultV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.group.GroupsBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.group.GroupsBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.generic.CommandProcessingResultMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.generic.CommandProcessingResultMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class GroupsBusinessEventSerializer extends AbstractBusinessEventSerializer { public class GroupsBusinessEventSerializer implements BusinessEventSerializer {
private final CommandProcessingResultMapper mapper; private final CommandProcessingResultMapper mapper;
@@ -40,7 +40,7 @@ public class GroupsBusinessEventSerializer extends AbstractBusinessEventSerializ
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
GroupsBusinessEvent event = (GroupsBusinessEvent) rawEvent; GroupsBusinessEvent event = (GroupsBusinessEvent) rawEvent;
return mapper.map(event.get()); return mapper.map(event.get());
} }
@@ -26,12 +26,12 @@ import org.apache.fineract.cob.data.LoanAccountsStayedLockedData;
import org.apache.fineract.cob.loan.LoanAccountsStayedLockedBusinessEvent; import org.apache.fineract.cob.loan.LoanAccountsStayedLockedBusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanAccountsStayedLockedDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanAccountsStayedLockedDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanAccountsStayedLockedBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanAccountsStayedLockedBusinessEventSerializer implements BusinessEventSerializer {
private final LoanAccountsStayedLockedDataMapper mapper; private final LoanAccountsStayedLockedDataMapper mapper;
@@ -41,7 +41,7 @@ public class LoanAccountsStayedLockedBusinessEventSerializer extends AbstractBus
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanAccountsStayedLockedBusinessEvent event = (LoanAccountsStayedLockedBusinessEvent) rawEvent; LoanAccountsStayedLockedBusinessEvent event = (LoanAccountsStayedLockedBusinessEvent) rawEvent;
LoanAccountsStayedLockedData loanAccounts = event.get(); LoanAccountsStayedLockedData loanAccounts = event.get();
return mapper.map(loanAccounts); return mapper.map(loanAccounts);
@@ -26,7 +26,7 @@ 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.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanAdjustTransactionBusinessEvent; 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.mapper.loan.LoanTransactionDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadPlatformService;
@@ -35,7 +35,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanAdjustTransactionBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanAdjustTransactionBusinessEventSerializer implements BusinessEventSerializer {
private final LoanReadPlatformService service; private final LoanReadPlatformService service;
private final LoanTransactionDataMapper mapper; private final LoanTransactionDataMapper mapper;
@@ -47,7 +47,7 @@ public class LoanAdjustTransactionBusinessEventSerializer extends AbstractBusine
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanAdjustTransactionBusinessEvent event = (LoanAdjustTransactionBusinessEvent) rawEvent; LoanAdjustTransactionBusinessEvent event = (LoanAdjustTransactionBusinessEvent) rawEvent;
LoanTransaction transactionToAdjust = event.get().getTransactionToAdjust(); LoanTransaction transactionToAdjust = event.get().getTransactionToAdjust();
LoanTransactionData transactionToAdjustData = service.retrieveLoanTransaction(transactionToAdjust.getLoan().getId(), LoanTransactionData transactionToAdjustData = service.retrieveLoanTransaction(transactionToAdjust.getLoan().getId(),
@@ -27,7 +27,7 @@ import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanAccountDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanAccountDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService; import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.data.CollectionData; import org.apache.fineract.portfolio.loanaccount.data.CollectionData;
import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData; import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
@@ -40,7 +40,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanBusinessEventSerializer implements BusinessEventSerializer {
private final LoanReadPlatformService service; private final LoanReadPlatformService service;
private final LoanAccountDataMapper mapper; private final LoanAccountDataMapper mapper;
@@ -53,7 +53,7 @@ public class LoanBusinessEventSerializer extends AbstractBusinessEventSerializer
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanBusinessEvent event = (LoanBusinessEvent) rawEvent; LoanBusinessEvent event = (LoanBusinessEvent) rawEvent;
Long loanId = event.get().getId(); Long loanId = event.get().getId();
LoanAccountData data = service.retrieveOne(loanId); LoanAccountData data = service.retrieveOne(loanId);
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.loan.v1.LoanChargeDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.charge.LoanChargeBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.charge.LoanChargeBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargeReadPlatformService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanChargeBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanChargeBusinessEventSerializer implements BusinessEventSerializer {
private final LoanChargeReadPlatformService service; private final LoanChargeReadPlatformService service;
private final LoanChargeDataMapper mapper; private final LoanChargeDataMapper mapper;
@@ -43,7 +43,7 @@ public class LoanChargeBusinessEventSerializer extends AbstractBusinessEventSeri
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanChargeBusinessEvent event = (LoanChargeBusinessEvent) rawEvent; LoanChargeBusinessEvent event = (LoanChargeBusinessEvent) rawEvent;
LoanChargeData data = service.retrieveLoanChargeDetails(event.get().getId(), event.get().getLoan().getId()); LoanChargeData data = service.retrieveLoanChargeDetails(event.get().getId(), event.get().getLoan().getId());
return mapper.map(data); return mapper.map(data);
@@ -24,7 +24,7 @@ import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.avro.loan.v1.LoanChargeDeletedV1; import org.apache.fineract.avro.loan.v1.LoanChargeDeletedV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.charge.LoanDeleteChargeBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.charge.LoanDeleteChargeBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter; import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge; import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
@@ -34,7 +34,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@Order(Ordered.LOWEST_PRECEDENCE - 1) @Order(Ordered.LOWEST_PRECEDENCE - 1)
public class LoanChargeDeletedBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanChargeDeletedBusinessEventSerializer implements BusinessEventSerializer {
private final ByteBufferConverter byteBufferConverter; private final ByteBufferConverter byteBufferConverter;
@@ -44,7 +44,7 @@ public class LoanChargeDeletedBusinessEventSerializer extends AbstractBusinessEv
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanDeleteChargeBusinessEvent event = (LoanDeleteChargeBusinessEvent) rawEvent; LoanDeleteChargeBusinessEvent event = (LoanDeleteChargeBusinessEvent) rawEvent;
LoanCharge loanCharge = event.get(); LoanCharge loanCharge = event.get();
Long id = loanCharge.getId(); Long id = loanCharge.getId();
@@ -56,7 +56,7 @@ public class LoanChargeOffBusinessEventSerializer extends LoanTransactionBusines
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanTransactionDataV1 transactionDataV1 = (LoanTransactionDataV1) super.toAvroDTO(rawEvent); LoanTransactionDataV1 transactionDataV1 = (LoanTransactionDataV1) super.toAvroDTO(rawEvent);
LoanTransactionBusinessEvent event = (LoanTransactionBusinessEvent) rawEvent; LoanTransactionBusinessEvent event = (LoanTransactionBusinessEvent) rawEvent;
List<UnpaidChargeData> unpaidChargeDataList = loanTransactionRepository.fetchTotalUnpaidChargesForLoan(event.get().getLoan()); List<UnpaidChargeData> unpaidChargeDataList = loanTransactionRepository.fetchTotalUnpaidChargesForLoan(event.get().getLoan());
@@ -34,7 +34,7 @@ import org.apache.fineract.infrastructure.event.external.service.serialization.m
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanChargeDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanDelinquencyRangeDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanDelinquencyRangeDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService; import org.apache.fineract.portfolio.delinquency.service.DelinquencyReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.data.CollectionData; import org.apache.fineract.portfolio.loanaccount.data.CollectionData;
@@ -50,7 +50,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@Order(Ordered.LOWEST_PRECEDENCE - 1) @Order(Ordered.LOWEST_PRECEDENCE - 1)
public class LoanDelinquencyRangeChangeBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanDelinquencyRangeChangeBusinessEventSerializer implements BusinessEventSerializer {
private final LoanReadPlatformService service; private final LoanReadPlatformService service;
@@ -66,7 +66,7 @@ public class LoanDelinquencyRangeChangeBusinessEventSerializer extends AbstractB
private final AvroDateTimeMapper dataTimeMapper; private final AvroDateTimeMapper dataTimeMapper;
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanDelinquencyRangeChangeBusinessEvent event = (LoanDelinquencyRangeChangeBusinessEvent) rawEvent; LoanDelinquencyRangeChangeBusinessEvent event = (LoanDelinquencyRangeChangeBusinessEvent) rawEvent;
LoanAccountData data = service.retrieveOne(event.get().getId()); LoanAccountData data = service.retrieveOne(event.get().getId());
Long id = data.getId(); Long id = data.getId();
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.loan.v1.LoanProductDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.product.LoanProductBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.product.LoanProductBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanProductDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanProductDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.loanproduct.data.LoanProductData; import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
import org.apache.fineract.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.apache.fineract.portfolio.loanproduct.service.LoanProductReadPlatformService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanProductBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanProductBusinessEventSerializer implements BusinessEventSerializer {
private final LoanProductReadPlatformService service; private final LoanProductReadPlatformService service;
private final LoanProductDataMapper mapper; private final LoanProductDataMapper mapper;
@@ -43,7 +43,7 @@ public class LoanProductBusinessEventSerializer extends AbstractBusinessEventSer
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanProductBusinessEvent event = (LoanProductBusinessEvent) rawEvent; LoanProductBusinessEvent event = (LoanProductBusinessEvent) rawEvent;
LoanProductData data = service.retrieveLoanProduct(event.get().getId()); LoanProductData data = service.retrieveLoanProduct(event.get().getId());
return mapper.map(data); return mapper.map(data);
@@ -30,7 +30,7 @@ import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.repayment.LoanRepaymentBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.repayment.LoanRepaymentBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanRepaymentPastDueDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanRepaymentPastDueDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.support.AvroDateTimeMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.portfolio.loanaccount.data.LoanRepaymentPastDueData; import org.apache.fineract.portfolio.loanaccount.data.LoanRepaymentPastDueData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.Loan;
@@ -40,14 +40,14 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanRepaymentBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanRepaymentBusinessEventSerializer implements BusinessEventSerializer {
private final AvroDateTimeMapper dataTimeMapper; private final AvroDateTimeMapper dataTimeMapper;
private final LoanRepaymentPastDueDataMapper pastDueDataMapper; private final LoanRepaymentPastDueDataMapper pastDueDataMapper;
private final LoanCalculateRepaymentPastDueService pastDueService; private final LoanCalculateRepaymentPastDueService pastDueService;
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanRepaymentBusinessEvent event = (LoanRepaymentBusinessEvent) rawEvent; LoanRepaymentBusinessEvent event = (LoanRepaymentBusinessEvent) rawEvent;
LoanRepaymentScheduleInstallment repaymentInstallment = event.get(); LoanRepaymentScheduleInstallment repaymentInstallment = event.get();
@@ -25,7 +25,7 @@ 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.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.loan.LoanTransactionDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanChargePaidByReadPlatformService;
import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class LoanTransactionBusinessEventSerializer extends AbstractBusinessEventSerializer { public class LoanTransactionBusinessEventSerializer implements BusinessEventSerializer {
private final LoanReadPlatformService service; private final LoanReadPlatformService service;
private final LoanTransactionDataMapper loanTransactionMapper; private final LoanTransactionDataMapper loanTransactionMapper;
@@ -45,7 +45,7 @@ public class LoanTransactionBusinessEventSerializer extends AbstractBusinessEven
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
LoanTransactionBusinessEvent event = (LoanTransactionBusinessEvent) rawEvent; LoanTransactionBusinessEvent event = (LoanTransactionBusinessEvent) rawEvent;
Long loanId = event.get().getLoan().getId(); Long loanId = event.get().getLoan().getId();
Long loanTransactionId = event.get().getId(); Long loanTransactionId = event.get().getId();
@@ -25,7 +25,7 @@ import org.apache.fineract.avro.recurringdeposit.v1.RecurringDepositAccountDataV
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.deposit.RecurringDepositAccountBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.deposit.RecurringDepositAccountBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.recurringdeposit.RecurringDepositAccountDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.recurringdeposit.RecurringDepositAccountDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.savings.DepositAccountType; import org.apache.fineract.portfolio.savings.DepositAccountType;
import org.apache.fineract.portfolio.savings.data.RecurringDepositAccountData; import org.apache.fineract.portfolio.savings.data.RecurringDepositAccountData;
import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class RecurringDepositAccountBusinessEventSerializer extends AbstractBusinessEventSerializer { public class RecurringDepositAccountBusinessEventSerializer implements BusinessEventSerializer {
private final DepositAccountReadPlatformService service; private final DepositAccountReadPlatformService service;
private final RecurringDepositAccountDataMapper mapper; private final RecurringDepositAccountDataMapper mapper;
@@ -44,7 +44,7 @@ public class RecurringDepositAccountBusinessEventSerializer extends AbstractBusi
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
RecurringDepositAccountBusinessEvent event = (RecurringDepositAccountBusinessEvent) rawEvent; RecurringDepositAccountBusinessEvent event = (RecurringDepositAccountBusinessEvent) rawEvent;
RecurringDepositAccountData data = (RecurringDepositAccountData) service.retrieveOne(DepositAccountType.RECURRING_DEPOSIT, RecurringDepositAccountData data = (RecurringDepositAccountData) service.retrieveOne(DepositAccountType.RECURRING_DEPOSIT,
event.get().getId()); event.get().getId());
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.savings.v1.SavingsAccountDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.savings.SavingsAccountBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.savings.SavingsAccountBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.savings.SavingsAccountDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.savings.SavingsAccountDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.savings.data.SavingsAccountData; import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class SavingsAccountBusinessEventSerializer extends AbstractBusinessEventSerializer { public class SavingsAccountBusinessEventSerializer implements BusinessEventSerializer {
private final SavingsAccountReadPlatformService service; private final SavingsAccountReadPlatformService service;
private final SavingsAccountDataMapper mapper; private final SavingsAccountDataMapper mapper;
@@ -43,7 +43,7 @@ public class SavingsAccountBusinessEventSerializer extends AbstractBusinessEvent
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
SavingsAccountBusinessEvent event = (SavingsAccountBusinessEvent) rawEvent; SavingsAccountBusinessEvent event = (SavingsAccountBusinessEvent) rawEvent;
SavingsAccountData data = service.retrieveOne(event.get().getId()); SavingsAccountData data = service.retrieveOne(event.get().getId());
return mapper.map(data); return mapper.map(data);
@@ -25,7 +25,7 @@ import org.apache.fineract.avro.savings.v1.SavingsAccountTransactionDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.savings.transaction.SavingsAccountTransactionBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.savings.transaction.SavingsAccountTransactionBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.savings.SavingsAccountTransactionDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.savings.SavingsAccountTransactionDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class SavingsAccountTransactionBusinessEventSerializer extends AbstractBusinessEventSerializer { public class SavingsAccountTransactionBusinessEventSerializer implements BusinessEventSerializer {
private final SavingsAccountReadPlatformService service; private final SavingsAccountReadPlatformService service;
private final SavingsAccountTransactionDataMapper mapper; private final SavingsAccountTransactionDataMapper mapper;
@@ -44,7 +44,7 @@ public class SavingsAccountTransactionBusinessEventSerializer extends AbstractBu
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
SavingsAccountTransactionBusinessEvent event = (SavingsAccountTransactionBusinessEvent) rawEvent; SavingsAccountTransactionBusinessEvent event = (SavingsAccountTransactionBusinessEvent) rawEvent;
SavingsAccountTransaction tx = event.get(); SavingsAccountTransaction tx = event.get();
SavingsAccountTransactionData data = service.retrieveSavingsTransaction(tx.getSavingsAccount().getId(), tx.getId(), SavingsAccountTransactionData data = service.retrieveSavingsTransaction(tx.getSavingsAccount().getId(), tx.getId(),
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.share.v1.ShareAccountDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.share.ShareAccountBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.share.ShareAccountBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.share.ShareAccountDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.share.ShareAccountDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountData; import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountData;
import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountReadPlatformService; import org.apache.fineract.portfolio.shareaccounts.service.ShareAccountReadPlatformService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class ShareAccountBusinessEventSerializer extends AbstractBusinessEventSerializer { public class ShareAccountBusinessEventSerializer implements BusinessEventSerializer {
private final ShareAccountReadPlatformService service; private final ShareAccountReadPlatformService service;
private final ShareAccountDataMapper mapper; private final ShareAccountDataMapper mapper;
@@ -43,7 +43,7 @@ public class ShareAccountBusinessEventSerializer extends AbstractBusinessEventSe
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
ShareAccountBusinessEvent event = (ShareAccountBusinessEvent) rawEvent; ShareAccountBusinessEvent event = (ShareAccountBusinessEvent) rawEvent;
ShareAccountData data = service.retrieveOne(event.get().getId(), false); ShareAccountData data = service.retrieveOne(event.get().getId(), false);
return mapper.map(data); return mapper.map(data);
@@ -25,14 +25,14 @@ import org.apache.fineract.avro.share.v1.ShareProductDataV1;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.share.ShareProductDividentsCreateBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.share.ShareProductDividentsCreateBusinessEvent;
import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.share.ShareProductDataMapper; import org.apache.fineract.infrastructure.event.external.service.serialization.mapper.share.ShareProductDataMapper;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.AbstractBusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.portfolio.products.service.ShareProductReadPlatformService; import org.apache.fineract.portfolio.products.service.ShareProductReadPlatformService;
import org.apache.fineract.portfolio.shareproducts.data.ShareProductData; import org.apache.fineract.portfolio.shareproducts.data.ShareProductData;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class ShareProductDividentsCreateBusinessEventSerializer extends AbstractBusinessEventSerializer { public class ShareProductDividentsCreateBusinessEventSerializer implements BusinessEventSerializer {
private final ShareProductReadPlatformService service; private final ShareProductReadPlatformService service;
private final ShareProductDataMapper mapper; private final ShareProductDataMapper mapper;
@@ -43,7 +43,7 @@ public class ShareProductDividentsCreateBusinessEventSerializer extends Abstract
} }
@Override @Override
protected <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) { public <T> ByteBufferSerializable toAvroDTO(BusinessEvent<T> rawEvent) {
ShareProductDividentsCreateBusinessEvent event = (ShareProductDividentsCreateBusinessEvent) rawEvent; ShareProductDividentsCreateBusinessEvent event = (ShareProductDividentsCreateBusinessEvent) rawEvent;
ShareProductData data = (ShareProductData) service.retrieveOne(event.get(), false); ShareProductData data = (ShareProductData) service.retrieveOne(event.get(), false);
return mapper.map(data); return mapper.map(data);
@@ -124,6 +124,8 @@ fineract.sampling.samplingRate=${FINERACT_SAMPLING_RATE:1000}
fineract.sampling.sampledClasses=${FINERACT_SAMPLED_CLASSES:} fineract.sampling.sampledClasses=${FINERACT_SAMPLED_CLASSES:}
fineract.sampling.resetPeriodSec=${FINERACT_SAMPLING_RESET_PERIOD_IN_SEC:60} fineract.sampling.resetPeriodSec=${FINERACT_SAMPLING_RESET_PERIOD_IN_SEC:60}
fineract.module.external-asset-owner.enabled=${FINERACT_MODULE_EXTERNAL_ASSET_OWNER_ENABLED:true}
# Logging pattern for the console # Logging pattern for the console
logging.pattern.console=${CONSOLE_LOG_PATTERN:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(%replace([%X{correlationId}]){'\\[\\]', ''}) %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}} logging.pattern.console=${CONSOLE_LOG_PATTERN:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(%replace([%X{correlationId}]){'\\[\\]', ''}) %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}
@@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -31,13 +32,17 @@ import java.nio.ByteBuffer;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import org.apache.fineract.avro.BulkMessageItemV1; import org.apache.fineract.avro.BulkMessageItemV1;
import org.apache.fineract.avro.generator.ByteBufferSerializable;
import org.apache.fineract.avro.loan.v1.LoanAccountDataV1; import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
import org.apache.fineract.infrastructure.core.service.DataEnricherProcessor;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent;
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
@@ -48,6 +53,7 @@ import org.apache.fineract.infrastructure.event.external.service.message.BulkMes
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializer;
import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializerFactory; import org.apache.fineract.infrastructure.event.external.service.serialization.serializer.BusinessEventSerializerFactory;
import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter; import org.apache.fineract.infrastructure.event.external.service.support.ByteBufferConverter;
import org.apache.fineract.investor.enricher.LoanAccountDataV1Enricher;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@@ -59,6 +65,9 @@ import org.mockito.junit.jupiter.MockitoExtension;
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
class ExternalEventServiceTest { class ExternalEventServiceTest {
public static final String DUMMY_EXTERNAL_OWNER_ID = "dummy-external-owner-id";
public static final String DUMMY_SETTLEMENT_DATE = "2021-01-01";
@Mock @Mock
private ExternalEventRepository repository; private ExternalEventRepository repository;
@Mock @Mock
@@ -72,12 +81,17 @@ class ExternalEventServiceTest {
@Mock @Mock
private EntityManager entityManager; private EntityManager entityManager;
@Mock
private LoanAccountDataV1Enricher loanAccountDataV1Enricher;
private ExternalEventService underTest; private ExternalEventService underTest;
@BeforeEach @BeforeEach
public void setUp() { public void setUp() {
lenient().when(loanAccountDataV1Enricher.isDataTypeSupported(any())).thenReturn(true);
DataEnricherProcessor dataEnricherProcessor = new DataEnricherProcessor(Optional.of(Arrays.asList(loanAccountDataV1Enricher)));
underTest = new ExternalEventService(repository, idempotencyKeyGenerator, serializerFactory, byteBufferConverter, underTest = new ExternalEventService(repository, idempotencyKeyGenerator, serializerFactory, byteBufferConverter,
bulkMessageItemFactory); bulkMessageItemFactory, dataEnricherProcessor);
underTest.setEntityManager(entityManager); underTest.setEntityManager(entityManager);
FineractPlatformTenant tenant = new FineractPlatformTenant(1L, "default", "Default Tenant", "Europe/Budapest", null); FineractPlatformTenant tenant = new FineractPlatformTenant(1L, "default", "Default Tenant", "Europe/Budapest", null);
ThreadLocalContextUtil.setTenant(tenant); ThreadLocalContextUtil.setTenant(tenant);
@@ -101,7 +115,9 @@ class ExternalEventServiceTest {
given(idempotencyKeyGenerator.generate(event)).willReturn(""); given(idempotencyKeyGenerator.generate(event)).willReturn("");
given(serializerFactory.create(event)).willReturn(eventSerializer); given(serializerFactory.create(event)).willReturn(eventSerializer);
given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class); given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class);
given(eventSerializer.serialize(event)).willThrow(IOException.class); ByteBufferSerializable byteBuffer = mock(LoanAccountDataV1.class);
given(eventSerializer.toAvroDTO(event)).willReturn(byteBuffer);
given(byteBuffer.toByteBuffer()).willThrow(new IOException(""));
// when & then // when & then
assertThatThrownBy(() -> underTest.postEvent(event)).isExactlyInstanceOf(RuntimeException.class); assertThatThrownBy(() -> underTest.postEvent(event)).isExactlyInstanceOf(RuntimeException.class);
} }
@@ -121,12 +137,16 @@ class ExternalEventServiceTest {
given(event.getType()).willReturn(eventType); given(event.getType()).willReturn(eventType);
given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey); given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey);
given(serializerFactory.create(event)).willReturn(eventSerializer); given(serializerFactory.create(event)).willReturn(eventSerializer);
LoanAccountDataV1 loanAccountData = new LoanAccountDataV1();
given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class); given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class);
given(eventSerializer.serialize(event)).willReturn(data); given(eventSerializer.toAvroDTO(event)).willReturn(loanAccountData);
given(byteBufferConverter.convert(any(ByteBuffer.class))).willReturn(data);
// when // when
underTest.postEvent(event); underTest.postEvent(event);
// then // then
verify(repository).save(externalEventArgumentCaptor.capture()); verify(repository).save(externalEventArgumentCaptor.capture());
verify(loanAccountDataV1Enricher).isDataTypeSupported(LoanAccountDataV1.class);
verify(loanAccountDataV1Enricher).enrich(loanAccountData);
ExternalEvent externalEvent = externalEventArgumentCaptor.getValue(); ExternalEvent externalEvent = externalEventArgumentCaptor.getValue();
assertThat(externalEvent.getIdempotencyKey()).isEqualTo(idempotencyKey); assertThat(externalEvent.getIdempotencyKey()).isEqualTo(idempotencyKey);
assertThat(externalEvent.getData()).isEqualTo(data); assertThat(externalEvent.getData()).isEqualTo(data);
@@ -171,14 +191,13 @@ class ExternalEventServiceTest {
String idempotencyKey = "key"; String idempotencyKey = "key";
BusinessEvent event = mock(BusinessEvent.class); BusinessEvent event = mock(BusinessEvent.class);
BusinessEventSerializer eventSerializer = mock(BusinessEventSerializer.class); BusinessEventSerializer eventSerializer = mock(BusinessEventSerializer.class);
byte[] data = new byte[0];
given(event.getType()).willReturn(eventType); given(event.getType()).willReturn(eventType);
given(event.getCategory()).willReturn(eventCategory); given(event.getCategory()).willReturn(eventCategory);
given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey); given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey);
given(serializerFactory.create(event)).willReturn(eventSerializer); given(serializerFactory.create(event)).willReturn(eventSerializer);
given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class); given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class);
given(eventSerializer.serialize(event)).willReturn(data); given(eventSerializer.toAvroDTO(event)).willReturn(new LoanAccountDataV1());
// when // when
underTest.postEvent(event); underTest.postEvent(event);
// then // then
@@ -198,14 +217,13 @@ class ExternalEventServiceTest {
String idempotencyKey = "key"; String idempotencyKey = "key";
BusinessEvent event = mock(BusinessEvent.class); BusinessEvent event = mock(BusinessEvent.class);
BusinessEventSerializer eventSerializer = mock(BusinessEventSerializer.class); BusinessEventSerializer eventSerializer = mock(BusinessEventSerializer.class);
byte[] data = new byte[0];
given(event.getType()).willReturn(eventType); given(event.getType()).willReturn(eventType);
given(event.getCategory()).willReturn(eventCategory); given(event.getCategory()).willReturn(eventCategory);
given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey); given(idempotencyKeyGenerator.generate(event)).willReturn(idempotencyKey);
given(serializerFactory.create(event)).willReturn(eventSerializer); given(serializerFactory.create(event)).willReturn(eventSerializer);
given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class); given(eventSerializer.getSupportedSchema()).will(invocation -> LoanAccountDataV1.class);
given(eventSerializer.serialize(event)).willReturn(data); given(eventSerializer.toAvroDTO(event)).willReturn(new LoanAccountDataV1());
// when // when
underTest.postEvent(event); underTest.postEvent(event);
// then // then
@@ -103,7 +103,6 @@ public class LoanRepaymentBusinessEventSerializerTest {
LocalDate loanInstallmentRepaymentDueDate = DateUtils.getBusinessLocalDate().plusDays(1); LocalDate loanInstallmentRepaymentDueDate = DateUtils.getBusinessLocalDate().plusDays(1);
Loan loanForProcessing = Mockito.mock(Loan.class); Loan loanForProcessing = Mockito.mock(Loan.class);
LoanProduct loanProduct = Mockito.mock(LoanProduct.class);
LoanSummary loanSummary = Mockito.mock(LoanSummary.class); LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
MonetaryCurrency loanCurrency = Mockito.mock(MonetaryCurrency.class); MonetaryCurrency loanCurrency = Mockito.mock(MonetaryCurrency.class);