From 54e828432dbc88cd773d4abfc14c103d3dc8d7f1 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 12:48:04 +0300 Subject: [PATCH] Account: update and block request --- .../validation/AccountValidationConfig.java | 52 ++++---- .../account/service/AccountService.java | 117 +++++++++++++----- .../platform/messaging/domain/Consts.java | 6 +- ...va => AccountCorrespondentNewRequest.java} | 2 +- ...=> AccountCorrespondentUpdateRequest.java} | 2 +- 5 files changed, 118 insertions(+), 61 deletions(-) rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountNewRequest.java => AccountCorrespondentNewRequest.java} (95%) rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountUpdateRequest.java => AccountCorrespondentUpdateRequest.java} (95%) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index d545be8ab..0f8ef132d 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -7,8 +7,8 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.AccountTypeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; @@ -35,27 +35,27 @@ import java.util.function.Function; @Configuration public class AccountValidationConfig { - @Bean("accountNewRequestValidator") - public Function accountNewRequestValidator( + @Bean("accountCorrespondentNewRequestValidator") + public Function accountCorrespondentNewRequestValidator( Map> imdgForValidation ) { - return accountNewRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountNewRequest); + return accountCorrespondentNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountCorrespondentNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", - AccountNewRequest::getCompanyId, + AccountCorrespondentNewRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, AccountError.CompanyNotFound, company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), FieldRequiredRule.instance("account", - AccountNewRequest::getAccount, + AccountCorrespondentNewRequest::getAccount, AccountError.RequiredFieldEmpty, accountValue -> { Imdg accountImdg = context.obtainMap( @@ -70,7 +70,7 @@ public class AccountValidationConfig { return AccountError.AccountAlreadyExist; }), FieldRequiredRule.instance("status", - AccountNewRequest::getStatus, + AccountCorrespondentNewRequest::getStatus, AccountError.RequiredFieldEmpty, false, statusValue -> { @@ -79,12 +79,12 @@ public class AccountValidationConfig { return AccountError.WrongFieldValue; }), EnumPresentRule.instance("accountType", - AccountNewRequest::getAccountType, + AccountCorrespondentNewRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountNewRequest::getAccountType, + AccountCorrespondentNewRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -97,32 +97,32 @@ public class AccountValidationConfig { }; } - @Bean("accountUpdateRequestValidator") - public Function accountUpdateRequestValidator( + @Bean("accountCorrespondentUpdateRequestValidator") + public Function accountCorrespondentUpdateRequestValidator( Map> imdgForValidation ) { - return accountUpdateRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountUpdateRequest); + return accountCorrespondentUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountCorrespondentUpdateRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("id", - AccountUpdateRequest::getId, + AccountCorrespondentUpdateRequest::getId, IMDGDistributedNames.Map_Account, Account.class, AccountError.RequiredFieldEmpty, AccountError.AccountNotFound, account -> { - String statusFromRequest = accountUpdateRequest.getStatus(); + String statusFromRequest = accountCorrespondentUpdateRequest.getStatus(); if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus())) return AccountError.WrongFieldValue; return null; }), IdPresentRule.instance("companyId", - AccountUpdateRequest::getCompanyId, + AccountCorrespondentUpdateRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, @@ -130,22 +130,22 @@ public class AccountValidationConfig { false, company -> { IErrorEnumId error = WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; - error = Objects.equals(company.getId(), accountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; + error = Objects.equals(company.getId(), accountCorrespondentUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; return error; }), EnumPresentRule.instance("status", - AccountUpdateRequest::getStatus, + AccountCorrespondentUpdateRequest::getStatus, AccountStatus.values(), false, AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), EnumPresentRule.instance("accountType", - AccountUpdateRequest::getAccountType, + AccountCorrespondentUpdateRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountUpdateRequest::getAccountType, + AccountCorrespondentUpdateRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -158,8 +158,8 @@ public class AccountValidationConfig { }; } - @Bean("accountBlockRequestValidator") - public Function accountBlockRequestValidator( + @Bean("accountCorrespondentBlockRequestValidator") + public Function accountCorrespondentBlockRequestValidator( Map> imdgForValidation ) { return accountDeleteRequest -> { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 96edca925..5c6f56581 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -14,8 +14,8 @@ import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; @@ -27,6 +27,7 @@ import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.imdg.api.Imdg; @@ -41,6 +42,7 @@ import ru.spcex.platform.utils.validation.IValidator; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.function.Function; @Service @@ -53,8 +55,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { private final IMessageResolver messageResolver; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; - private final Function accountNewRequestValidator; - private final Function accountUpdateRequestValidator; + private final Function accountNewRequestValidator; + private final Function accountUpdateRequestValidator; private final Function accountBlockRequestValidator; @Autowired @@ -64,11 +66,11 @@ public class AccountService extends QueueConsumer implements InitializingBean { IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, - @Qualifier("accountNewRequestValidator") - Function accountNewRequestValidator, - @Qualifier("accountUpdateRequestValidator") - Function accountUpdateRequestValidator, - @Qualifier("accountBlockRequestValidator") + @Qualifier("accountCorrespondentNewRequestValidator") + Function accountNewRequestValidator, + @Qualifier("accountCorrespondentUpdateRequestValidator") + Function accountUpdateRequestValidator, + @Qualifier("accountCorrespondentBlockRequestValidator") Function accountBlockRequestValidator) { super(kafkaQueue); this.accountMap = imdgProvider.getImdg( @@ -94,14 +96,20 @@ public class AccountService extends QueueConsumer implements InitializingBean { callback(AccountSdf01Request.class) .setConsumer(this::accountNewSdf01) .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put); - callback(AccountNewRequest.class) - .setConsumer(this::accountNew) - .forDestination(Consts.DESTINATION_ACCOUNT_NEW, callbacks::put); + callback(AccountCorrespondentNewRequest.class) + .setConsumer(this::accountCorrespondentNew) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_NEW, callbacks::put); + callback(AccountCorrespondentUpdateRequest.class) + .setConsumer(this::accountCorrespondentUpdate) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setConsumer(this::accountCorrespondentBlock) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK, callbacks::put); init(); } - public RequestInfoUpdate accountNew(BaseRequest userRequest) { - log.debug("AccountNewRequest received"); + public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) { + log.debug("AccountCorrespondentNewRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; @@ -109,7 +117,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; - AccountNewRequest req = userRequest.getRequestPayload(); + AccountCorrespondentNewRequest req = userRequest.getRequestPayload(); Long companyId = req.getCompanyId(); ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); @@ -118,11 +126,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { // todo выяснить у репортера, что делать в такой ситуации (нужна ли отдельная ошибка) if (clearingMemberCategories.isEmpty()) { - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } if (clearingMemberCategories.size() > 1) { log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); @@ -139,20 +143,12 @@ public class AccountService extends QueueConsumer implements InitializingBean { servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); } else { // todo выяснить у репортера, что делать в такой ситуации - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); if (relations.isEmpty()) { - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } if (relations.size() > 1) { log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); @@ -172,6 +168,58 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } + public RequestInfoUpdate accountCorrespondentUpdate(BaseRequest userRequest) { + log.debug("AccountCorrespondentUpdateRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountUpdateRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + AccountCorrespondentUpdateRequest request = userRequest.getRequestPayload(); + + Account account = accountMap.getSingleObjectByID(request.getId()); + + if (request.getAccount() != null && !account.getAccount().equalsIgnoreCase(request.getAccount())) + return makeError(AccountError.WrongFieldValue, "account", userRequest.getId()); + account.setAccount(request.getAccount()); + + if (request.getCompanyId() != null && !Objects.equals(account.getCompanyId(), request.getCompanyId())) + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); + + if (request.getAccountType() != null && !account.getAccountType().equalsIgnoreCase(request.getAccountType())) + return makeError(AccountError.WrongFieldValue, "accountType", userRequest.getId()); + + if (request.getStatus() != null && !account.getStatus().equalsIgnoreCase(request.getStatus())) + return makeError(AccountError.WrongFieldValue, "status", userRequest.getId()); + + accountMap.update(account); + + log.debug("successfully processed, update account id {}", account.getId()); + return null; + } + + public RequestInfoUpdate accountCorrespondentBlock(BaseRequest userRequest) { + log.debug("AccountBlockRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountBlockRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + CommonDeleteRequest request = userRequest.getRequestPayload(); + + Account account = accountMap.getSingleObjectByID(request.getId()); + account.setStatus(AccountStatus.BLOCKED.getKey()); + + accountMap.update(account); + + log.debug("successfully processed, block account id {}", account.getId()); + return null; + } + public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); @@ -212,4 +260,13 @@ public class AccountService extends QueueConsumer implements InitializingBean { request.setAccountCreationResults(results); kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request); } + + private RequestInfoUpdate makeError(AccountError accountError, String fieldName, Long reqId) { + String errMsg = messageResolver.resolve(new EnumMessage(accountError, fieldName)); + return new RequestInfoUpdate() + .setId(reqId) + .setStatus(Status.Error) + .setMessage(errMsg); + } + } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 4eeca343f..baa420397 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -58,9 +58,9 @@ public interface Consts { String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; - String DESTINATION_ACCOUNT_NEW = "account-new"; - String DESTINATION_ACCOUNT_UPDATE = "account-update"; - String DESTINATION_ACCOUNT_BLOCK = "account-block"; + String DESTINATION_ACCOUNT_CORRESPONDENT_NEW = "account-correspondent-new"; + String DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE = "account-correspondent-update"; + String DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK = "account-correspondent-block"; String DESTINATION_RELATION_UPDATE = "relation-update"; String DESTINATION_PROFILE_DOCUMENT_NEW = "profile-document-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java index f91db426e..aa02bd1c6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountNewRequest { +public class AccountCorrespondentNewRequest { @JsonProperty public Long companyId; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java index a3f29488e..d3fb5eb9c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountUpdateRequest { +public class AccountCorrespondentUpdateRequest { @JsonProperty public Long id;