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_009("009", "Превышен допустимый размер пакета"),
ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"),
ERROR_011("011", "Получен невалидный XML");
ERROR_011("011", "Получен невалидный XML"),
ERROR_100("100", "Непредвиденная ошибка");
private final String code;
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.entities.monitoring_request.MonitoringRequest;
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.SignalService;
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
@ -87,60 +87,92 @@ public class SignalFacade {
} catch (Exception 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));
}
// Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
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));
}
// Пробуем распарсить xml
MonitoringRequest monitoringRequest;
// Xml валиден. Производим анмаршаллинг
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
zipInputStream.getNextEntry();
IXmlProcessor processor = xmlUtilService.createJaxbProcessor();
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())) {
// записать REJECTED
signalService.insertPackage(monitoringRequest, Status.REJECTED);
return getBadResponse(SignalError.ERROR_005);
}
if (signalService.isPackageNotUnique(monitoringRequest)) {
// записать REJECTED
// signalService.insertPackage(monitoringRequest, Status.REJECTED);
signalService.insertPackage(monitoringRequest, Status.REJECTED);
return getBadResponse(SignalError.ERROR_007);
}
signalService.registerPackage(monitoringRequest);
} catch (Exception 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.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response
}
private void validateRequestByXsd(ZipInputStream inputStream) throws ValidationException {
try {
xmlUtilService.validateXMLByXSD(inputStream, config.getXsdValidation().monitoringRequestPath());
} catch (Exception e) {
throw new ValidationException();
private ResponseEntity<Resource> validateMonitoringRequest(MonitoringRequest request) {
if (request == null) {
return getBadResponse(SignalError.ERROR_011);
}
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) {