From 999ac42f48e7946375c28bf15136eb7bd777414a Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 29 Oct 2025 17:44:09 +0300 Subject: [PATCH] find packages method; global exceptions --- .../config/rest/GlobalExceptionHandler.java | 62 ++++++++++-------- .../controller/SignalControllerV2.java | 35 ++++++++++ .../user_response/errors/CommonError.java | 1 + .../credit_tracker/facade/SignalFacadeV2.java | 65 +++++++++++++++++++ 4 files changed, 136 insertions(+), 27 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java b/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java index 68968d5..2b17835 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package ru.nbch.credit_tracker.config.rest; +import java.nio.charset.Charset; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -9,15 +10,19 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MaxUploadSizeExceededException; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; -import ru.nbch.credit_tracker.entities.user_response.errors.*; +import ru.nbch.credit_tracker.entities.user_response.errors.CommonError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringActivePackagesError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringAllPackagesError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringDownloadError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringPackageDeleteError; +import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringReportListError; import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalException; import ru.nbch.credit_tracker.exceptions.SignalServerException; import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver; -import java.nio.charset.Charset; - @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @@ -42,34 +47,33 @@ public class GlobalExceptionHandler { return new ResponseEntity<>(error, headers, HttpStatus.BAD_REQUEST); } - @ExceptionHandler(value = SignalException.class, produces = MediaType.APPLICATION_XML_VALUE) - public ResponseEntity handleClientException(SignalException ex) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding))); - - String errorText = messageResolver.resolve(ex.getErrorMessage()); - - CommonError commonError = getCommonError(ex); - commonError.setStatus("error"); - commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode()); - commonError.setErrorText(errorText); - - if (ex instanceof SignalClientException) { - String packageName = ((SignalClientException) ex).getPackageName(); - if(packageName != null ) { - log.warn("Response error: {}. PackageName: {}", errorText, packageName); - } else { - log.warn("Response error: {}", errorText); - } - return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST); + @ExceptionHandler(value = SignalClientException.class, produces = MediaType.APPLICATION_XML_VALUE) + public ResponseEntity handleClientException(SignalClientException ex) { + CommonError err = getCommonError(ex); + String packageName = ex.getPackageName(); + if(packageName != null ) { + log.warn("Response error: {}. PackageName: {}", err.getErrorText(), packageName); } else { - Exception cause = ((SignalServerException) ex).getCause(); - log.error(cause.getMessage(), cause); - return new ResponseEntity<>(commonError, headers, HttpStatus.INTERNAL_SERVER_ERROR); + log.warn("Response error: {}", err.getErrorText()); } + return new ResponseEntity<>(err, xmlHeaders(), HttpStatus.BAD_REQUEST); } - private static CommonError getCommonError(SignalException ex) { + @ExceptionHandler(value = SignalServerException.class, produces = MediaType.APPLICATION_XML_VALUE) + public ResponseEntity handleServerException(SignalServerException ex) { + CommonError commonError = getCommonError(ex); + Exception cause = ex.getCause(); + log.error(cause.getMessage(), cause); + return new ResponseEntity<>(commonError, xmlHeaders(), HttpStatus.INTERNAL_SERVER_ERROR); + } + + private HttpHeaders xmlHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding))); + return headers; + } + + private CommonError getCommonError(SignalException ex) { CommonError commonError; switch (ex.getErrorFormat()) { case MonitoringError -> commonError = new MonitoringError(); @@ -80,6 +84,10 @@ public class GlobalExceptionHandler { case MonitoringPackageDeleteError -> commonError = new MonitoringPackageDeleteError(); default -> throw new IllegalStateException("Unsupported error format: " + ex.getErrorFormat()); } + commonError.setStatus("error"); + commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode()); + String errorText = messageResolver.resolve(ex.getErrorMessage()); + commonError.setErrorText(errorText); return commonError; } } diff --git a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java b/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java index 2d878db..bc2a397 100644 --- a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java +++ b/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java @@ -3,12 +3,21 @@ package ru.nbch.credit_tracker.controller; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest; +import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest; +import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse; +import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse; import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse; +import ru.nbch.credit_tracker.enums.SignalError; +import ru.nbch.credit_tracker.enums.XmlErrorFormat; +import ru.nbch.credit_tracker.exceptions.SignalException; import ru.nbch.credit_tracker.facade.SignalFacadeV2; +import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp; @RestController @RequestMapping("/api/v2/signal") @@ -26,5 +35,31 @@ public class SignalControllerV2 { return ResponseEntity.ok().body(new MonitoringSetupResponse()); } + @PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) + public ResponseEntity findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) { + try { + return signalFacadeV2.findActivePackages(activePackagesRequest); + } catch (Exception e) { + throwOrWrap(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e); + return null; + } + } + + @PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) + public ResponseEntity findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) { + try { + return signalFacadeV2.findAllPackages(allPackagesRequest); + } catch (Exception e) { + throwOrWrap(SignalError.ERROR_013, XmlErrorFormat.MonitoringAllPackagesError, e); + return null; + } + } + + private static void throwOrWrap(SignalError error, XmlErrorFormat specific, Exception ex) { + if (ex instanceof SignalException) { + throw (SignalException) ex; + } + throw serverExcp(error, specific, ex); + } } diff --git a/src/main/java/ru/nbch/credit_tracker/entities/user_response/errors/CommonError.java b/src/main/java/ru/nbch/credit_tracker/entities/user_response/errors/CommonError.java index 2cf67e2..d28ce65 100644 --- a/src/main/java/ru/nbch/credit_tracker/entities/user_response/errors/CommonError.java +++ b/src/main/java/ru/nbch/credit_tracker/entities/user_response/errors/CommonError.java @@ -4,4 +4,5 @@ public interface CommonError { void setStatus(String status); void setErrorCode(String errorCode); void setErrorText(String errorText); + String getErrorText(); } diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java index 1a9e04f..264aca5 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java @@ -2,13 +2,24 @@ package ru.nbch.credit_tracker.facade; import java.io.File; import java.io.IOException; +import java.util.List; import javax.xml.stream.XMLStreamException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import ru.nbch.credit_tracker.component.MonitoringRequestValidator; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; +import ru.nbch.credit_tracker.entities.dto.UserPackage; +import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest; +import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest; +import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse; +import ru.nbch.credit_tracker.entities.user_response.active_packages.Package; +import ru.nbch.credit_tracker.entities.user_response.active_packages.Packages; +import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse; +import ru.nbch.credit_tracker.entities.user_response.all_packages.PackageAll; +import ru.nbch.credit_tracker.entities.user_response.all_packages.PackagesAll; import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.enums.XmlErrorFormat; @@ -100,4 +111,58 @@ public class SignalFacadeV2 { throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e); } } + + public ResponseEntity findActivePackages(MonitoringActivePackagesRequest activePackagesRequest) throws Exception { + AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(activePackagesRequest.getUserId(), activePackagesRequest.getPassword()); + if (!authResult.isSuccess()) { + throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringActivePackagesError); + } + + List activePackages = signalService.findActivePackages(activePackagesRequest.getUserId()); + if (activePackages.isEmpty()) { + throw clientExcp(SignalError.ERROR_015, XmlErrorFormat.MonitoringActivePackagesError); + } + + MonitoringActivePackagesResponse response = new MonitoringActivePackagesResponse(); + response.setStatus("OK"); + response.setMembercode(activePackagesRequest.getUserId().substring(0, 6)); + Packages packages = new Packages(); + activePackages.forEach(data -> { + Package pack = new Package(); + pack.setPackageName(data.getPackageName()); + pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null); + packages.getPackages().add(pack); + }); + response.setPackages(packages); + return ResponseEntity.ok(response); + } + + public ResponseEntity findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) throws Exception { + AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword()); + if (!authResult.isSuccess()) { + throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError); + } + + List activePackages = signalService.findAllPackages(allPackagesRequest.getUserId()); + if (activePackages.isEmpty()) { + throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringAllPackagesError); + } + + MonitoringAllPackagesResponse response = new MonitoringAllPackagesResponse(); + response.setStatus("OK"); + response.setMembercode(allPackagesRequest.getUserId().substring(0, 6)); + PackagesAll packages = new PackagesAll(); + activePackages.forEach(data -> { + PackageAll pack = new PackageAll(); + pack.setPackageName(data.getPackageName()); + pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null); + pack.setStatus(data.getStatus()); + if (data.getStatus().equals(Status.DELETED.name())) { + pack.setDeactivatedAt(data.getDeactivatedAt() != null ? data.getDeactivatedAt().toString() : null); + } + packages.getPackages().add(pack); + }); + response.setPackages(packages); + return ResponseEntity.ok(response); + } }