Used throwing for set method

This commit is contained in:
Mikhail Trofimov 2025-06-24 15:57:24 +03:00
parent 16c286eac0
commit b3102a17f8
2 changed files with 46 additions and 48 deletions

View file

@ -9,6 +9,7 @@ import ru.nbch.credit_tracker.entities.request.active_packages.MonitoringActiveP
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.success.MonitoringPackageDeleteResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringReportListResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringReportListResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse;
import ru.nbch.credit_tracker.facade.SignalFacade; import ru.nbch.credit_tracker.facade.SignalFacade;
@RestController @RestController
@ -22,7 +23,7 @@ public class SignalController {
} }
@PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE) @PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<Resource> setupMonitoring(@RequestParam("file") MultipartFile file) { public ResponseEntity<MonitoringResponse> setupMonitoring(@RequestParam("file") MultipartFile file) {
return signalFacade.setupMonitoring(file); return signalFacade.setupMonitoring(file);
} }

View file

@ -12,10 +12,7 @@ import ru.nbch.credit_tracker.entities.request.active_packages.MonitoringActiveP
import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest;
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.*;
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; import ru.nbch.credit_tracker.entities.response.success.MonitoringPackageDeleteResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringReportListResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringReportListResponse;
import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse;
@ -76,14 +73,14 @@ public class SignalFacade {
this.executor = executor; this.executor = executor;
} }
public ResponseEntity<Resource> setupMonitoring(MultipartFile file) { public ResponseEntity<MonitoringResponse> setupMonitoring(MultipartFile file) {
// первичные валидации // первичные валидации
if (file.isEmpty()) { if (file.isEmpty()) {
return getBadResponse(SignalError.ERROR_001); throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true);
} }
if (!isZipFile(file)) { if (!isZipFile(file)) {
return getBadResponse(SignalError.ERROR_001); throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true);
} }
// Валидация Архива на количетсво файлов, размер и расширение // Валидация Архива на количетсво файлов, размер и расширение
@ -96,33 +93,35 @@ public class SignalFacade {
if (!entry.isDirectory()) { if (!entry.isDirectory()) {
fileCount++; fileCount++;
if (fileCount > 1) { // Архив должен содержать ровно один XML-файл if (fileCount > 1) { // Архив должен содержать ровно один XML-файл
return getBadResponse(SignalError.ERROR_001); throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true);
} }
if (!entry.getName().toLowerCase().endsWith(".xml")) { // Файл должен быть с расширением xml if (!entry.getName().toLowerCase().endsWith(".xml")) { // Файл должен быть с расширением xml
return getBadResponse(SignalError.ERROR_001); throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true);
} }
xmlEntry = entry; xmlEntry = entry;
} else { } else {
return getBadResponse(SignalError.ERROR_001); // Архив должен содержать ровно один XML-файл. Никаких доп директорий throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true); // Архив должен содержать ровно один XML-файл. Никаких доп директорий
} }
zipInputStream.closeEntry(); zipInputStream.closeEntry();
entry = zipInputStream.getNextEntry(); entry = zipInputStream.getNextEntry();
} }
if (fileCount == 0) { // Архив должен содержать ровно один XML-файл if (fileCount == 0) { // Архив должен содержать ровно один XML-файл
return getBadResponse(SignalError.ERROR_001); throw new SignalErrorException(SignalError.ERROR_001, null, new MonitoringError(), true);
} }
if (xmlEntry.getSize() > MAX_XML_FILE_SIZE) { // максимально 2 Гб до запаковки if (xmlEntry.getSize() > MAX_XML_FILE_SIZE) { // максимально 2 Гб до запаковки
return getBadResponse(SignalError.ERROR_009); throw new SignalErrorException(SignalError.ERROR_009, null, new MonitoringError(), true);
} }
} catch (Exception e) { } catch (Exception e) {
if (e instanceof SignalErrorException) {
throw (SignalErrorException) e;
}
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
Resource answer = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); throw new SignalErrorException(SignalError.ERROR_100, null, new MonitoringError(), false);
return ResponseEntity.internalServerError().body(answer);
} }
// Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml // Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml
@ -136,16 +135,19 @@ public class SignalFacade {
monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class); monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof SignalErrorException) {
throw (SignalErrorException) e;
}
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
Resource answer = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); throw new SignalErrorException(SignalError.ERROR_100, null, new MonitoringError(), false);
return ResponseEntity.internalServerError().body(answer);
} }
// валидация xml // валидация xml
ResponseEntity<Resource> errorResponse = validateMonitoringRequest(monitoringRequest); try {
if (errorResponse != null) { validateMonitoringRequest(monitoringRequest);
} catch (SignalErrorException e) {
signalService.rejectPackage(monitoringRequest); signalService.rejectPackage(monitoringRequest);
return errorResponse; throw e;
} }
try { try {
@ -153,85 +155,80 @@ public class SignalFacade {
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword()); AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword());
if (!authResult.isSuccess()) { if (!authResult.isSuccess()) {
signalService.rejectPackage(monitoringRequest); signalService.rejectPackage(monitoringRequest);
return getBadResponse(authResult.getError()); throw new SignalErrorException(authResult.getError(), null, new MonitoringError(), false);
} }
// проверка на уникальность пакета // проверка на уникальность пакета
if (signalService.isPackageNotUnique(monitoringRequest)) { if (signalService.isPackageNotUnique(monitoringRequest)) {
signalService.rejectPackage(monitoringRequest); signalService.rejectPackage(monitoringRequest);
return getBadResponse(SignalError.ERROR_007); throw new SignalErrorException(SignalError.ERROR_007, null, new MonitoringError(), false);
} }
packageId = signalService.registerPackage(monitoringRequest); packageId = signalService.registerPackage(monitoringRequest);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof SignalErrorException) {
throw (SignalErrorException) e;
}
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
Resource answer = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100); throw new SignalErrorException(SignalError.ERROR_100, null, new MonitoringError(), false);
return ResponseEntity.internalServerError().body(answer);
} }
// в отдельном потоке запускаем поиск фидов и расчет флагов просрочек // в отдельном потоке запускаем поиск фидов и расчет флагов просрочек
registerFidsAndDebts(packageId); registerFidsAndDebts(packageId);
return ResponseEntity.ok().body(successAnswerGenerator.generateSuccessAnswer(MonitoringResponse.class)); return ResponseEntity.ok().body(new MonitoringResponse());
} }
private ResponseEntity<Resource> validateMonitoringRequest(MonitoringRequest request) { private void validateMonitoringRequest(MonitoringRequest request) throws SignalErrorException {
if (request == null) { if (request == null) {
return getBadResponse(SignalError.ERROR_011); throw new SignalErrorException(SignalError.ERROR_011, null, new MonitoringError(), false);
} }
ResponseEntity<Resource> errorResponse = validateReruqredTags(request); validateReruqredTags(request);
if (errorResponse != null) {
return errorResponse; validateTagsTypes(request);
} }
return validateTagsTypes(request); private void validateReruqredTags(MonitoringRequest request) throws SignalErrorException {
}
ResponseEntity<Resource> validateReruqredTags(MonitoringRequest request) {
if (request.getUserId() == null) { if (request.getUserId() == null) {
return getBadResponse(SignalError.ERROR_002, "UserId"); throw new SignalErrorException(SignalError.ERROR_002, "UserId", new MonitoringError(), true);
} }
if (request.getPackageName() == null) { if (request.getPackageName() == null) {
return getBadResponse(SignalError.ERROR_002, "PackageName"); throw new SignalErrorException(SignalError.ERROR_002, "PackageName", new MonitoringError(), true);
} }
if (request.getPassword() == null) { if (request.getPassword() == null) {
return getBadResponse(SignalError.ERROR_002, "Password"); throw new SignalErrorException(SignalError.ERROR_002, "Password", new MonitoringError(), true);
} }
if (request.getSubjects() == null) { if (request.getSubjects() == null) {
return getBadResponse(SignalError.ERROR_002, "Subjects"); throw new SignalErrorException(SignalError.ERROR_002, "Subjects", new MonitoringError(), true);
} }
if (request.getSubjects().getSubject().isEmpty()) { if (request.getSubjects().getSubject().isEmpty()) {
return getBadResponse(SignalError.ERROR_002, "Subject"); throw new SignalErrorException(SignalError.ERROR_002, "Subject", new MonitoringError(), true);
}
} }
return null; private void validateTagsTypes(MonitoringRequest request) throws SignalErrorException {
}
private ResponseEntity<Resource> validateTagsTypes(MonitoringRequest request) {
if (!ValidationUtil.validatePackageName(request.getPackageName())) { if (!ValidationUtil.validatePackageName(request.getPackageName())) {
return getBadResponse(SignalError.ERROR_008); throw new SignalErrorException(SignalError.ERROR_008, null, new MonitoringError(), true);
} }
Set<String> uniqueIds = new HashSet<>(); Set<String> uniqueIds = new HashSet<>();
for (Subject subject : request.getSubjects().getSubject()) { for (Subject subject : request.getSubjects().getSubject()) {
if (!ValidationUtil.validatePhone(subject.getClientId())) { if (!ValidationUtil.validatePhone(subject.getClientId())) {
return getBadResponse(SignalError.ERROR_003); throw new SignalErrorException(SignalError.ERROR_003, null, new MonitoringError(), true);
} }
if (!ValidationUtil.validateNPId(subject.getId())) { if (!ValidationUtil.validateNPId(subject.getId())) {
return getBadResponse(SignalError.ERROR_010); throw new SignalErrorException(SignalError.ERROR_010, null, new MonitoringError(), true);
} }
// проверка на уникальность Id внутри одного пакета // проверка на уникальность Id внутри одного пакета
if (!uniqueIds.add(subject.getId())) { if (!uniqueIds.add(subject.getId())) {
return getBadResponse(SignalError.ERROR_004, subject.getId()); throw new SignalErrorException(SignalError.ERROR_004, subject.getId(), new MonitoringError(), true);
} }
} }
return null;
} }
private void registerFidsAndDebts(Integer packageId) { private void registerFidsAndDebts(Integer packageId) {