From 14f6d5656b3b52cf204577404b6953d663aeea66 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 11 Sep 2023 16:11:55 +0300 Subject: [PATCH] account-service http://jira.mfd.msk:8088/browse/CLS-509 InformationAccount --- .../InformationAccountValidationConfig.java | 37 ++++++++++++++++++- .../service/InformationAccountService.java | 11 +++++- .../InformationAccountServiceTest.java | 5 ++- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java index 37d2712f5..d03888fb5 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java @@ -2,21 +2,30 @@ package ru.spcex.clearing.account.config.validation; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; import java.util.Collection; import java.util.Map; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; @@ -33,6 +42,8 @@ public class InformationAccountValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_InformationAccount); + addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); + addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", InformationAccountNewRequest::getCompanyId, @@ -52,9 +63,33 @@ public class InformationAccountValidationConfig { ); if (infoAccounts.isEmpty()) return null; return AccountError.InfoAccountAlreadyExist; - }) + }), + DictionaryPresentRule.instance("status", InformationAccountNewRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false), + DictionaryPresentRule.instance("accountType", InformationAccountNewRequest::getAccountType, + IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, + AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false), + new SameInfoAccountValidation() ); }; } + static class SameInfoAccountValidation implements IValidationRule> { + @Override + public Optional validate(ImdgValidationContext context) { + InformationAccountNewRequest req = context.getValidatedObject(); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + String accountType = AccountType.Info.getKey(); // or req.getAccountType() + Account existAccount = accountImdg.getFirstObjectByFieldValues(Map.of( + "account", req.getAccount(), + "accountType", accountType, + "status", ServiceStatus.Active.getKey() + )); + if (existAccount != null) { + return of(AccountError.AccountAlreadyExist, existAccount.getAccount()); + } + return empty(); + } + } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 4cd49ffbb..d559fc1b2 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -22,6 +22,7 @@ import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountType; @@ -50,6 +51,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali private final Logger log = LoggerFactory.getLogger(getClass()); private final KafkaSender kafkaSender; private final IMessageResolver messageResolver; + private final UserRoleVerification userRoleVerification; private final ImdgProvider imdgProvider; private final ValidationHelper validationHelper; private final AccountService accountService; @@ -68,6 +70,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali Producer kafkaResponseQueue, KafkaSender kafkaSender, IMessageResolver messageResolver, + UserRoleVerification userRoleVerification, ImdgProvider imdgProvider, ValidationHelper validationHelper, AccountService accountService, @@ -77,6 +80,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali super(kafkaQueue, kafkaResponseQueue); this.kafkaSender = kafkaSender; this.messageResolver = messageResolver; + this.userRoleVerification = userRoleVerification; this.imdgProvider = imdgProvider; this.validationHelper = validationHelper; this.accountService = accountService; @@ -104,7 +108,9 @@ public class InformationAccountService extends QueueConsumer implements Initiali public RequestInfoUpdate informationAccountNew(BaseRequest userRequest) { log.debug("InformationAccountNewRequest received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator); + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; InformationAccountNewRequest req = userRequest.getRequestPayload(); @@ -128,7 +134,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali Instant now = Instant.now(); Account account = new Account(); - account.setAccount(accountValue); + account.setAccount(req.getAccount()); account.setAccountType(AccountType.Info.getKey()); if (req.getStatus() == null) { account.setStatus(WorkflowStatus.Active.getKey()); @@ -139,6 +145,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali account.setCompanyId(req.getCompanyId()); account.setCreated(now); account.setUpdated(now); + requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true); if (requestInfoUpdate != null) return requestInfoUpdate; diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java index 321b0ae0c..664a6b550 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.mock.mockito.SpyBean; @@ -31,6 +32,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccoun import ru.spcex.clearing.test.TestObjectCreator; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -199,8 +201,9 @@ class InformationAccountServiceTest { accountInfo.setCompanyId(account.getCompanyId()); accountInfoImdg.insert(accountInfo); } + UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class); InformationAccountService infoAccSvc=new InformationAccountService(null,null,null, - null, imdgProvider, null, null, null, null); + null, userRoleVerification, imdgProvider, null, null, null, null); Long n = infoAccSvc.accountNextId(); Assertions.assertEquals(13L, n); n = infoAccSvc.accountNextId();