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

Reply via email to