This is an automated email from the ASF dual-hosted git repository.
Aman-Mittal pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/fineract-consumer-facing.git
from 0196feb Merge pull request #47 from apache/notifications
add dd364f6 - beneficiaries implemented on the backend and frontend -
centralized some ABAC checks for less manual code - fixed race condition in
refresh token logic - fixed device fingerprint resize bug - fixed Fineract’s
openapi spec BigDecimal issue - fixed duplicated exception names - added
constants for sonarqube issues
add fc7b3b0 - added a comment to explain fineract account status numbers
- added read-only transactions to beneficiary lookups to keep reads consistent
- changed account type from string to enum to remove hand-written parsing -
renamed step-up constants to action labels to stop them looking like urls -
added separate query-side entities and enums to keep reads and writes fully
split - added a shared fineract error helper to remove duplicated error
handling - changed beneficiary obje [...]
add 65a9d40 - migrated JWTDenyList to Valkey for distributed caching
add 4501284 - migrated OTPs to valkey to handle multinode setups - added
l1/l2 (Caffeine/Valkey) cache for abac resource check
new 7a49aa3 Merge pull request #39 from edk12564/main
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
consumer/build.gradle | 21 +-
consumer/compose.yaml | 13 +
.../api/AuthenticationCommandController.java | 43 +-
.../command/data/AuthenticationConstants.java | 3 +-
.../authentication/command/data/LogoutCommand.java | 3 +
.../command/data/SessionCommandData.java | 4 -
.../service/AuthenticationCommandServiceImpl.java | 93 +--
.../api/BeneficiariesCommandController.java | 133 +++++
.../data/BeneficiaryChallengeCommandData.java} | 5 +-
.../command/data/BeneficiaryCommandData.java} | 19 +-
.../command/data/BeneficiaryConstants.java} | 16 +-
.../data/ConfirmAddBeneficiaryCommand.java} | 15 +-
.../data/ConfirmAddBeneficiaryCommandRequest.java} | 24 +-
.../data/ConfirmUpdateBeneficiaryCommand.java} | 12 +-
.../ConfirmUpdateBeneficiaryCommandRequest.java} | 14 +-
.../data/InitiateAddBeneficiaryCommand.java} | 17 +-
.../InitiateAddBeneficiaryCommandRequest.java} | 26 +-
.../data/InitiateUpdateBeneficiaryCommand.java} | 14 +-
.../InitiateUpdateBeneficiaryCommandRequest.java} | 16 +-
.../command/data/ResolvedBeneficiaryAccount.java} | 9 +-
.../beneficiaries/command/domain/Beneficiary.java | 113 ++++
.../command/domain/BeneficiaryAccountType.java} | 8 +-
.../BeneficiaryAccountInvalidException.java} | 11 +-
.../BeneficiaryDuplicateNameException.java} | 11 +-
.../exception/BeneficiaryNotFoundException.java} | 11 +-
.../BeneficiaryStepUpInvalidException.java} | 9 +-
.../BeneficiaryUpstreamUnavailableException.java} | 11 +-
.../repository/BeneficiaryCommandRepository.java} | 12 +-
.../service/BeneficiariesCommandService.java | 41 ++
.../service/BeneficiariesCommandServiceImpl.java | 332 +++++++++++
.../query/api/BeneficiariesQueryController.java | 53 ++
.../query/data/BeneficiaryQueryData.java} | 18 +-
.../query/data/BeneficiaryTemplateQueryData.java} | 8 +-
.../query/domain/BeneficiaryAccountType.java} | 8 +-
.../query/domain/BeneficiaryQueryEntity.java | 108 ++++
.../repository/BeneficiaryQueryRepository.java} | 14 +-
.../query/service/BeneficiariesQueryService.java} | 20 +-
.../service/BeneficiariesQueryServiceImpl.java | 87 +++
.../infrastructure/access/data/ActionPolicies.java | 83 +++
.../access/data/ActionPolicy.java} | 14 +-
.../access/data/ConsumerAction.java} | 34 +-
.../data/OwnedAccounts.java} | 10 +-
.../access/data/ResourceType.java} | 8 +-
.../exception/AccessKycRequiredException.java} | 10 +-
.../exception/AccessPolicyMissingException.java} | 10 +-
.../AccessScopeInsufficientException.java} | 10 +-
.../access/filter/DeviceFingerprintFilter.java | 102 ++++
.../access/service/AccessPolicyEvaluator.java | 82 +++
.../infrastructure/access/service/JwtDenylist.java | 64 +++
.../access/service/OwnedAccountsCache.java | 129 +++++
.../configs/AuthenticationProperties.java | 3 +-
.../consumer/infrastructure/configs/JwtConfig.java | 24 +-
.../infrastructure/configs/OpenApiConfig.java | 11 +-
.../infrastructure/configs/SecurityConfig.java | 21 +-
.../{FineractHeaders.java => FineractCaller.java} | 26 +-
.../infrastructure/jwt/{ => data}/IssuedJwt.java | 2 +-
.../infrastructure/jwt/{ => data}/JwtClaims.java | 4 +-
.../jwt/{ => service}/JwtIssuer.java | 5 +-
.../infrastructure/stepup/StepUpTokenService.java | 11 +-
.../infrastructure/web/AccessPolicyEvaluator.java | 64 ---
.../{ConsumerHeaders.java => EmailMasking.java} | 20 +-
.../infrastructure/web/UserClientResolver.java | 5 +
....java => LoanCommandAccessDeniedException.java} | 4 +-
...tion.java => LoanCommandNotFoundException.java} | 4 +-
...> LoanCommandUpstreamUnavailableException.java} | 4 +-
.../command/service/LoansCommandServiceImpl.java | 75 +--
.../loans/query/api/LoansQueryController.java | 32 +-
.../data/LoanApplicationTemplateQueryData.java | 2 -
...on.java => LoanQueryAccessDeniedException.java} | 6 +-
...eption.java => LoanQueryNotFoundException.java} | 4 +-
... => LoanQueryUpstreamUnavailableException.java} | 4 +-
.../loans/query/service/LoansQueryService.java | 19 +-
.../loans/query/service/LoansQueryServiceImpl.java | 114 ++--
.../consumer/otp/command/data/OtpConstants.java | 1 +
.../consumer/otp/command/data/PendingOtp.java | 5 -
.../command/repository/OtpCommandRepository.java | 30 +-
.../otp/command/service/OtpCommandServiceImpl.java | 27 +-
.../service/RegistrationCommandServiceImpl.java | 10 +-
...va => SavingsCommandAccessDeniedException.java} | 4 +-
.../command/service/SavingsCommandServiceImpl.java | 44 +-
.../savings/query/api/SavingsQueryController.java | 23 +-
.../data/SavingsApplicationTemplateQueryData.java | 2 -
...java => SavingsQueryAccessDeniedException.java} | 6 +-
.../savings/query/service/SavingsQueryService.java | 13 +-
.../query/service/SavingsQueryServiceImpl.java | 71 +--
.../transfers/command/data/TransferConstants.java | 2 -
...TransferBeneficiaryLimitExceededException.java} | 8 +-
.../service/TransfersCommandServiceImpl.java | 60 +-
.../user/query/data/UserCredentialsQueryData.java | 2 +-
.../consumer/user/query/data/UserQueryData.java | 2 +-
.../domain/UserQueryEntity.java} | 42 +-
.../user/{command => query}/domain/UserStatus.java | 2 +-
.../user/query/repository/UserQueryRepository.java | 10 +-
consumer/src/main/resources/application.properties | 11 +-
...rs-table.yaml => 003-create-beneficiaries.yaml} | 55 +-
.../db/changelog/db.changelog-master.yaml | 2 +
.../AuthenticationCommandServiceImplTest.java | 107 +++-
.../BeneficiariesCommandServiceImplTest.java | 630 +++++++++++++++++++++
.../service/BeneficiariesQueryServiceImplTest.java | 178 ++++++
.../cucumber/clients/AuthenticationClient.java | 26 +-
.../cucumber/helpers/ConsumerApiClientFactory.java | 52 ++
.../consumer/cucumber/helpers/FineractSeeder.java | 25 +-
.../consumer/cucumber/helpers/LoginHelper.java | 29 +-
.../consumer/cucumber/steps/AbacDenialSteps.java | 104 ++++
.../cucumber/steps/BeneficiariesSteps.java | 264 +++++++++
.../consumer/cucumber/steps/LoansSteps.java | 22 +-
.../consumer/cucumber/steps/LoginSteps.java | 57 +-
.../consumer/cucumber/steps/SavingsSteps.java | 22 +-
.../consumer/cucumber/steps/TransfersSteps.java | 13 +-
.../access/filter/DeviceFingerprintFilterTest.java | 154 +++++
.../access/service/AccessPolicyEvaluatorTest.java | 241 ++++++++
.../access/service/JwtDenylistTest.java | 108 ++++
.../access/service/OwnedAccountsCacheTest.java | 199 +++++++
.../jwt/{ => service}/JwtIssuerTest.java | 8 +-
.../infrastructure/web/EmailMaskingTest.java | 57 ++
.../service/LoansCommandServiceImplTest.java | 68 ++-
.../query/service/LoansQueryServiceImplTest.java | 65 ++-
.../repository/OtpCommandRepositoryTest.java | 88 +++
.../command/service/OtpCommandServiceImplTest.java | 149 +++++
.../service/SavingsCommandServiceImplTest.java | 27 +-
.../query/service/SavingsQueryServiceImplTest.java | 48 +-
.../service/TransfersCommandServiceImplTest.java | 210 +++++--
.../query/service/UserQueryServiceImplTest.java | 2 +-
.../test/resources/features/abac-denial.feature} | 22 +-
.../test/resources/features/beneficiaries.feature | 48 ++
consumer/src/test/resources/features/login.feature | 11 +-
frontend/playwright/tests/transfers.spec.ts | 3 +-
frontend/public/i18n/en.json | 51 +-
frontend/public/i18n/hi.json | 51 +-
frontend/src/app/app.routes.ts | 7 +
frontend/src/app/core/auth/auth.service.ts | 28 +-
frontend/src/app/core/auth/device-fingerprint.ts | 30 +-
.../src/app/core/interceptors/auth.interceptor.ts | 14 +-
.../src/app/core/interceptors/error.interceptor.ts | 8 +
.../beneficiaries/beneficiaries.component.ts | 452 +++++++++++++++
.../beneficiaries.store.spec.ts} | 62 +-
.../features/beneficiaries/beneficiaries.store.ts | 88 +++
.../src/app/features/loans/loan-apply.component.ts | 1 -
.../src/app/features/loans/loans-list.component.ts | 5 -
.../app/features/savings/savings-list.component.ts | 5 -
frontend/src/app/layout/shell.component.ts | 3 +
141 files changed, 5681 insertions(+), 988 deletions(-)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/command/api/BeneficiariesCommandController.java
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/data/TransferChallengeCommandData.java
=> beneficiaries/command/data/BeneficiaryChallengeCommandData.java} (91%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/query/data/UserCredentialsQueryData.java
=> beneficiaries/command/data/BeneficiaryCommandData.java} (74%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{infrastructure/stepup/StepUpConstants.java
=> beneficiaries/command/data/BeneficiaryConstants.java} (69%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/data/ConfirmTransferCommand.java
=> beneficiaries/command/data/ConfirmAddBeneficiaryCommand.java} (74%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/data/ConfirmTransferCommandRequest.java
=> beneficiaries/command/data/ConfirmAddBeneficiaryCommandRequest.java} (72%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{savings/command/data/ConfirmSavingsChargePaymentCommand.java
=> beneficiaries/command/data/ConfirmUpdateBeneficiaryCommand.java} (82%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{savings/command/data/ConfirmSavingsChargePaymentCommandRequest.java
=> beneficiaries/command/data/ConfirmUpdateBeneficiaryCommandRequest.java}
(82%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/data/ConfirmTransferCommand.java
=> beneficiaries/command/data/InitiateAddBeneficiaryCommand.java} (73%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/data/ConfirmTransferCommandRequest.java
=> beneficiaries/command/data/InitiateAddBeneficiaryCommandRequest.java} (73%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/query/data/UserCredentialsQueryData.java
=> beneficiaries/command/data/InitiateUpdateBeneficiaryCommand.java} (80%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{savings/command/data/ConfirmSavingsChargePaymentCommandRequest.java
=> beneficiaries/command/data/InitiateUpdateBeneficiaryCommandRequest.java}
(80%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/command/data/LoanApplicationCommandData.java
=> beneficiaries/command/data/ResolvedBeneficiaryAccount.java} (85%)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/command/domain/Beneficiary.java
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/command/domain/UserStatus.java
=> beneficiaries/command/domain/BeneficiaryAccountType.java} (86%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/command/exception/LoanChargePaymentNotFoundException.java
=> beneficiaries/command/exception/BeneficiaryAccountInvalidException.java}
(72%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{authentication/command/exception/InvalidCredentialsException.java
=> beneficiaries/command/exception/BeneficiaryDuplicateNameException.java}
(71%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/query/exception/LoanProductNotFoundException.java
=> beneficiaries/command/exception/BeneficiaryNotFoundException.java} (74%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/exception/TransferStepUpInvalidException.java
=> beneficiaries/command/exception/BeneficiaryStepUpInvalidException.java}
(77%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/command/exception/LoanChargePaymentStepUpInvalidException.java
=>
beneficiaries/command/exception/BeneficiaryUpstreamUnavailableException.java}
(71%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{authentication/command/repository/RefreshTokenCommandRepository.java
=> beneficiaries/command/repository/BeneficiaryCommandRepository.java} (67%)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/command/service/BeneficiariesCommandService.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/command/service/BeneficiariesCommandServiceImpl.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/query/api/BeneficiariesQueryController.java
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/query/data/UserCredentialsQueryData.java
=> beneficiaries/query/data/BeneficiaryQueryData.java} (74%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{otp/command/data/OtpDestination.java
=> beneficiaries/query/data/BeneficiaryTemplateQueryData.java} (84%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/command/domain/UserStatus.java
=> beneficiaries/query/domain/BeneficiaryAccountType.java} (86%)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/query/domain/BeneficiaryQueryEntity.java
copy
consumer/src/main/java/org/apache/fineract/consumer/{authentication/command/repository/RefreshTokenCommandRepository.java
=> beneficiaries/query/repository/BeneficiaryQueryRepository.java} (56%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{transfers/command/service/TransfersCommandService.java
=> beneficiaries/query/service/BeneficiariesQueryService.java} (56%)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/beneficiaries/query/service/BeneficiariesQueryServiceImpl.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/access/data/ActionPolicies.java
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/command/data/LoanChargePaymentCommandData.java
=> infrastructure/access/data/ActionPolicy.java} (68%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{authentication/command/data/LoginCommand.java
=> infrastructure/access/data/ConsumerAction.java} (61%)
copy
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/{exception/ConsumerApiError.java
=> access/data/OwnedAccounts.java} (83%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{user/command/domain/UserStatus.java
=> infrastructure/access/data/ResourceType.java} (87%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{otp/command/exception/OtpDeliveryFailedException.java
=> infrastructure/access/exception/AccessKycRequiredException.java} (73%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/query/exception/LoanProductNotFoundException.java
=> infrastructure/access/exception/AccessPolicyMissingException.java} (75%)
copy
consumer/src/main/java/org/apache/fineract/consumer/{loans/query/exception/LoanUpstreamUnavailableException.java
=> infrastructure/access/exception/AccessScopeInsufficientException.java} (72%)
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/access/filter/DeviceFingerprintFilter.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/access/service/AccessPolicyEvaluator.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/access/service/JwtDenylist.java
create mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/access/service/OwnedAccountsCache.java
copy
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/fineractclient/{FineractHeaders.java
=> FineractCaller.java} (53%)
rename
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/jwt/{ =>
data}/IssuedJwt.java (95%)
rename
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/jwt/{ =>
data}/JwtClaims.java (86%)
rename
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/jwt/{ =>
service}/JwtIssuer.java (91%)
delete mode 100644
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/web/AccessPolicyEvaluator.java
copy
consumer/src/main/java/org/apache/fineract/consumer/infrastructure/web/{ConsumerHeaders.java
=> EmailMasking.java} (65%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/command/exception/{LoanAccessDeniedException.java
=> LoanCommandAccessDeniedException.java} (90%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/command/exception/{LoanNotFoundException.java
=> LoanCommandNotFoundException.java} (90%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/command/exception/{LoanUpstreamUnavailableException.java
=> LoanCommandUpstreamUnavailableException.java} (88%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/query/exception/{LoanAccessDeniedException.java
=> LoanQueryAccessDeniedException.java} (88%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/query/exception/{LoanNotFoundException.java
=> LoanQueryNotFoundException.java} (90%)
rename
consumer/src/main/java/org/apache/fineract/consumer/loans/query/exception/{LoanUpstreamUnavailableException.java
=> LoanQueryUpstreamUnavailableException.java} (88%)
rename
consumer/src/main/java/org/apache/fineract/consumer/savings/command/exception/{SavingsAccountAccessDeniedException.java
=> SavingsCommandAccessDeniedException.java} (91%)
rename
consumer/src/main/java/org/apache/fineract/consumer/savings/query/exception/{SavingsAccountAccessDeniedException.java
=> SavingsQueryAccessDeniedException.java} (87%)
copy
consumer/src/main/java/org/apache/fineract/consumer/transfers/command/exception/{TransferAccessDeniedException.java
=> TransferBeneficiaryLimitExceededException.java} (78%)
copy
consumer/src/main/java/org/apache/fineract/consumer/user/{command/domain/User.java
=> query/domain/UserQueryEntity.java} (63%)
copy consumer/src/main/java/org/apache/fineract/consumer/user/{command =>
query}/domain/UserStatus.java (93%)
copy
consumer/src/main/resources/db/changelog/changes/{001-create-users-table.yaml
=> 003-create-beneficiaries.yaml} (59%)
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/beneficiaries/command/service/BeneficiariesCommandServiceImplTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/beneficiaries/query/service/BeneficiariesQueryServiceImplTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/cucumber/helpers/ConsumerApiClientFactory.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/cucumber/steps/AbacDenialSteps.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/cucumber/steps/BeneficiariesSteps.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/access/filter/DeviceFingerprintFilterTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/access/service/AccessPolicyEvaluatorTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/access/service/JwtDenylistTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/access/service/OwnedAccountsCacheTest.java
rename
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/jwt/{ =>
service}/JwtIssuerTest.java (94%)
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/infrastructure/web/EmailMaskingTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/otp/command/repository/OtpCommandRepositoryTest.java
create mode 100644
consumer/src/test/java/org/apache/fineract/consumer/otp/command/service/OtpCommandServiceImplTest.java
copy consumer/{Dockerfile => src/test/resources/features/abac-denial.feature}
(60%)
create mode 100644 consumer/src/test/resources/features/beneficiaries.feature
create mode 100644
frontend/src/app/features/beneficiaries/beneficiaries.component.ts
copy frontend/src/app/features/{transfers/transfers.store.spec.ts =>
beneficiaries/beneficiaries.store.spec.ts} (53%)
create mode 100644
frontend/src/app/features/beneficiaries/beneficiaries.store.ts