From ad4fa563dec4a59a69b2dacd0d4ab65bc9a7f898 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Thu, 7 Jul 2022 00:23:56 +0200 Subject: [PATCH] Auditor fix - Detached Auditor entity was not persisted during cascade persisting --- .../infrastructure/core/config/JPAConfig.java | 3 +-- .../core/domain/AbstractAuditableCustom.java | 24 +++++++------------ .../core/domain/AuditorAwareImpl.java | 18 +++++++------- .../domain/ProvisioningCriteria.java | 4 ++-- .../domain/LoanRepaymentScheduleHistory.java | 15 +++++------- ...heduleHistoryWritePlatformServiceImpl.java | 5 ++-- 6 files changed, 29 insertions(+), 40 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JPAConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JPAConfig.java index 841dea99d..b9d2afefb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JPAConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/JPAConfig.java @@ -25,7 +25,6 @@ import org.apache.fineract.infrastructure.core.persistence.DatabaseSelectingPers import org.apache.fineract.infrastructure.core.persistence.ExtendedJpaTransactionManager; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; -import org.apache.fineract.useradministration.domain.AppUser; import org.eclipse.persistence.config.PersistenceUnitProperties; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer; @@ -96,7 +95,7 @@ public class JPAConfig extends JpaBaseConfiguration { } @Bean - public AuditorAware auditorAware() { + public AuditorAware auditorAware() { return new AuditorAwareImpl(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java index 4bb109765..b8e7f8d61 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java @@ -22,13 +22,9 @@ import java.time.Instant; import java.util.Date; import java.util.Optional; import javax.persistence.Column; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import javax.persistence.MappedSuperclass; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.data.domain.Auditable; import org.springframework.data.jpa.domain.AbstractAuditable; @@ -44,33 +40,31 @@ import org.springframework.data.jpa.domain.AbstractAuditable; * the type of the auditing type's identifier */ @MappedSuperclass -public abstract class AbstractAuditableCustom extends AbstractPersistableCustom implements Auditable { +public abstract class AbstractAuditableCustom extends AbstractPersistableCustom implements Auditable { private static final long serialVersionUID = 141481953116476081L; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "createdby_id") - private AppUser createdBy; + @Column(name = "createdby_id") + private Long createdBy; @Column(name = "created_date") @Temporal(TemporalType.TIMESTAMP) private Date createdDate; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "lastmodifiedby_id") - private AppUser lastModifiedBy; + @Column(name = "lastmodifiedby_id") + private Long lastModifiedBy; @Column(name = "lastmodified_date") @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Override - public Optional getCreatedBy() { + public Optional getCreatedBy() { return Optional.ofNullable(this.createdBy); } @Override - public void setCreatedBy(final AppUser createdBy) { + public void setCreatedBy(final Long createdBy) { this.createdBy = createdBy; } @@ -85,12 +79,12 @@ public abstract class AbstractAuditableCustom extends AbstractPersistableCustom } @Override - public Optional getLastModifiedBy() { + public Optional getLastModifiedBy() { return Optional.ofNullable(this.lastModifiedBy); } @Override - public void setLastModifiedBy(final AppUser lastModifiedBy) { + public void setLastModifiedBy(final Long lastModifiedBy) { this.lastModifiedBy = lastModifiedBy; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AuditorAwareImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AuditorAwareImpl.java index e95aef17d..46ef34de1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AuditorAwareImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AuditorAwareImpl.java @@ -27,29 +27,29 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -public class AuditorAwareImpl implements AuditorAware { +public class AuditorAwareImpl implements AuditorAware { @Autowired private AppUserRepository userRepository; @Override - public Optional getCurrentAuditor() { - Optional currentUser; + public Optional getCurrentAuditor() { + Optional currentUserId; final SecurityContext securityContext = SecurityContextHolder.getContext(); if (securityContext != null) { final Authentication authentication = securityContext.getAuthentication(); if (authentication != null) { - currentUser = Optional.ofNullable((AppUser) authentication.getPrincipal()); + currentUserId = Optional.ofNullable(((AppUser) authentication.getPrincipal()).getId()); } else { - currentUser = retrieveSuperUser(); + currentUserId = retrieveSuperUser(); } } else { - currentUser = retrieveSuperUser(); + currentUserId = retrieveSuperUser(); } - return currentUser; + return currentUserId; } - private Optional retrieveSuperUser() { - return this.userRepository.findById(Long.valueOf("1")); + private Optional retrieveSuperUser() { + return Optional.of(1L); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java index 9a3ee2689..21db079b3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/domain/ProvisioningCriteria.java @@ -69,9 +69,9 @@ public class ProvisioningCriteria extends AbstractAuditableCustom { public ProvisioningCriteria(String criteriaName, AppUser createdBy, ZonedDateTime createdDate, AppUser lastModifiedBy, ZonedDateTime lastModifiedDate) { this.criteriaName = criteriaName; - setCreatedBy(createdBy); + setCreatedBy(createdBy.getId()); setCreatedDate(Instant.ofEpochMilli(createdDate.toInstant().toEpochMilli())); - setLastModifiedBy(lastModifiedBy); + setLastModifiedBy(lastModifiedBy.getId()); setLastModifiedDate(Instant.ofEpochMilli(lastModifiedDate.toInstant().toEpochMilli())); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java index 4e2db4a17..34fc4befe 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java @@ -31,7 +31,6 @@ import javax.persistence.TemporalType; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; -import org.apache.fineract.useradministration.domain.AppUser; @Entity @Table(name = "m_loan_repayment_schedule_history") @@ -72,13 +71,11 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { @Column(name = "created_date") private Date createdOnDate; - @ManyToOne - @JoinColumn(name = "createdby_id") - private AppUser createdByUser; + @Column(name = "createdby_id") + private Long createdByUser; - @ManyToOne - @JoinColumn(name = "lastmodifiedby_id") - private AppUser lastModifiedByUser; + @Column(name = "lastmodifiedby_id") + private Long lastModifiedByUser; @Temporal(TemporalType.DATE) @Column(name = "lastmodified_date") @@ -98,7 +95,7 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { private LoanRepaymentScheduleHistory(final Loan loan, final LoanRescheduleRequest loanRescheduleRequest, final Integer installmentNumber, final Date fromDate, final Date dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, final Date createdOnDate, - final AppUser createdByUser, final AppUser lastModifiedByUser, final Date lastModifiedOnDate, final Integer version) { + final Long createdByUser, final Long lastModifiedByUser, final Date lastModifiedOnDate, final Integer version) { this.loan = loan; this.loanRescheduleRequest = loanRescheduleRequest; @@ -122,7 +119,7 @@ public class LoanRepaymentScheduleHistory extends AbstractPersistableCustom { public static LoanRepaymentScheduleHistory instance(final Loan loan, final LoanRescheduleRequest loanRescheduleRequest, final Integer installmentNumber, final Date fromDate, final Date dueDate, final BigDecimal principal, final BigDecimal interestCharged, final BigDecimal feeChargesCharged, final BigDecimal penaltyCharges, final Date createdOnDate, - final AppUser createdByUser, final AppUser lastModifiedByUser, final Date lastModifiedOnDate, final Integer version) { + final Long createdByUser, final Long lastModifiedByUser, final Date lastModifiedOnDate, final Integer version) { return new LoanRepaymentScheduleHistory(loan, loanRescheduleRequest, installmentNumber, fromDate, dueDate, principal, interestCharged, feeChargesCharged, penaltyCharges, createdOnDate, createdByUser, lastModifiedByUser, lastModifiedOnDate, diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java index f926b05fb..70d94c251 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleHistoryWritePlatformServiceImpl.java @@ -29,7 +29,6 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleIns import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanRepaymentScheduleHistory; import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanRepaymentScheduleHistoryRepository; import org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -79,8 +78,8 @@ public class LoanScheduleHistoryWritePlatformServiceImpl implements LoanSchedule createdOnDate = Date.from(repaymentScheduleInstallment.getCreatedDate().get()); // NOSONAR } - final AppUser createdByUser = repaymentScheduleInstallment.getCreatedBy().orElse(null); - final AppUser lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy().orElse(null); + final Long createdByUser = repaymentScheduleInstallment.getCreatedBy().orElse(null); + final Long lastModifiedByUser = repaymentScheduleInstallment.getLastModifiedBy().orElse(null); Date lastModifiedOnDate = null;