diff --git a/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java b/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java index bedd8a7..bc24d74 100644 --- a/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java +++ b/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java @@ -41,5 +41,10 @@ public class SignalController { return signalFacade.getReportList(username, packageName); } + @GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public ResponseEntity downloadFile(@RequestParam("file") String file) { + return signalFacade.downloadFile(file); + } + } diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/errors/MonitoringDownloadError.java b/src/main/java/ru/nbch/credit_tracker/entities/response/errors/MonitoringDownloadError.java new file mode 100644 index 0000000..fff91e7 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/errors/MonitoringDownloadError.java @@ -0,0 +1,25 @@ +package ru.nbch.credit_tracker.entities.response.errors; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "MonitoringDownloadResponse", propOrder = { + "status", + "errorCode", + "errorText" +}) +@XmlRootElement(name = "MonitoringDownloadResponse") +public class MonitoringDownloadError implements CommonError { + + @XmlElement(name = "Status", required = true) + protected String status; + @XmlElement(name = "ErrorCode",required = true) + protected String errorCode; + @XmlElement(name = "ErrorText",required = true) + protected String errorText; + +} diff --git a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java index 676c674..3a645e6 100644 --- a/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java +++ b/src/main/java/ru/nbch/credit_tracker/enums/SignalError.java @@ -17,6 +17,7 @@ public enum SignalError { ERROR_011("011", "Получен невалидный XML"), ERROR_012("012", "Пакет не найден"), ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"), + ERROR_014("014", "Файл не найден"), ERROR_015("015", "Клиент с указанным membercode не найден"), ERROR_016("016", "Нет активного пакета с именем "), ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"), // TODO get rid of duplicate? diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 7aa30aa..46777d9 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.facade; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.io.FileUrlResource; import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -12,6 +13,7 @@ import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequ import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject; import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; import ru.nbch.credit_tracker.entities.response.errors.MonitoringActivePackagesError; +import ru.nbch.credit_tracker.entities.response.errors.MonitoringDownloadError; import ru.nbch.credit_tracker.entities.response.errors.MonitoringPackageDeleteError; import ru.nbch.credit_tracker.entities.response.errors.MonitoringReportListError; import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse; @@ -29,6 +31,7 @@ import ru.nbch.credit_tracker.service.xml.FailureAnswerGenerator; import ru.nbch.credit_tracker.service.xml.SuccessAnswerGenerator; import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.jaxb.XmlUtilService; +import ru.nbch.credit_tracker.utils.CTUtil; import ru.nbch.credit_tracker.utils.ValidationUtil; import java.io.File; @@ -347,4 +350,28 @@ public class SignalFacade { throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringReportListError(), false); } } + + public ResponseEntity downloadFile(String fileName) { + try { + String memberCode = CTUtil.getMemberCodeFromFileName(fileName); + String dirPath = config.getLoadDir() + File.separator + memberCode; + File folder = new File(dirPath); + + if (folder.exists() && folder.isDirectory()) { + File file = new File(dirPath + File.separator + fileName); + if (file.exists() && file.isFile()) { + return ResponseEntity.ok().body(new FileUrlResource(file.getPath())); + } + } else { + throw new SignalErrorException(SignalError.ERROR_014, null, new MonitoringDownloadError(), true); + } + throw new SignalErrorException(SignalError.ERROR_014, null, new MonitoringDownloadError(), true); + } catch (Exception e) { + if (e instanceof SignalErrorException) { + throw (SignalErrorException) e; + } + log.error(e.getMessage(), e); + throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringDownloadError(), false); + } + } } diff --git a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java index b853eea..3c66fe7 100644 --- a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java +++ b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java @@ -38,6 +38,15 @@ public class CTUtil { } public static String generateResponseReportFileName(String userId, String packageName) { - return userId.substring(0,6) + "_" + packageName + "_" + LocalDateTime.now().format(responseReportDateTimeFormatter); + return userId.substring(0, 6) + "_" + packageName + "_" + LocalDateTime.now().format(responseReportDateTimeFormatter); + } + + public static String getMemberCodeFromFileName(String fileName) { + String[] parts = fileName.split("_"); + if (parts.length > 1) { + return parts[0]; + } else { + return null; + } } }