diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java index 007058195..2995c5361 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java @@ -9,20 +9,26 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.company.error.CompanyErrors; +import ru.spcex.clearing.company.util.RequestHelper; 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.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -//import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.error.ClearingBaseException; import ru.spcex.platform.utils.error.ValidationException; +import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; @@ -57,11 +63,12 @@ public class CompanyService extends QueueConsumer implements InitializingBean { @Override public void afterPropertiesSet() { + RequestHelper requestHelper = new RequestHelper(log, messageResolver); callback(CommonDeleteRequest.class) .setConsumer(this::deleteCompany) .forDestination(Consts.DESTINATION_COMPANY_DELETE, callbacks::put); callback(CompanyNewRequest.class) - .setConsumer(this::createCompany) + .setFunction( request -> requestHelper.requestFunction(this::createCompany, request)) .forDestination(Consts.DESTINATION_COMPANY_NEW, callbacks::put); callback(CompanyNewRequest.class) .setConsumer(this::updateCompany) @@ -72,6 +79,31 @@ public class CompanyService extends QueueConsumer implements InitializingBean { // .forDestination(Consts.DESTINATION_COMPANY_UPDATE, callbacks::put); init(); } +// +// interface RequestCommand { +// Long command(T arg) throws ClearingBaseException; +// } +// +// protected > Object requestFunction(RequestCommand command, T userRequest) { +// try { +// Long itemAffected = command.command(userRequest); +// log.trace("Item affected: {}", itemAffected); +// return null; +// } catch (ClearingBaseException expectedE) { +// log.trace("{} return expected exception: {}", command, expectedE.toString()); +// return new RequestInfoUpdate() +// .setId(userRequest.getId()) +// .setStatus(Status.Error) +// .setMessage(expectedE.getMessage()); +// } catch (Exception unexpectedE) { +// log.error("Error at {}: {} ", command, ExceptionUtils.getStackTrace(unexpectedE)); +// String message = messageResolver.resolve(new EnumMessage(CompanyErrors.GeneralError)); +// return new RequestInfoUpdate() +// .setId(userRequest.getId()) +// .setStatus(Status.Error) +// .setMessage(message); +// } +// } protected void validateRole(BaseRequest req) throws ValidationException { Long requestor = null; // todo требуется передавать это значение из frontendapi! req.getUserId(); @@ -85,7 +117,8 @@ public class CompanyService extends QueueConsumer implements InitializingBean { Optional error = validator.tillFirstError(); if (error.isPresent()) { log.warn("CompanyNewRequest validation error: {}", error.get()); - String errorMsg = messageResolver.resolve(error.get()); + throw new ValidationException(error.get()); +// String errorMsg = messageResolver.resolve(error.get()); // return new RequestInfoUpdate() // todo reply message // .setId(userRequest.getId()) // .setStatus(Status.Error) @@ -93,14 +126,12 @@ public class CompanyService extends QueueConsumer implements InitializingBean { } } - private void createCompany(BaseRequest companyNewRequestBaseRequest) { + private Long createCompany(BaseRequest companyNewRequestBaseRequest) throws ValidationException { CompanyNewRequest req = companyNewRequestBaseRequest.getRequestPayload(); log.debug("company-new request received, BaseRequest.id = {}", companyNewRequestBaseRequest.getId()); - try { + { // Валидация, ValidationException validateRole(companyNewRequestBaseRequest); validate(req); - } catch (ValidationException e) { - throw new RuntimeException(e); // todo true return error } Company company = new Company(); company.setId(idSequence.nextId()); @@ -124,6 +155,8 @@ public class CompanyService extends QueueConsumer implements InitializingBean { companyMap.insert(company); log.debug("company-new request processed, BaseRequest.id = {}, company.id={}", companyNewRequestBaseRequest.getId(), company.getId()); + + return company.getId(); } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/util/RequestHelper.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/util/RequestHelper.java new file mode 100644 index 000000000..5cbb5d6da --- /dev/null +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/util/RequestHelper.java @@ -0,0 +1,70 @@ +package ru.spcex.clearing.company.util; + +import org.slf4j.Logger; +import ru.spcex.clearing.company.error.CompanyErrors; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.error.ClearingBaseException; +import ru.spcex.platform.utils.log.ExceptionUtils; + +import java.util.Objects; + +/** + * Упрощает обработку ошибок во время обработки реквестов. + * Передаёт регламинтированные ошибки из ClearingBaseException. + * + * Пример: + * callback(CompanyNewRequest.class) + * .setFunction( request -> requestHelper.requestFunction(this::createCompany, request)) + * .forDestination(Consts.DESTINATION_COMPANY_NEW, callbacks::put); + */ +public class RequestHelper { + protected final Logger log; + protected final IMessageResolver messageResolver; + + public RequestHelper(Logger log, IMessageResolver messageResolver) { + Objects.requireNonNull(log); + Objects.requireNonNull(messageResolver); + this.log = log; + this.messageResolver = messageResolver; + } + + /** + * Оборачивает функцию command в try-catch + * @param command обработчик реквеста + * @param userRequest реквест + * @param request payload type + * @param тип BaseRequest + * @return RequestInfoUpdate или null + */ + public > RequestInfoUpdate requestFunction(RequestCommand command, T userRequest) { + try { + Long itemAffected = command.command(userRequest); + log.trace("Item affected: {}", itemAffected); + return null; + } catch (ClearingBaseException expectedE) { + log.trace("{} return expected exception: {}", command, expectedE.toString()); + String message = expectedE.getEnumMsg() == null + ? expectedE.getMessage() + : messageResolver.resolve(expectedE.getEnumMsg()); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(message); + } catch (Exception unexpectedE) { + log.error("Error at {}: {} ", command, ExceptionUtils.getStackTrace(unexpectedE)); + String message = messageResolver.resolve(new EnumMessage(CompanyErrors.GeneralError)); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(message); + } + } + + public interface RequestCommand { + Long command(T arg) throws ClearingBaseException; + } +}