Added validation for required types

This commit is contained in:
Mikhail Trofimov 2025-06-05 17:51:18 +03:00
parent 2b5bd8c120
commit 18809d24d2
2 changed files with 60 additions and 27 deletions

View file

@ -14,7 +14,8 @@ public enum SignalError {
ERROR_008("008", "PackageName не соответствует допустимому формату"), ERROR_008("008", "PackageName не соответствует допустимому формату"),
ERROR_009("009", "Превышен допустимый размер пакета"), ERROR_009("009", "Превышен допустимый размер пакета"),
ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"), ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"),
ERROR_011("011", "Получен невалидный XML"); ERROR_011("011", "Получен невалидный XML"),
ERROR_100("100", "Непредвиденная ошибка");
private final String code; private final String code;
private final String message; private final String message;

View file

@ -9,7 +9,7 @@ import org.springframework.web.multipart.MultipartFile;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.SignalError;
import ru.nbch.credit_tracker.exceptions.ValidationException; import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.service.FailureAnswerGenerator; import ru.nbch.credit_tracker.service.FailureAnswerGenerator;
import ru.nbch.credit_tracker.service.SignalService; import ru.nbch.credit_tracker.service.SignalService;
import ru.nbch.credit_tracker.service.scoring.AuthorizationService; import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
@ -87,60 +87,92 @@ public class SignalFacade {
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100);
return ResponseEntity.internalServerError().body(new PathResource(errorPath)); return ResponseEntity.internalServerError().body(new PathResource(errorPath));
} }
// Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml // Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) { // Пробуем распарсить xml
zipInputStream.getNextEntry();
validateRequestByXsd(zipInputStream);
} catch (ValidationException e) {
// записать REJECTED
return getBadResponse(SignalError.ERROR_011); // TODO вычленять конкретный элемент
} catch (Exception e) {
log.error(e.getMessage(), e);
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001);
return ResponseEntity.internalServerError().body(new PathResource(errorPath));
}
MonitoringRequest monitoringRequest; MonitoringRequest monitoringRequest;
// Xml валиден. Производим анмаршаллинг
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) { try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
zipInputStream.getNextEntry(); zipInputStream.getNextEntry();
IXmlProcessor processor = xmlUtilService.createJaxbProcessor(); IXmlProcessor processor = xmlUtilService.createJaxbProcessor();
monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class); monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class);
} catch (Exception e) {
log.error(e.getMessage(), e);
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100);
return ResponseEntity.internalServerError().body(new PathResource(errorPath));
}
// валидация xml
ResponseEntity<Resource> errorResponse = validateMonitoringRequest(monitoringRequest);
if (errorResponse != null) {
return errorResponse;
}
try {
if (!authorizationService.hasAuthorization(monitoringRequest.getUserId(), monitoringRequest.getPassword())) { if (!authorizationService.hasAuthorization(monitoringRequest.getUserId(), monitoringRequest.getPassword())) {
// записать REJECTED signalService.insertPackage(monitoringRequest, Status.REJECTED);
return getBadResponse(SignalError.ERROR_005); return getBadResponse(SignalError.ERROR_005);
} }
if (signalService.isPackageNotUnique(monitoringRequest)) { if (signalService.isPackageNotUnique(monitoringRequest)) {
// записать REJECTED signalService.insertPackage(monitoringRequest, Status.REJECTED);
// signalService.insertPackage(monitoringRequest, Status.REJECTED);
return getBadResponse(SignalError.ERROR_007); return getBadResponse(SignalError.ERROR_007);
} }
signalService.registerPackage(monitoringRequest); signalService.registerPackage(monitoringRequest);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100);
return ResponseEntity.internalServerError().body(new PathResource(errorPath)); return ResponseEntity.internalServerError().body(new PathResource(errorPath));
} }
return ResponseEntity.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response return ResponseEntity.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response
} }
private void validateRequestByXsd(ZipInputStream inputStream) throws ValidationException { private ResponseEntity<Resource> validateMonitoringRequest(MonitoringRequest request) {
try { if (request == null) {
xmlUtilService.validateXMLByXSD(inputStream, config.getXsdValidation().monitoringRequestPath()); return getBadResponse(SignalError.ERROR_011);
} catch (Exception e) {
throw new ValidationException();
} }
ResponseEntity<Resource> errorResponse = validateReruqredTags(request);
if (errorResponse != null) {
return errorResponse;
}
return validateTagsTypes(request);
}
ResponseEntity<Resource> validateReruqredTags(MonitoringRequest request) {
if (request.getUserId() == null) {
return getBadResponse(SignalError.ERROR_002); // + userId
}
if (request.getPackageName() == null) {
return getBadResponse(SignalError.ERROR_002); // + packageName
}
if (request.getPassword() == null) {
return getBadResponse(SignalError.ERROR_002); // + password
}
if (request.getSubjects() == null) {
return getBadResponse(SignalError.ERROR_002); // + subjects
}
if (request.getSubjects().getSubject().isEmpty()) {
return getBadResponse(SignalError.ERROR_002); // subject
}
return null;
}
private ResponseEntity<Resource> validateTagsTypes(MonitoringRequest request) {
// TODO проверка на типы тут уже можно регистрировать в бд REGECTED реквесты
return null;
} }
private boolean isZipFile(MultipartFile file) { private boolean isZipFile(MultipartFile file) {