Added file downloading

This commit is contained in:
Mikhail Trofimov 2025-06-24 15:42:37 +03:00
parent 4a9c59b0e3
commit 16c286eac0
5 changed files with 68 additions and 1 deletions

View file

@ -41,5 +41,10 @@ public class SignalController {
return signalFacade.getReportList(username, packageName); return signalFacade.getReportList(username, packageName);
} }
@GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String file) {
return signalFacade.downloadFile(file);
}
} }

View file

@ -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;
}

View file

@ -17,6 +17,7 @@ public enum SignalError {
ERROR_011("011", "Получен невалидный XML"), ERROR_011("011", "Получен невалидный XML"),
ERROR_012("012", "Пакет не найден"), ERROR_012("012", "Пакет не найден"),
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"), ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),
ERROR_014("014", "Файл не найден"),
ERROR_015("015", "Клиент с указанным membercode не найден"), ERROR_015("015", "Клиент с указанным membercode не найден"),
ERROR_016("016", "Нет активного пакета с именем "), ERROR_016("016", "Нет активного пакета с именем "),
ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"), // TODO get rid of duplicate? ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"), // TODO get rid of duplicate?

View file

@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.facade;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.FileUrlResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; 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.request.monitoring_request.Subject;
import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; 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.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.MonitoringPackageDeleteError;
import ru.nbch.credit_tracker.entities.response.errors.MonitoringReportListError; import ru.nbch.credit_tracker.entities.response.errors.MonitoringReportListError;
import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse; 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.SuccessAnswerGenerator;
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
import ru.nbch.credit_tracker.service.xml.jaxb.XmlUtilService; import ru.nbch.credit_tracker.service.xml.jaxb.XmlUtilService;
import ru.nbch.credit_tracker.utils.CTUtil;
import ru.nbch.credit_tracker.utils.ValidationUtil; import ru.nbch.credit_tracker.utils.ValidationUtil;
import java.io.File; import java.io.File;
@ -347,4 +350,28 @@ public class SignalFacade {
throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringReportListError(), false); throw new SignalErrorException(SignalError.ERROR_013, null, new MonitoringReportListError(), false);
} }
} }
public ResponseEntity<Resource> 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);
}
}
} }

View file

@ -38,6 +38,15 @@ public class CTUtil {
} }
public static String generateResponseReportFileName(String userId, String packageName) { 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;
}
} }
} }