diff --git a/backend/src/main/java/ru/micord/ervu/exception/JournalException.java b/backend/src/main/java/ru/micord/ervu/exception/JournalException.java new file mode 100644 index 00000000..87567f68 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/exception/JournalException.java @@ -0,0 +1,14 @@ +package ru.micord.ervu.exception; + +/** + * @author Adel Kalimullin + */ +public class JournalException extends RuntimeException { + public JournalException(String message) { + super(message); + } + + public JournalException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileData.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileData.java new file mode 100644 index 00000000..462498da --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileData.java @@ -0,0 +1,37 @@ +package ru.micord.ervu.journal; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author ya.kuznetsova + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class JournalFileData { + + @JsonProperty("orgId_ERVU") + private String orgIdErvu; // идентификатор организации в ЕРВУ + + @JsonProperty("filesInfo") + private List filesInfo; + + public String getOrgIdErvu() { + return orgIdErvu; + } + + public JournalFileData setOrgIdErvu(String orgIdErvu) { + this.orgIdErvu = orgIdErvu; + return this; + } + + public List getFilesInfo() { + return filesInfo; + } + + public JournalFileData setFilesInfo(List filesInfo) { + this.filesInfo = filesInfo; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java index 4dd2dea7..c67ab87a 100644 --- a/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java @@ -1,37 +1,25 @@ package ru.micord.ervu.journal; -import java.util.List; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; /** - * @author ya.kuznetsova + * @author Adel Kalimullin */ @JsonIgnoreProperties(ignoreUnknown = true) public class JournalFileDataResponse { + private boolean success; + private String message; + private JournalFileData data; - @JsonProperty("orgId_ERVU") - private String orgIdErvu; // идентификатор организации в ЕРВУ - - @JsonProperty("filesInfo") - private List filesInfo; - - public String getOrgIdErvu() { - return orgIdErvu; + public boolean isSuccess() { + return success; } - public JournalFileDataResponse setOrgIdErvu(String orgIdErvu) { - this.orgIdErvu = orgIdErvu; - return this; + public String getMessage() { + return message; } - public List getFilesInfo() { - return filesInfo; - } - - public JournalFileDataResponse setFilesInfo(List filesInfo) { - this.filesInfo = filesInfo; - return this; + public JournalFileData getData() { + return data; } } diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaService.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaService.java index c849daa2..2011b85e 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaService.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaService.java @@ -10,7 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; import org.springframework.kafka.requestreply.RequestReplyFuture; -import org.springframework.stereotype.Service; import ru.micord.ervu.kafka.exception.KafkaMessageException; import ru.micord.ervu.kafka.exception.KafkaMessageReplyTimeoutException; import ru.micord.ervu.kafka.service.ReplyingKafkaService; @@ -18,7 +17,6 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService; /** * @author Eduard Tihomirov */ -@Service public abstract class BaseReplyingKafkaService implements ReplyingKafkaService { private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java index 9db721d2..351bf671 100644 --- a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java @@ -45,7 +45,6 @@ import ru.micord.ervu.security.esia.EsiaAuthInfoStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContext; -import org.springframework.util.StringUtils; import ru.micord.ervu.security.esia.config.EsiaConfig; import org.springframework.beans.factory.annotation.Value; import ru.micord.ervu.kafka.model.Brhs; @@ -63,6 +62,7 @@ import ru.micord.ervu.security.webbpm.jwt.helper.SecurityHelper; import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; import ru.micord.ervu.security.webbpm.jwt.model.Token; import ru.micord.ervu.service.UploadAccessService; +import ru.micord.ervu.util.StringUtils; import ru.cg.webbpm.modules.core.runtime.api.LocalizedException; import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; @@ -469,9 +469,14 @@ public class EsiaAuthService { requestReplyTopic, objectMapper.writeValueAsString(orgInfo) ); ErvuOrgResponse ervuOrgResponse = objectMapper.readValue(kafkaResponse, ErvuOrgResponse.class); + if (!ervuOrgResponse.getSuccess()) { + throw new EsiaException("Failed to get organization ervuId for prnOid = " + prnOid + + ". ErrorMessage: " + ervuOrgResponse.getMessage()); + } + String ervuId = ervuOrgResponse.getData().getErvuId(); - if (!StringUtils.hasText(ervuId)) { - throw new EsiaException("No ervuId for prnOid = " + prnOid); + if (!StringUtils.isValidUUID(ervuId)) { + throw new EsiaException("No valid ervuId for prnOid = " + prnOid); } return ervuId; } diff --git a/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java b/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java index 43405951..82ee2810 100644 --- a/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java +++ b/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java @@ -1,6 +1,5 @@ package ru.micord.ervu.service.grid.impl; -import java.time.LocalDateTime; import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -14,8 +13,10 @@ import javax.servlet.http.HttpServletRequest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import ru.micord.ervu.exception.JournalException; import ru.micord.ervu.exception.JsonParsingException; import ru.micord.ervu.journal.JournalDto; +import ru.micord.ervu.journal.JournalFileData; import ru.micord.ervu.journal.JournalFileDataRequest; import ru.micord.ervu.journal.JournalFileDataResponse; import ru.micord.ervu.journal.mapper.JournalDtoMapper; @@ -71,7 +72,13 @@ public class JournalInMemoryStaticGridLoadService implements replyTopic, objectMapper.writeValueAsString(journalFileDataRequest)); JournalFileDataResponse journalFileDataResponse = objectMapper.readValue(responseJsonString, JournalFileDataResponse.class); - ervuJournalList = journalFileDataResponse.getFilesInfo().stream() + + if (!journalFileDataResponse.isSuccess()) { + throw new JournalException( + "Failed to retrieve journal data from ervu: " + journalFileDataResponse.getMessage()); + } + + ervuJournalList = journalFileDataResponse.getData().getFilesInfo().stream() .flatMap(fileInfo -> fileInfo.getPackFiles().stream() .filter(fileDetail -> DOCUMENT.equals(fileDetail.getType())) .map(fileDetail -> JournalDtoMapper.mapToJournalDto(fileInfo, fileDetail)) @@ -79,7 +86,7 @@ public class JournalInMemoryStaticGridLoadService implements .toList(); } catch (JsonProcessingException e) { - throw new JsonParsingException("Failed to parse JournalFileDataResponse.", e); + throw new JournalException("Failed to parse journalFileDataResponse.", e); } AtomicInteger counter = new AtomicInteger(1); diff --git a/backend/src/main/java/ru/micord/ervu/util/StringUtils.java b/backend/src/main/java/ru/micord/ervu/util/StringUtils.java index 0fdfaff0..ece65d52 100644 --- a/backend/src/main/java/ru/micord/ervu/util/StringUtils.java +++ b/backend/src/main/java/ru/micord/ervu/util/StringUtils.java @@ -1,10 +1,16 @@ package ru.micord.ervu.util; + +import java.util.regex.Pattern; + import static org.apache.commons.lang3.StringUtils.capitalize; import static org.apache.commons.lang3.StringUtils.substring; public final class StringUtils { + private static final Pattern UUID_PATTERN = Pattern.compile( + "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + ); private StringUtils() { } @@ -18,4 +24,11 @@ public final class StringUtils { middleNameInitial ); } + + public static boolean isValidUUID(String uuid) { + if (uuid == null) { + return false; + } + return UUID_PATTERN.matcher(uuid).matches(); + } }