Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4af6b5b64c |
15 changed files with 251 additions and 96 deletions
4
pom.xml
4
pom.xml
|
|
@ -27,6 +27,10 @@
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-aop</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mybatis.spring.boot</groupId>
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConditionalOnClass(Aspect.class)
|
||||||
|
@EnableAspectJAutoProxy(proxyTargetClass = true)
|
||||||
|
public class AopMdcConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public MdcAspect mdcAspect() {
|
||||||
|
return new MdcAspect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.slf4j.MDC;
|
||||||
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Aspect
|
||||||
|
public class MdcAspect {
|
||||||
|
|
||||||
|
// For methods that set an MDC value (from a method argument) and then clear it at the end
|
||||||
|
@Around("@annotation(setAndClearMdc)")
|
||||||
|
public Object setAndClearMdcAdvice(ProceedingJoinPoint pjp, SetAndClearMdc setAndClearMdc) throws Throwable {
|
||||||
|
Object[] args = pjp.getArgs();
|
||||||
|
int index = setAndClearMdc.argIndex();
|
||||||
|
Object obj = (args != null && args.length > index) ? args[index] : null;
|
||||||
|
if (obj instanceof MonitoringRequest request) {
|
||||||
|
if (request.getPackageName() != null) {
|
||||||
|
putMdcValue(request.getPackageName(), setAndClearMdc.key());
|
||||||
|
}
|
||||||
|
} else if (obj instanceof UserPackage userPackage) {
|
||||||
|
if (userPackage.getPackageName() != null) {
|
||||||
|
putMdcValue(userPackage.getPackageName(), setAndClearMdc.key());
|
||||||
|
}
|
||||||
|
} else if (obj instanceof String packageName) {
|
||||||
|
putMdcValue(setAndClearMdc.key(), packageName);
|
||||||
|
} else {
|
||||||
|
log.debug("no packageName found for for {}", pjp.toShortString());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return pjp.proceed();
|
||||||
|
} finally {
|
||||||
|
MDC.remove(setAndClearMdc.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putMdcValue(String value, String key) {
|
||||||
|
try {
|
||||||
|
MDC.put(key, "[" + value + "] ");
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error("{}", ExceptionUtils.getStackTrace(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
// Annotation to set an MDC key based on a method argument and clear it after method execution
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
public @interface SetAndClearMdc {
|
||||||
|
String key() default "ru.nbch.credit_tracker.log.mdc.key";
|
||||||
|
// The index of the method argument to use for the MDC value (defaults to the first argument)
|
||||||
|
int argIndex() default 0;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.nbch.credit_tracker.controller;
|
package ru.nbch.credit_tracker.controller;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
@ -14,6 +15,7 @@ import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportLis
|
||||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||||
import ru.nbch.credit_tracker.facade.SignalFacade;
|
import ru.nbch.credit_tracker.facade.SignalFacade;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/v1/signal")
|
@RequestMapping("/api/v1/signal")
|
||||||
public class SignalController {
|
public class SignalController {
|
||||||
|
|
@ -26,31 +28,37 @@ public class SignalController {
|
||||||
|
|
||||||
@PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE)
|
@PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(@RequestParam("file") MultipartFile file) {
|
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(@RequestParam("file") MultipartFile file) {
|
||||||
|
log.info("Processing /api/v1/signal/set");
|
||||||
return signalFacade.setupMonitoring(file);
|
return signalFacade.setupMonitoring(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
@PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) {
|
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) {
|
||||||
|
log.info("Processing /api/v1/signal/active_packages. UserId: {}", activePackagesRequest.getUserId());
|
||||||
return signalFacade.findActivePackages(activePackagesRequest);
|
return signalFacade.findActivePackages(activePackagesRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
@PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) {
|
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) {
|
||||||
|
log.info("Processing /api/v1/signal/all_packages. UserId: {}", allPackagesRequest.getUserId());
|
||||||
return signalFacade.findAllPackages(allPackagesRequest);
|
return signalFacade.findAllPackages(allPackagesRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||||
|
log.info("Processing /api/v1/signal/delete. UserName: {}", username);
|
||||||
return signalFacade.deletePackage(username, packageName);
|
return signalFacade.deletePackage(username, packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "/report_list", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
@GetMapping(value = "/report_list", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public ResponseEntity<MonitoringReportListResponse> getReportList(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
public ResponseEntity<MonitoringReportListResponse> getReportList(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||||
|
log.info("Processing /api/v1/signal/report_list. UserName: {}, PackageName: {}", username, packageName);
|
||||||
return signalFacade.getReportList(username, packageName);
|
return signalFacade.getReportList(username, packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
@GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||||
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String file) {
|
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String file) {
|
||||||
|
log.info("Processing /api/v1/signal/download. FileName: {}", file);
|
||||||
return signalFacade.downloadFile(file);
|
return signalFacade.downloadFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@ package ru.nbch.credit_tracker.enums;
|
||||||
public enum SignalError implements IEnumKeyCode {
|
public enum SignalError implements IEnumKeyCode {
|
||||||
ERROR_001("001", "Ошибка распаковки архива"),
|
ERROR_001("001", "Ошибка распаковки архива"),
|
||||||
ERROR_002("002", "Отсутствует обязательный элемент: {}"),
|
ERROR_002("002", "Отсутствует обязательный элемент: {}"),
|
||||||
ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX"),
|
ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX. Id: {}"),
|
||||||
ERROR_005("005", "Неверный логин или пароль"),
|
ERROR_005("005", "Неверный логин или пароль"),
|
||||||
ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"),
|
ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"),
|
||||||
ERROR_007("007", "В системе уже существует пакет с таким именем"),
|
ERROR_007("007", "В системе уже существует пакет с таким именем"),
|
||||||
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_012("012", "Пакет {} не найден"),
|
ERROR_012("012", "Пакет {} не найден"),
|
||||||
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),
|
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ 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;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||||
|
|
@ -33,6 +34,7 @@ import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||||
import ru.nbch.credit_tracker.utils.ValidationUtil;
|
import ru.nbch.credit_tracker.utils.ValidationUtil;
|
||||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||||
|
import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver;
|
||||||
|
|
||||||
import javax.xml.stream.XMLStreamException;
|
import javax.xml.stream.XMLStreamException;
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
|
|
@ -61,6 +63,7 @@ public class SignalFacade {
|
||||||
private final SignalRestService signalRestService;
|
private final SignalRestService signalRestService;
|
||||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||||
private final StaxXmlProcessor staxXmlProcessor;
|
private final StaxXmlProcessor staxXmlProcessor;
|
||||||
|
private final SimpleMessageResolver messageResolver;
|
||||||
|
|
||||||
private final ExecutorService executor;
|
private final ExecutorService executor;
|
||||||
private final long maxXmlFileSize;
|
private final long maxXmlFileSize;
|
||||||
|
|
@ -81,12 +84,16 @@ public class SignalFacade {
|
||||||
this.staxXmlProcessor = staxXmlProcessor;
|
this.staxXmlProcessor = staxXmlProcessor;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
||||||
|
this.messageResolver = new SimpleMessageResolver();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(MultipartFile file) {
|
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(MultipartFile file) {
|
||||||
// первичные валидации
|
// первичные валидации
|
||||||
if (file.isEmpty() || !isZipFile(file)) {
|
if (file.isEmpty() || !isZipFile(file)) {
|
||||||
throw clientExcp(SignalError.ERROR_001, XmlErrorFormat.MonitoringError);
|
SignalClientException e = clientExcp(SignalError.ERROR_001, XmlErrorFormat.MonitoringError);
|
||||||
|
String errorReason = messageResolver.resolve(e.getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/set failed. Reason: {}. File is empty or don't match the type.", errorReason);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Валидация Архива на количетсво файлов, размер и расширение
|
// Валидация Архива на количетсво файлов, размер и расширение
|
||||||
|
|
@ -114,6 +121,8 @@ public class SignalFacade {
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/set failed on unzipping archive. Reason: {}", errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -135,9 +144,12 @@ public class SignalFacade {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CTUtil.removeFile(filePath);
|
CTUtil.removeFile(filePath);
|
||||||
if (e.getCause() instanceof XMLStreamException) {
|
if (e.getCause() instanceof XMLStreamException) {
|
||||||
|
log.warn("/api/v1/signal/set failed on reading xml. Reason: {}", e.getMessage());
|
||||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/set failed on validation. Reason: {}", errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -159,10 +171,12 @@ public class SignalFacade {
|
||||||
}
|
}
|
||||||
|
|
||||||
packageId = signalService.registerPackage(monitoringRequest);
|
packageId = signalService.registerPackage(monitoringRequest);
|
||||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
log.info("Package registered. PackageId {}. PackageName: {}. Status: {}", packageId, monitoringRequest.getPackageName(), Status.PROCESSING.name());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CTUtil.removeFile(filePath);
|
CTUtil.removeFile(filePath);
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/set rejected. PackageName: {}. Reason: {}", monitoringRequest.getPackageName(), errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -172,6 +186,7 @@ public class SignalFacade {
|
||||||
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
||||||
registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
||||||
|
|
||||||
|
log.info("/api/v1/signal/set processed successfully. PackageName: {}", monitoringRequest.getPackageName());
|
||||||
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -220,6 +235,7 @@ public class SignalFacade {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc(argIndex = 1)
|
||||||
private void registerFidsAndDebts(Integer packageId, String packageName, String filePath) {
|
private void registerFidsAndDebts(Integer packageId, String packageName, String filePath) {
|
||||||
executor.execute(() -> {
|
executor.execute(() -> {
|
||||||
try {
|
try {
|
||||||
|
|
@ -273,12 +289,15 @@ public class SignalFacade {
|
||||||
packages.getPackages().add(pack);
|
packages.getPackages().add(pack);
|
||||||
});
|
});
|
||||||
response.setPackages(packages);
|
response.setPackages(packages);
|
||||||
|
log.info("/api/v1/signal/active_packages processed successfully. UserId: {}", activePackagesRequest.getUserId());
|
||||||
return ResponseEntity.ok(response);
|
return ResponseEntity.ok(response);
|
||||||
} else {
|
} else {
|
||||||
throw clientExcp(SignalError.ERROR_015, XmlErrorFormat.MonitoringActivePackagesError);
|
throw clientExcp(SignalError.ERROR_015, XmlErrorFormat.MonitoringActivePackagesError);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/active_packages failed. UserId: {}. Reason: {}", activePackagesRequest.getUserId(), errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -310,12 +329,15 @@ public class SignalFacade {
|
||||||
packages.getPackages().add(pack);
|
packages.getPackages().add(pack);
|
||||||
});
|
});
|
||||||
response.setPackages(packages);
|
response.setPackages(packages);
|
||||||
|
log.info("/api/v1/signal/all_packages processed successfully. UserId: {}", allPackagesRequest.getUserId());
|
||||||
return ResponseEntity.ok(response);
|
return ResponseEntity.ok(response);
|
||||||
} else {
|
} else {
|
||||||
throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringActivePackagesError);
|
throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringActivePackagesError);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/all_packages failed. UserId: {}. Reason: {}", allPackagesRequest.getUserId(), errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -339,9 +361,12 @@ public class SignalFacade {
|
||||||
|
|
||||||
signalRestService.deletePackage(username, packageName);
|
signalRestService.deletePackage(username, packageName);
|
||||||
log.info("Package {} deleted", packageName);
|
log.info("Package {} deleted", packageName);
|
||||||
|
log.info("/api/v1/signal/delete processed successfully. UserName: {}, PackageName: {}", username, packageName);
|
||||||
return ResponseEntity.ok(response);
|
return ResponseEntity.ok(response);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/delete failed. UserName: {}, PackageName: {}, Reason: {}", username, packageName, errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -386,9 +411,12 @@ public class SignalFacade {
|
||||||
MonitoringReportListResponse response = new MonitoringReportListResponse();
|
MonitoringReportListResponse response = new MonitoringReportListResponse();
|
||||||
response.setPackageName(packageName);
|
response.setPackageName(packageName);
|
||||||
response.setReports(reports);
|
response.setReports(reports);
|
||||||
|
log.info("/api/v1/signal/report_list processes successfully. UserName: {}, PackageName: {}", username, packageName);
|
||||||
return ResponseEntity.ok(response);
|
return ResponseEntity.ok(response);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/report_list failed. UserName: {}, PackageName: {}. Reason: {}", username, packageName, errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
@ -408,6 +436,7 @@ public class SignalFacade {
|
||||||
if (folder.exists() && folder.isDirectory()) {
|
if (folder.exists() && folder.isDirectory()) {
|
||||||
File file = new File(dirPath + File.separator + fileName);
|
File file = new File(dirPath + File.separator + fileName);
|
||||||
if (file.exists() && file.isFile()) {
|
if (file.exists() && file.isFile()) {
|
||||||
|
log.info("/api/v1/signal/download processed successfully. FileName: {}", fileName);
|
||||||
return ResponseEntity.ok().body(new FileUrlResource(file.getPath()));
|
return ResponseEntity.ok().body(new FileUrlResource(file.getPath()));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -416,6 +445,8 @@ public class SignalFacade {
|
||||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof SignalClientException) {
|
if (e instanceof SignalClientException) {
|
||||||
|
String errorReason = messageResolver.resolve(((SignalClientException) e).getErrorMessage());
|
||||||
|
log.warn("/api/v1/signal/download failed. FileName: {}. Reason: {}", fileName, errorReason);
|
||||||
throw (SignalClientException) e;
|
throw (SignalClientException) e;
|
||||||
}
|
}
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.service;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||||
|
|
@ -21,6 +22,11 @@ public class MonitoringErrorProcesingService {
|
||||||
|
|
||||||
public void findErrors(Integer packageId) {
|
public void findErrors(Integer packageId) {
|
||||||
UserPackage userPackage = signalService.findPackage(packageId);
|
UserPackage userPackage = signalService.findPackage(packageId);
|
||||||
|
processPackage(userPackage, packageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc
|
||||||
|
private void processPackage(UserPackage userPackage, Integer packageId) {
|
||||||
if (userPackage != null) {
|
if (userPackage != null) {
|
||||||
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
||||||
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
import ru.nbch.credit_tracker.entities.dto.Hit;
|
import ru.nbch.credit_tracker.entities.dto.Hit;
|
||||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||||
|
|
@ -69,83 +70,88 @@ public class MonitoringService {
|
||||||
log.info("Start monitoring");
|
log.info("Start monitoring");
|
||||||
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
||||||
for (UserPackage userPackage : packages) {
|
for (UserPackage userPackage : packages) {
|
||||||
log.info("Processing package {}", userPackage.getPackageName());
|
processPackage(userPackage);
|
||||||
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
|
||||||
log.info("Package {} has no fids. Package will be skipped.", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
|
||||||
|
|
||||||
if (onlineReports == null) {
|
|
||||||
log.info("No reports found for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
|
||||||
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
|
||||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
|
||||||
|
|
||||||
if (fileNames.isEmpty()) {
|
|
||||||
log.info("No new report found for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
|
||||||
|
|
||||||
if (lastDownloadedReportDate != null) {
|
|
||||||
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
|
||||||
fileNames = fileNames.stream()
|
|
||||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
|
||||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
|
||||||
.toList();
|
|
||||||
} else {
|
|
||||||
fileNames = fileNames.stream()
|
|
||||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
|
||||||
log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport());
|
|
||||||
} else {
|
|
||||||
log.info("Last Downloaded Report Name is empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String newReport : fileNames) {
|
|
||||||
try {
|
|
||||||
String loadedReportPath = null;
|
|
||||||
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
|
||||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
|
||||||
} else if (lastDownloadedReportDate != null) {
|
|
||||||
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
|
||||||
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
|
||||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (loadedReportPath == null) {
|
|
||||||
log.info("Report was not loaded for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String responsePath = generateResponse(userPackage, loadedReportPath);
|
|
||||||
String fileName = null;
|
|
||||||
if (responsePath != null) {
|
|
||||||
fileName = createResponseFile(userPackage, responsePath);
|
|
||||||
}
|
|
||||||
if (fileName != null) {
|
|
||||||
log.info("New report fileName: {}", fileName);
|
|
||||||
updateSignalHits(userPackage, responsePath, fileName);
|
|
||||||
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
|
||||||
} else {
|
|
||||||
log.info("Report was not created for package {}", userPackage.getPackageName());
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.info("Finish monitoring");
|
log.info("Finish monitoring");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc
|
||||||
|
private void processPackage(UserPackage userPackage) {
|
||||||
|
log.info("Processing package");
|
||||||
|
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
||||||
|
log.info("Package has no fids. Package will be skipped.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
||||||
|
|
||||||
|
if (onlineReports == null) {
|
||||||
|
log.info("No reports found for package");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
||||||
|
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
||||||
|
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
||||||
|
|
||||||
|
if (fileNames.isEmpty()) {
|
||||||
|
log.info("No new report found for package");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
||||||
|
|
||||||
|
if (lastDownloadedReportDate != null) {
|
||||||
|
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
||||||
|
fileNames = fileNames.stream()
|
||||||
|
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
||||||
|
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||||
|
.toList();
|
||||||
|
} else {
|
||||||
|
fileNames = fileNames.stream()
|
||||||
|
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
||||||
|
log.info("Last downloaded report found for package. Last Downloaded Report Name: {}", userPackage.getLastDownloadedReport());
|
||||||
|
} else {
|
||||||
|
log.info("Last Downloaded Report Name is empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String newReport : fileNames) {
|
||||||
|
try {
|
||||||
|
String loadedReportPath = null;
|
||||||
|
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
||||||
|
loadedReportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
||||||
|
} else if (lastDownloadedReportDate != null) {
|
||||||
|
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
||||||
|
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
||||||
|
loadedReportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedReportPath == null) {
|
||||||
|
log.info("Report was not loaded for package");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String responsePath = generateResponse(userPackage, loadedReportPath);
|
||||||
|
String fileName = null;
|
||||||
|
if (responsePath != null) {
|
||||||
|
fileName = createResponseFile(userPackage, responsePath);
|
||||||
|
}
|
||||||
|
if (fileName != null) {
|
||||||
|
log.info("New report fileName: {}", fileName);
|
||||||
|
updateSignalHits(userPackage, responsePath, fileName);
|
||||||
|
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
||||||
|
} else {
|
||||||
|
log.info("Report was not created for package");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Формирует результирующий xml файл для конечного пользователя на основе файла из официального сервиса сигналов
|
* Формирует результирующий xml файл для конечного пользователя на основе файла из официального сервиса сигналов
|
||||||
* @return Путь к временному рещультирующему файлу
|
* @return Путь к временному рещультирующему файлу
|
||||||
|
|
@ -297,7 +303,7 @@ public class MonitoringService {
|
||||||
10000,
|
10000,
|
||||||
"/MonitoringSignalResponse/Subjects/Subject");
|
"/MonitoringSignalResponse/Subjects/Subject");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("Error while and updating hits", e);
|
throw new RuntimeException("Error while updating hits", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTUtil.removeFile(responsePath); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
CTUtil.removeFile(responsePath); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
||||||
|
|
|
||||||
|
|
@ -285,7 +285,7 @@ public class SignalService {
|
||||||
request -> {
|
request -> {
|
||||||
if (!request.getPersons().isEmpty()) {
|
if (!request.getPersons().isEmpty()) {
|
||||||
List<PhoneFidMap> subjects = request.getPersons().stream().map(p -> {
|
List<PhoneFidMap> subjects = request.getPersons().stream().map(p -> {
|
||||||
log.error("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
log.warn("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
||||||
return PhoneFidMap.builder()
|
return PhoneFidMap.builder()
|
||||||
.id(p.getUid())
|
.id(p.getUid())
|
||||||
.errorText(p.getValue())
|
.errorText(p.getValue())
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.enums.Status;
|
import ru.nbch.credit_tracker.enums.Status;
|
||||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||||
|
|
@ -38,6 +39,7 @@ public class UpdateProcessingPackagesService {
|
||||||
log.info("Finish updating processing packages");
|
log.info("Finish updating processing packages");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc(argIndex = 1)
|
||||||
private void process(Integer packageId, String packageName) {
|
private void process(Integer packageId, String packageName) {
|
||||||
try {
|
try {
|
||||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
||||||
|
|
@ -56,7 +58,7 @@ public class UpdateProcessingPackagesService {
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||||
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e);
|
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}, PackageName: {}", packageId, packageName, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.service;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
|
|
@ -57,6 +58,7 @@ public class UpdatingFlagsService {
|
||||||
log.info("Finish updating flags");
|
log.info("Finish updating flags");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc(argIndex = 1)
|
||||||
private void updateFlags(Integer packageId, String packageName) {
|
private void updateFlags(Integer packageId, String packageName) {
|
||||||
try {
|
try {
|
||||||
signalService.updatePackageStatus(packageId, Status.PROCESSING);
|
signalService.updatePackageStatus(packageId, Status.PROCESSING);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package ru.nbch.credit_tracker.utils;
|
package ru.nbch.credit_tracker.utils;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
||||||
import ru.nbch.credit_tracker.enums.SignalError;
|
import ru.nbch.credit_tracker.enums.SignalError;
|
||||||
|
|
@ -10,47 +12,58 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class ValidationUtil {
|
public class ValidationUtil {
|
||||||
|
|
||||||
private static String phoneRegex = "^\\d{9}$";
|
private static String phoneRegex = "^\\d{9}$";
|
||||||
private static String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
private static String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
||||||
private static String npIdRegex = "^\\S{1,36}$";
|
private static String npIdRegex = "^\\S{1,36}$";
|
||||||
|
|
||||||
|
@SetAndClearMdc
|
||||||
public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
||||||
if (request == null) {
|
if (request == null) {
|
||||||
|
log.warn("Ошибка при валидации пакета. Получен невалидный XML");
|
||||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getUserId() == null) {
|
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (request.getPackageName() == null) {
|
if (request.getPackageName() == null) {
|
||||||
|
log.warn("Ошибка при валидации пакета. Отсутствует обязательный элемент: PackageName");
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName");
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!validatePackageName(request.getPackageName())) {
|
||||||
|
log.error("Ошибка при валидации пакета. PackageName не соответствует допустимому формату");
|
||||||
|
throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.getUserId() == null) {
|
||||||
|
log.warn("Ошибка при валидации пакета.Отсутствует обязательный элемент: UserId");
|
||||||
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId");
|
||||||
|
}
|
||||||
|
|
||||||
if (request.getPassword() == null) {
|
if (request.getPassword() == null) {
|
||||||
|
log.warn("Ошибка при валидации пакета.Отсутствует обязательный элемент: Password");
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password");
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getSubjects() == null) {
|
if (request.getSubjects() == null) {
|
||||||
|
log.warn("Ошибка при валидации пакета.Отсутствует обязательный элемент: Subjects");
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subjects");
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subjects");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getSubjects().getSubject().isEmpty()) {
|
if (request.getSubjects().getSubject().isEmpty()) {
|
||||||
|
log.warn("Ошибка при валидации пакета.Отсутствует обязательный элемент: Subject");
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject");
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validatePackageName(request.getPackageName())) {
|
|
||||||
throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Subject subject : request.getSubjects().getSubject()) {
|
for (Subject subject : request.getSubjects().getSubject()) {
|
||||||
if (!validatePhone(subject.getClientId())) {
|
|
||||||
throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError);
|
|
||||||
}
|
|
||||||
if (!validateNPId(subject.getId())) {
|
if (!validateNPId(subject.getId())) {
|
||||||
throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError);
|
log.warn("Ошибка при валидации пакета.Идентификатор субъекта (Id) не соответствует допустимому формату: {}.", subject.getId());
|
||||||
|
throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError, subject.getId());
|
||||||
|
}
|
||||||
|
if (!validatePhone(subject.getClientId())) {
|
||||||
|
log.warn("Ошибка при валидации пакета.Элемент ClientId не соответствует формату XXXXXXXXX: {}", subject.getClientId());
|
||||||
|
throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError, subject.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||||
<charset>utf-8</charset>
|
<charset>utf-8</charset>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
<maxFileSize>100MB</maxFileSize>
|
<maxFileSize>100MB</maxFileSize>
|
||||||
</triggeringPolicy>
|
</triggeringPolicy>
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||||
<charset>utf-8</charset>
|
<charset>utf-8</charset>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
|
||||||
|
|
@ -69,12 +69,12 @@ public class ValidationUtilTest {
|
||||||
Arguments.of(
|
Arguments.of(
|
||||||
"/monitoring_request/invalid_phone_request.zip",
|
"/monitoring_request/invalid_phone_request.zip",
|
||||||
SignalError.ERROR_003,
|
SignalError.ERROR_003,
|
||||||
Collections.emptyList().toArray(new Object[0])
|
new Object[]{"abc123"}
|
||||||
),
|
),
|
||||||
Arguments.of(
|
Arguments.of(
|
||||||
"/monitoring_request/invalid_id_request.zip",
|
"/monitoring_request/invalid_id_request.zip",
|
||||||
SignalError.ERROR_010,
|
SignalError.ERROR_010,
|
||||||
Collections.emptyList().toArray(new Object[0])
|
new Object[]{"#####"}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue