From db390aa0891dbbe0954888dddb946af5f57722f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Tue, 14 Jan 2025 22:59:37 +0300 Subject: [PATCH 01/18] SUPPORT-8817: add extract request with empty ervu id --- .../ervu/controller/ExtractController.java | 40 +++++++++++++++---- .../ervu/dto/ExtractEmptyRequestDto.java | 8 ++++ .../webbpm/jwt/util/SecurityUtil.java | 12 +++++- config.md | 3 +- config/micord.env | 1 + config/standalone/dev/standalone.xml | 1 + 6 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 backend/src/main/java/ru/micord/ervu/dto/ExtractEmptyRequestDto.java diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index f749eb6..fb2f5e1 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -16,8 +16,12 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import rtl.pgs.ervu.proto.ExtractRegistry; import rtl.pgs.ervu.proto.ResponseData; +import ru.micord.ervu.dto.ExtractEmptyRequestDto; import ru.micord.ervu.dto.ExtractRequestDto; import ru.micord.ervu.kafka.service.ReplyingKafkaService; +import ru.micord.ervu.security.esia.model.PersonModel; +import ru.micord.ervu.security.esia.service.PersonalDataService; +import ru.micord.ervu.security.esia.token.EsiaTokensStore; import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil; /** @@ -25,28 +29,50 @@ import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil; */ @RestController public class ExtractController { - + private final PersonalDataService personalDataService; private final ReplyingKafkaService replyingKafkaService; + @Value("${ervu.kafka.registry.extract.empty.request.topic}") + private String registryExtractEmptyRequestTopic; @Value("${ervu.kafka.registry.extract.request.topic}") private String registryExtractRequestTopic; @Value("${ervu.kafka.registry.extract.reply.topic}") private String registryExtractReplyTopic; - public ExtractController(ReplyingKafkaService replyingKafkaService) { + public ExtractController(PersonalDataService personalDataService, ReplyingKafkaService replyingKafkaService) { + this.personalDataService = personalDataService; this.replyingKafkaService = replyingKafkaService; } @GetMapping(value = "/extract/{formatRegistry}") public ResponseEntity getExtract(@PathVariable String formatRegistry) { String ervuId = SecurityUtil.getErvuId(); + byte[] reply; - if (ervuId == null) { - return ResponseEntity.noContent().build(); + if (ervuId != null) { + ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry); + reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic, + registryExtractReplyTopic, request + ).get(); + } + else { + String userAccountId = SecurityUtil.getUserId(); + if (userAccountId != null) { + String esiaAccessToken = EsiaTokensStore.getAccessToken(userAccountId); + PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); + + ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto(personModel.getLastName(), + personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), + personModel.getSnils(), formatRegistry + ); + reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic, + registryExtractReplyTopic, emptyRequest + ).get(); + } + else { + return ResponseEntity.noContent().build(); + } } - ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry); - byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic, - registryExtractReplyTopic, request).get(); try { ResponseData responseData = ResponseData.parseFrom(reply); diff --git a/backend/src/main/java/ru/micord/ervu/dto/ExtractEmptyRequestDto.java b/backend/src/main/java/ru/micord/ervu/dto/ExtractEmptyRequestDto.java new file mode 100644 index 0000000..03c423a --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/dto/ExtractEmptyRequestDto.java @@ -0,0 +1,8 @@ +package ru.micord.ervu.dto; + +/** + * @author r.latypov + */ +public record ExtractEmptyRequestDto(String lastName, String firstName, String middleName, + String birthDate, String snils, String formatExtractRegistry) { +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index ef8555e..1851042 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -24,11 +24,19 @@ public final class SecurityUtil { } public static String getErvuId() { + return getUserAccountIdPart(1); + } + + public static String getUserId() { + return getUserAccountIdPart(0); + } + + private static String getUserAccountIdPart(int index) { return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) .map(a -> ((JwtAuthentication) a).getUserAccountId()) .map(userAccountId -> { - String ervuId = userAccountId.split(":")[1]; - return "null".equals(ervuId) ? null : ervuId; + String userAccountIdPart = userAccountId.split(":")[index]; + return "null".equals(userAccountIdPart) ? null : userAccountIdPart; }) .orElse(null); } diff --git a/config.md b/config.md index 0920c80..f82d9cd 100644 --- a/config.md +++ b/config.md @@ -784,7 +784,8 @@ JBPM использует 3 корневых категории логирова - `ERVU_KAFKA_RECRUIT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение данных о повестке, временных мерах и воинском учете - `ERVU_KAFKA_SUBPOENA_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра повесток - `ERVU_KAFKA_SUBPOENA_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра повесток -- `ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета +- `ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при отсутствии ErvuId +- `ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при наличии ErvuId - `ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра воинского учета - `ERVU_KAFKA_EXTRACT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение выписки из Реестра повесток/Реестра воинского учета diff --git a/config/micord.env b/config/micord.env index 4d9a355..99cd3d6 100644 --- a/config/micord.env +++ b/config/micord.env @@ -28,6 +28,7 @@ ERVU_KAFKA_REPLY_TIMEOUT=30 ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5 +ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3 diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml index 1428635..bce507f 100644 --- a/config/standalone/dev/standalone.xml +++ b/config/standalone/dev/standalone.xml @@ -75,6 +75,7 @@ + From 9349af6def814da00eafc6af66f1c89cdfc348cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Tue, 14 Jan 2025 23:13:25 +0300 Subject: [PATCH 02/18] SUPPORT-8817: set visible buttons and text (by removing AC and the field personName) --- .../LK RP FL/screen-form-fl.page | 416 +----------------- 1 file changed, 2 insertions(+), 414 deletions(-) diff --git a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page index df9e931..1f0817e 100644 --- a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page +++ b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page @@ -438,52 +438,7 @@ 8ef93ac5-46d8-456e-950f-2d2949d21a53 personName false - false - - - - collectible - - false - - - - visible - - false - - - - - - - - - false - - - -PersonData -esia - - true - - - -SubpoenaFieldLoadComponent -ru.micord.ervu.component.field - - true - true - - - fieldId - - "personName" - - - - + true 98594cec-0a9b-4cef-af09-e1b71cb2ad9e @@ -7376,374 +7331,7 @@ 315c5087-825a-4ade-99d9-7dbe09f87226 AC - для ненайденного пользователя в ерву false - false - - - - elseActions - - - - - - eventRefs - - - - - - behavior - - {"objectId":"74ed6920-6d22-4349-a08e-a28ccc88f7df","packageName":"ervu.component.container","className":"LoadForm","type":"TS"} - - - - propertyName - - "formLoaded" - - - - - - - - - ifCondition - - - - conditions - - - - - - _isGroupSelected - - false - - - - one - - - - conditionFirstPart - - - - objectValue - - - - behavior - -{"objectId":"8ef93ac5-46d8-456e-950f-2d2949d21a53","packageName":"component","className":"Text","type":"TS"} - - - - method - -"getValue" - - - - - - - - - - conditionSecondPart - - - - staticValue - - - string - - - "null" - - - - - - - operation - - "IS_EMPTY" - - - - - - - - - - - - - _isGroupSelected - - false - - - - one - - - - conditionFirstPart - - - - objectValue - - - - behavior - -{"objectId":"74ed6920-6d22-4349-a08e-a28ccc88f7df","packageName":"ervu.component.container","className":"LoadForm","type":"TS"} - - - - method - -"isLoaded" - - - - - - - - - - conditionSecondPart - - - - staticValue - - - boolean - - - true - - - - - - - operation - - "EQUALS" - - - - - - - - - - - - logicalOperation - - null - - - - - - - thenActions - - - - - - behavior - - {"objectId":"cfb60860-1b04-4eb5-9ccf-1e6436c27b09","packageName":"component.button","className":"Button","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - false - - - - - - - - - - - - - behavior - - {"objectId":"dd701bad-b22d-40c9-b00b-b92f070890db","packageName":"ervu.component.textwithdialoglinks","className":"TextWithDialogLinks","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - false - - - - - - - - - - - - - behavior - - {"objectId":"d68b5c38-9ed6-4596-9b0c-dd1dc542c5ef","packageName":"component.button","className":"Button","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - false - - - - - - - - - - - - - behavior - - {"objectId":"fea5aebc-c206-48bc-a613-ab31813fd639","packageName":"component.container","className":"HBox","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - false - - - - - - - - - - - - - behavior - - {"objectId":"d5fa2655-8dd8-4004-9dec-217a41e5b9ed","packageName":"component","className":"Text","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - false - - - - - - - - - - - - + true 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 From 08c1555e4edb2f8ca387ed2581ef6b5ab4a6be83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 Jan 2025 13:16:09 +0300 Subject: [PATCH 03/18] SUPPORT-8817: sync with ervu-lkrp-ul --- .../webbpm/jwt/JwtAuthentication.java | 7 +++++ .../ervu/security/webbpm/jwt/UserIdsPair.java | 27 +++++++++++++++++++ .../webbpm/jwt/util/SecurityUtil.java | 7 +++++ 3 files changed, 41 insertions(+) create mode 100644 backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java index 47f6567..bc6aa03 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java @@ -17,8 +17,11 @@ public class JwtAuthentication implements Authentication { private final Authentication authentication; private final String token; + private final UserIdsPair userIdsPair; + public JwtAuthentication(Authentication authentication, String userAccountId, String token) { this.userAccountId = userAccountId; + this.userIdsPair = new UserIdsPair(userAccountId); this.authentication = authentication; this.token = token; } @@ -31,6 +34,10 @@ public class JwtAuthentication implements Authentication { return userAccountId; } + public UserIdsPair getUserIdsPair() { + return userIdsPair; + } + @Override public Collection getAuthorities() { return authentication.getAuthorities(); diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java new file mode 100644 index 0000000..b165686 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java @@ -0,0 +1,27 @@ +package ru.micord.ervu.security.webbpm.jwt; + +public class UserIdsPair { + private final String esiaUserId; + private final String ervuId; + + public UserIdsPair(String idsConcatenated) { + + if (idsConcatenated == null) { + this.esiaUserId = null; + this.ervuId = null; + } + else { + String[] ids = idsConcatenated.split(":"); + this.esiaUserId = ids[0]; + this.ervuId = ids.length == 2 ? ids[1] : null; + } + } + + public String getEsiaUserId() { + return esiaUserId; + } + + public String getErvuId() { + return ervuId; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index 1851042..308d2c2 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -8,6 +8,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.util.WebUtils; import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication; +import ru.micord.ervu.security.webbpm.jwt.UserIdsPair; public final class SecurityUtil { public static final String AUTH_TOKEN = "auth_token"; @@ -41,6 +42,12 @@ public final class SecurityUtil { .orElse(null); } + public static UserIdsPair getUserIdsPair() { + return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) + .map(a -> ((JwtAuthentication) a).getUserIdsPair()) + .orElse(null); + } + public static String getCurrentUsername() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.isAuthenticated()) { From 0b29dea6a2dcb7e4aef0fd18b3ac80d377422a4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 Jan 2025 13:24:22 +0300 Subject: [PATCH 04/18] SUPPORT-8817: fix for review (1) --- .../ervu/controller/ExtractController.java | 6 +-- .../webbpm/jwt/util/SecurityUtil.java | 12 +----- config/local.env | 39 +++++++++++++++++++ 3 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 config/local.env diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index fb2f5e1..fbe0f1c 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -56,9 +56,9 @@ public class ExtractController { ).get(); } else { - String userAccountId = SecurityUtil.getUserId(); - if (userAccountId != null) { - String esiaAccessToken = EsiaTokensStore.getAccessToken(userAccountId); + String esiaUserId = SecurityUtil.getUserIdsPair().getEsiaUserId(); + if (esiaUserId != null) { + String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto(personModel.getLastName(), diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index 308d2c2..b09f8e7 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -25,19 +25,11 @@ public final class SecurityUtil { } public static String getErvuId() { - return getUserAccountIdPart(1); - } - - public static String getUserId() { - return getUserAccountIdPart(0); - } - - private static String getUserAccountIdPart(int index) { return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) .map(a -> ((JwtAuthentication) a).getUserAccountId()) .map(userAccountId -> { - String userAccountIdPart = userAccountId.split(":")[index]; - return "null".equals(userAccountIdPart) ? null : userAccountIdPart; + String ervuId = userAccountId.split(":")[1]; + return "null".equals(ervuId) ? null : ervuId; }) .orElse(null); } diff --git a/config/local.env b/config/local.env new file mode 100644 index 0000000..65cf00d --- /dev/null +++ b/config/local.env @@ -0,0 +1,39 @@ +TZ=Europe/Moscow + +# App datasource +DB_APP_USERNAME=ervu_lkrp_fl +DB_APP_PASSWORD=ervu_lkrp_fl +DB_APP_HOST=10.10.31.119 +DB_APP_PORT=5432 +DB_APP_NAME=ervu_lkrp_fl + +ESIA_SCOPES=snils, fullname, birthdate, id_doc +ESIA_BASE_URI=https://esia-portal1.test.gosuslugi.ru/ +ESIA_ISSUER_URL=http://esia-portal1.test.gosuslugi.ru/ +ESIA_CLIENT_ID=MNSV93 +ESIA_CLIENT_CERT_HASH=CF35A98C48E48665EA73530537BAFBB51F911C434ADC89215C2F86DCD04E28C5 +ESIA_REDIRECT_URL=http://localhost:8080/ + +SIGN_URL=https://ervu-sign-dev.k8s.micord.ru/sign +SIGN_VERIFY_URL=https://ervu-sign-dev.k8s.micord.ru/verify + +ERVU_KAFKA_BOOTSTRAP_SERVERS=local-kafka:9094 +ERVU_KAFKA_USERNAME=user2 +ERVU_KAFKA_PASSWORD=Blfi9d2OFG +ERVU_KAFKA_SASL_MECHANISM=PLAIN +ERVU_KAFKA_SECURITY_PROTOCOL=PLAINTEXT +ERVU_KAFKA_GROUP_ID=ervu-lkrp-fl-new +ERVU_KAFKA_REPLY_TOPIC=ervu.lkpr.person.search.response +ERVU_KAFKA_REQUEST_TOPIC=ervu.lkpr.person.search.request +ERVU_KAFKA_REPLY_TIMEOUT=5 +ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request +ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response +ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5 +ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request +ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request +ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response +ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3 +ERVU_KAFKA_DOC_LOGIN_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule + +ESIA_TOKEN_CLEAR_CRON=0 0 */1 * * * +COOKIE_PATH=/fl From 5f7d22c3d3bdaf07b4e4b8ec3a7684cd15ea1ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 Jan 2025 15:10:41 +0300 Subject: [PATCH 05/18] SUPPORT-8817: fix for review (2) --- .../ervu/security/esia/service/EsiaAuthService.java | 4 ++-- .../ervu/security/webbpm/jwt/util/SecurityUtil.java | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) 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 387700d..4ec0575 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 @@ -47,7 +47,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 static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUsername; +import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getUserAccountId; /** * @author Eduard Tihomirov @@ -383,7 +383,7 @@ public class EsiaAuthService { private String getMessageId(Exception exception) { return Integer.toUnsignedString(Objects - .hashCode(getCurrentUsername()), 36) + .hashCode(getUserAccountId()), 36) + "-" + Integer.toUnsignedString(exception.hashCode(), 36); } diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index b09f8e7..740bf04 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -25,12 +25,9 @@ public final class SecurityUtil { } public static String getErvuId() { - return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) - .map(a -> ((JwtAuthentication) a).getUserAccountId()) - .map(userAccountId -> { - String ervuId = userAccountId.split(":")[1]; - return "null".equals(ervuId) ? null : ervuId; - }) + return Optional.ofNullable(getUserIdsPair()) + .map(UserIdsPair::getErvuId) + .filter(ervuId -> !"null".equals(ervuId)) .orElse(null); } @@ -40,7 +37,7 @@ public final class SecurityUtil { .orElse(null); } - public static String getCurrentUsername() { + public static String getUserAccountId() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.isAuthenticated()) { return auth.getName(); From 73a85512d46138f61bc59312822023d672289bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 Jan 2025 17:06:11 +0300 Subject: [PATCH 06/18] SUPPORT-8817: fix for review (3) --- .../ervu/controller/ExtractController.java | 19 ++++++++++++------- .../ervu/security/webbpm/jwt/UserIdsPair.java | 9 +++++++++ .../webbpm/jwt/service/JwtTokenService.java | 14 ++++++++------ .../webbpm/jwt/util/SecurityUtil.java | 7 ------- .../micord/ervu/service/SubpoenaService.java | 4 +++- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index fbe0f1c..8153a0c 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -22,6 +22,7 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService; import ru.micord.ervu.security.esia.model.PersonModel; import ru.micord.ervu.security.esia.service.PersonalDataService; import ru.micord.ervu.security.esia.token.EsiaTokensStore; +import ru.micord.ervu.security.webbpm.jwt.UserIdsPair; import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil; /** @@ -46,7 +47,14 @@ public class ExtractController { @GetMapping(value = "/extract/{formatRegistry}") public ResponseEntity getExtract(@PathVariable String formatRegistry) { - String ervuId = SecurityUtil.getErvuId(); + UserIdsPair userIdsPair = SecurityUtil.getUserIdsPair(); + + if (userIdsPair == null || (userIdsPair.getErvuId() == null + && userIdsPair.getEsiaUserId() == null)) { + return ResponseEntity.noContent().build(); + } + + String ervuId = userIdsPair.getErvuId(); byte[] reply; if (ervuId != null) { @@ -56,12 +64,13 @@ public class ExtractController { ).get(); } else { - String esiaUserId = SecurityUtil.getUserIdsPair().getEsiaUserId(); + String esiaUserId = userIdsPair.getEsiaUserId(); if (esiaUserId != null) { String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); - ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto(personModel.getLastName(), + ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto( + personModel.getLastName(), personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), personModel.getSnils(), formatRegistry ); @@ -69,10 +78,6 @@ public class ExtractController { registryExtractReplyTopic, emptyRequest ).get(); } - else { - return ResponseEntity.noContent().build(); - } - } try { ResponseData responseData = ResponseData.parseFrom(reply); diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java index b165686..e28f8f2 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UserIdsPair.java @@ -17,6 +17,11 @@ public class UserIdsPair { } } + public UserIdsPair(String esiaUserId, String ervuId) { + this.esiaUserId = esiaUserId; + this.ervuId = ervuId; + } + public String getEsiaUserId() { return esiaUserId; } @@ -24,4 +29,8 @@ public class UserIdsPair { public String getErvuId() { return ervuId; } + + public String getIdsConcatenated() { + return esiaUserId + (ervuId == null ? "" : ":" + ervuId); + } } diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java index aab89b6..a7dc81c 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import ru.micord.ervu.security.esia.token.EsiaTokensStore; +import ru.micord.ervu.security.webbpm.jwt.UserIdsPair; import ru.micord.ervu.security.webbpm.jwt.model.Token; import ru.cg.webbpm.modules.resources.api.ResourceMetadataUtils; @@ -42,16 +43,17 @@ public class JwtTokenService { } public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) { + String idsConcatenated = new UserIdsPair(userAccountId, ervuId).getIdsConcatenated(); Date expirationDate = new Date(System.currentTimeMillis() + 1000L * expiresIn); String value = Jwts.builder() - .setSubject(userAccountId + ":" + ervuId) + .setSubject(idsConcatenated) .setIssuer(tokenIssuerName) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(expirationDate) .signWith(SIGNING_KEY) .compact(); - return new Token(userAccountId + ":" + ervuId, tokenIssuerName, expirationDate, value); + return new Token(idsConcatenated, tokenIssuerName, expirationDate, value); } public boolean isValid(Token token) { @@ -64,8 +66,8 @@ public class JwtTokenService { LOGGER.info("Token {} is expired ", token.getValue()); return false; } - String[] ids = token.getUserAccountId().split(":"); - return EsiaTokensStore.validateAccessToken(ids[0]); + String esiaUserId = new UserIdsPair(token.getUserAccountId()).getEsiaUserId(); + return EsiaTokensStore.validateAccessToken(esiaUserId); } public Token getToken(String token) { @@ -89,8 +91,8 @@ public class JwtTokenService { String authToken = extractAuthToken(request); if (authToken != null) { - String[] ids = getToken(authToken).getUserAccountId().split(":"); - return ids[0]; + String esiaUserId = new UserIdsPair(getToken(authToken).getUserAccountId()).getEsiaUserId(); + return esiaUserId; } else { throw new RuntimeException("Failed to get auth data. User unauthorized."); diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index 740bf04..2f0aa62 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -24,13 +24,6 @@ public final class SecurityUtil { return cookie != null ? cookie.getValue() : null; } - public static String getErvuId() { - return Optional.ofNullable(getUserIdsPair()) - .map(UserIdsPair::getErvuId) - .filter(ervuId -> !"null".equals(ervuId)) - .orElse(null); - } - public static UserIdsPair getUserIdsPair() { return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) .map(a -> ((JwtAuthentication) a).getUserIdsPair()) diff --git a/backend/src/main/java/ru/micord/ervu/service/SubpoenaService.java b/backend/src/main/java/ru/micord/ervu/service/SubpoenaService.java index 438338d..9093bce 100644 --- a/backend/src/main/java/ru/micord/ervu/service/SubpoenaService.java +++ b/backend/src/main/java/ru/micord/ervu/service/SubpoenaService.java @@ -31,7 +31,9 @@ public class SubpoenaService { } public SubpoenaResponseDto getSubpoenaData() { - String ervuId = SecurityUtil.getErvuId(); + String ervuId = SecurityUtil.getUserIdsPair() == null + ? null + : SecurityUtil.getUserIdsPair().getErvuId(); if (ervuId == null) { return new SubpoenaResponseDto.Builder().build(); From 5081cbd5b8f5fb3bdb654ef2590bb476e8639c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 Jan 2025 17:10:06 +0300 Subject: [PATCH 07/18] SUPPORT-8817: fix for review (3.2) --- .../ervu/controller/ExtractController.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index 8153a0c..3c74e16 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -64,20 +64,19 @@ public class ExtractController { ).get(); } else { - String esiaUserId = userIdsPair.getEsiaUserId(); - if (esiaUserId != null) { - String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); - PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); + String esiaUserId = userIdsPair.getEsiaUserId(); // esiaUserid is not null here + String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); + PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); - ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto( - personModel.getLastName(), - personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), - personModel.getSnils(), formatRegistry - ); - reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic, - registryExtractReplyTopic, emptyRequest - ).get(); - } + ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto( + personModel.getLastName(), + personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), + personModel.getSnils(), formatRegistry + ); + reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic, + registryExtractReplyTopic, emptyRequest + ).get(); + } try { ResponseData responseData = ResponseData.parseFrom(reply); From f1c274d267695330c650ab818a6188d5365921ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D1=83=D1=84=20=D0=9B=D0=B0=D1=82=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Mon, 20 Jan 2025 15:36:41 +0300 Subject: [PATCH 08/18] SUPPORT-8817: fix for review (4) --- .../java/ru/micord/ervu/controller/ExtractController.java | 5 ----- .../micord/ervu/security/esia/service/EsiaAuthService.java | 4 ++-- .../micord/ervu/security/webbpm/jwt/util/SecurityUtil.java | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index 3c74e16..f8de58e 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -49,11 +49,6 @@ public class ExtractController { public ResponseEntity getExtract(@PathVariable String formatRegistry) { UserIdsPair userIdsPair = SecurityUtil.getUserIdsPair(); - if (userIdsPair == null || (userIdsPair.getErvuId() == null - && userIdsPair.getEsiaUserId() == null)) { - return ResponseEntity.noContent().build(); - } - String ervuId = userIdsPair.getErvuId(); byte[] reply; 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 4ec0575..2457d4d 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 @@ -47,7 +47,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 static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getUserAccountId; +import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUserEsiaId; /** * @author Eduard Tihomirov @@ -383,7 +383,7 @@ public class EsiaAuthService { private String getMessageId(Exception exception) { return Integer.toUnsignedString(Objects - .hashCode(getUserAccountId()), 36) + .hashCode(getCurrentUserEsiaId()), 36) + "-" + Integer.toUnsignedString(exception.hashCode(), 36); } diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java index 2f0aa62..d1dcafe 100644 --- a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java @@ -30,7 +30,7 @@ public final class SecurityUtil { .orElse(null); } - public static String getUserAccountId() { + public static String getCurrentUserEsiaId() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.isAuthenticated()) { return auth.getName(); From 3bb5425374f45307f3efc3d53cb410a7efe06957 Mon Sep 17 00:00:00 2001 From: Zaripov Emil Date: Fri, 31 Jan 2025 10:35:20 +0300 Subject: [PATCH 09/18] set version 1.9.4-SNAPSHOT --- backend/pom.xml | 2 +- distribution/pom.xml | 2 +- frontend/pom.xml | 2 +- pom.xml | 2 +- resources/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index e380b80..50a8be3 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ ru.micord.ervu.lkrp fl - 1.9.8 + 1.9.4-SNAPSHOT ru.micord.ervu.lkrp.fl backend diff --git a/distribution/pom.xml b/distribution/pom.xml index ae3bada..06b5df1 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.8 + 1.9.4-SNAPSHOT ru.micord.ervu.lkrp.fl diff --git a/frontend/pom.xml b/frontend/pom.xml index 9dcb0a5..183b3c5 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.8 + 1.9.4-SNAPSHOT ru.micord.ervu.lkrp.fl diff --git a/pom.xml b/pom.xml index 26d9f70..088bb1d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 ru.micord.ervu.lkrp fl - 1.9.8 + 1.9.4-SNAPSHOT pom backend diff --git a/resources/pom.xml b/resources/pom.xml index 5fc1987..94913d8 100644 --- a/resources/pom.xml +++ b/resources/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.8 + 1.9.4-SNAPSHOT ru.micord.ervu.lkrp.fl From f64cb4f89493be0ca5c64900c23f0fc6bf5a16ed Mon Sep 17 00:00:00 2001 From: gulnaz Date: Fri, 31 Jan 2025 12:52:07 +0300 Subject: [PATCH 10/18] SUPPORT-8817: fix after merge --- .../SummonsResponseDataConverter.java | 12 +- .../LK RP FL/screen-form-fl.page | 499 ++++++------------ 2 files changed, 165 insertions(+), 346 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java b/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java index a523b24..4610621 100644 --- a/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java +++ b/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java @@ -5,6 +5,8 @@ import java.util.Comparator; import java.util.List; import java.util.Optional; +import org.springframework.util.StringUtils; +import proto.ervu.rp.summons.RecruitmentInfo; import ru.micord.ervu.dto.Restriction; import ru.micord.ervu.dto.SubpoenaResponseDto; import org.springframework.stereotype.Component; @@ -29,6 +31,7 @@ public class SummonsResponseDataConverter { private static final String ACTUAL_ADDRESS_CODE = "_3"; public SubpoenaResponseDto convert(SummonsResponseData responseData) { + RecruitmentInfo recruitmentInfo = responseData.getRecruitmentInfo(); SubpoenaResponseDto.Builder builder = new SubpoenaResponseDto.Builder() .personName(responseData.getFirstName(), responseData.getMiddleName(), responseData.getLastName() @@ -40,10 +43,11 @@ public class SummonsResponseDataConverter { .issueOrg(responseData.getIssueOrg()) .issueIdCode(responseData.getIssueIdCode()) - .militaryCommissariatName(responseData.getRecruitmentInfo().getMilitaryCommissariatName()) - .recruitmentStatusCode( - Integer.parseInt(responseData.getRecruitmentInfo().getRecruitmentStatusCode())) - .recruitmentStartDate(responseData.getRecruitmentInfo().getRecruitmentStart()) + .militaryCommissariatName(recruitmentInfo.getMilitaryCommissariatName()) + .recruitmentStatusCode(StringUtils.hasText(recruitmentInfo.getRecruitmentStatusCode()) + ? Integer.parseInt(recruitmentInfo.getRecruitmentStatusCode()) + : 0) + .recruitmentStartDate(recruitmentInfo.getRecruitmentStart()) .residenceAddress(getAddressByCode(responseData.getAddressesList(), RESIDENCE_ADDRESS_CODE)) .stayAddress(getAddressByCode(responseData.getAddressesList(), STAY_ADDRESS_CODE)) diff --git a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page index 099f115..408d04c 100644 --- a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page +++ b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page @@ -1013,12 +1013,6 @@ - - - visible - - false - @@ -1329,6 +1323,57 @@ + + + + + + + + + _isGroupSelected + + false + + + + one + + + + conditionFirstPart + + + + objectValue + + + + behavior + + {"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"} + + + + method + + "getValue" + + + + + + + + + + operation + + "IS_NOT_EMPTY" + + + + @@ -1826,12 +1871,6 @@ "Запросить выписку" - - - visible - - false - @@ -4049,7 +4088,6 @@ 304824d5-9f9f-4af9-9b08-6232f7536774 FS - 1.1.3 (Воинский учёт) true - false false @@ -4139,6 +4177,7 @@ 8ae57bdb-4acb-4f34-9641-9b5031b408d3 VB - 1.1.3.1 (вы состоите на учете) сценаций true + false false @@ -4643,12 +4682,6 @@ - - - visible - - false - @@ -4764,12 +4797,6 @@ null - - - visible - - false - @@ -4929,12 +4956,6 @@ "Запросить выписку" - - - visible - - false - @@ -5710,7 +5731,7 @@ behavior - {"objectId":"63871032-9206-4f76-8c93-c8ab1b8200d2","packageName":"component.field","className":"NumberField","type":"TS"} + {"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"} @@ -5733,7 +5754,7 @@ staticValue - number + string 0.0 @@ -5745,7 +5766,7 @@ operation - "EQUALS" + "IS_NOT_EMPTY" @@ -5754,7 +5775,24 @@ - + + + + + + _isGroupSelected + + true + + + + group + + + + conditions + + @@ -5801,6 +5839,74 @@ + + + + + + + + + _isGroupSelected + + false + + + + one + + + + conditionFirstPart + + + + objectValue + + + + behavior + + {"objectId":"63871032-9206-4f76-8c93-c8ab1b8200d2","packageName":"component.field","className":"NumberField","type":"TS"} + + + + method + + "getValue" + + + + + + + + + + conditionSecondPart + + + + staticValue + + + number + + +0.0 + + + + + + + operation + + "EQUALS" + + + + @@ -5815,6 +5921,22 @@ + + + + + + + + + + logicalOperation + + "AND" + + + + thenActions @@ -7173,313 +7295,6 @@ - - - - - - - - - 98594cec-0a9b-4cef-af09-e1b71cb2ad9e - 315c5087-825a-4ade-99d9-7dbe09f87226 - AC - для найденного пользователя в ерву - false - false - - - - elseActions - - - - - - eventRefs - - - - - - behavior - - {"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"} - - - - propertyName - - "valueChangeEvent" - - - - - - - - - ifCondition - - - - conditions - - - - - - _isGroupSelected - - false - - - - one - - - - conditionFirstPart - - - - objectValue - - - - behavior - -{"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"} - - - - method - -"getValue" - - - - - - - - - - conditionSecondPart - - - - staticValue - - - string - - - "null" - - - - - - - operation - - "IS_NOT_EMPTY" - - - - - - - - - - - - - logicalOperation - - null - - - - - - - thenActions - - - - - - behavior - - {"objectId":"cfb60860-1b04-4eb5-9ccf-1e6436c27b09","packageName":"component.button","className":"Button","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - true - - - - - - - - - - - - - behavior - - {"objectId":"dd701bad-b22d-40c9-b00b-b92f070890db","packageName":"ervu.component.textwithdialoglinks","className":"TextWithDialogLinks","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - true - - - - - - - - - - - - - behavior - - {"objectId":"d68b5c38-9ed6-4596-9b0c-dd1dc542c5ef","packageName":"component.button","className":"Button","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - true - - - - - - - - - - - - - behavior - - {"objectId":"fea5aebc-c206-48bc-a613-ab31813fd639","packageName":"component.container","className":"HBox","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - true - - - - - - - - - - - - - behavior - - {"objectId":"d5fa2655-8dd8-4004-9dec-217a41e5b9ed","packageName":"component","className":"Text","type":"TS"} - - - - method - - "setVisible" - - - - value - - - - staticValue - - -boolean - - - true - - - - - - From 31105ecd92e81b95fdcb4cfb5e4238b870d4581c Mon Sep 17 00:00:00 2001 From: Zaripov Emil Date: Fri, 31 Jan 2025 12:55:02 +0300 Subject: [PATCH 11/18] set version 1.9.5-SNAPSHOT --- backend/pom.xml | 2 +- distribution/pom.xml | 2 +- frontend/pom.xml | 2 +- pom.xml | 2 +- resources/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 50a8be3..42d7e58 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ ru.micord.ervu.lkrp fl - 1.9.4-SNAPSHOT + 1.9.5-SNAPSHOT ru.micord.ervu.lkrp.fl backend diff --git a/distribution/pom.xml b/distribution/pom.xml index 06b5df1..092f591 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.4-SNAPSHOT + 1.9.5-SNAPSHOT ru.micord.ervu.lkrp.fl diff --git a/frontend/pom.xml b/frontend/pom.xml index 183b3c5..1aded6e 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.4-SNAPSHOT + 1.9.5-SNAPSHOT ru.micord.ervu.lkrp.fl diff --git a/pom.xml b/pom.xml index 088bb1d..c616010 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 ru.micord.ervu.lkrp fl - 1.9.4-SNAPSHOT + 1.9.5-SNAPSHOT pom backend diff --git a/resources/pom.xml b/resources/pom.xml index 94913d8..e2e1a4e 100644 --- a/resources/pom.xml +++ b/resources/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp fl - 1.9.4-SNAPSHOT + 1.9.5-SNAPSHOT ru.micord.ervu.lkrp.fl From 4138cce521527d2d7088d4dac98471092cd30666 Mon Sep 17 00:00:00 2001 From: Emir Suleimanov Date: Fri, 31 Jan 2025 15:59:45 +0300 Subject: [PATCH 12/18] SUPPORT-8884: add loggers --- .../impl/BaseReplyingKafkaService.java | 12 +++++- .../esia/service/EsiaAuthService.java | 37 +++++++------------ .../esia/service/EsiaPersonalDataService.java | 7 ++++ 3 files changed, 31 insertions(+), 25 deletions(-) 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 0eff937..2748c5e 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 @@ -1,10 +1,13 @@ package ru.micord.ervu.kafka.service.impl; +import java.lang.invoke.MethodHandles; import java.util.Optional; import java.util.concurrent.ExecutionException; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.producer.ProducerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; import org.springframework.kafka.requestreply.RequestReplyFuture; import ru.micord.ervu.kafka.service.ReplyingKafkaService; @@ -13,18 +16,25 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService; * @author gulnaz */ public abstract class BaseReplyingKafkaService implements ReplyingKafkaService { + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Override public V sendMessageAndGetReply(String requestTopic, String replyTopic, T requestMessage) { + long startTime = System.currentTimeMillis(); RequestReplyFuture replyFuture = getTemplate().sendAndReceive( getProducerRecord(requestTopic, replyTopic, requestMessage)); try { - return Optional.ofNullable(replyFuture.get()) + V result = Optional.ofNullable(replyFuture.get()) .map(ConsumerRecord::value) .orElseThrow(() -> new RuntimeException("Kafka return result is null")); + LOGGER.info("Thread {} - KafkaSendMessageAndGetReply: {} ms", + Thread.currentThread().getId(), System.currentTimeMillis() - startTime); + return result; } catch (InterruptedException | ExecutionException e) { + LOGGER.error("Thread {} - KafkaSendMessageAndGetReply: {} ms", + Thread.currentThread().getId(), System.currentTimeMillis() - startTime); throw new RuntimeException("Failed to get kafka response", e); } } 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 92df043..756e761 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 @@ -18,6 +18,7 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -234,11 +235,13 @@ public class EsiaAuthService { throw new EsiaException(e); } finally { - LOGGER.info("Thread {}: SignSecret: {}ms RequestAccessToken: {}ms VerifySecret: {}ms", + LOGGER.info("Thread {} - SignSecret: {} ms RequestAccessToken: {} ms VerifySecret: {} ms", Thread.currentThread().getId(), signSecret, requestAccessToken, verifySecret); } + PersonModel personModel = null; try { - Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr); + personModel = personalDataService.getPersonModel(esiaAccessTokenStr); + Response ervuIdResponse = getErvuIdResponse(personModel); createTokenAndAddCookie(response, prnOid, ervuIdResponse.getErvuId(), expiresIn); return ResponseEntity.ok("Authentication successful"); } @@ -313,7 +316,8 @@ public class EsiaAuthService { Long expiresIn = tokenResponse.getExpires_in(); EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn); EsiaTokensStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn); - Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr); + PersonModel personModel = personalDataService.getPersonModel(esiaAccessTokenStr); + Response ervuIdResponse = getErvuIdResponse(personModel); createTokenAndAddCookie(response, esiaAccessToken.getSbj_id(), ervuIdResponse.getErvuId(), expiresIn); } catch (Exception e) { @@ -372,27 +376,12 @@ public class EsiaAuthService { } } - public Response getErvuIdResponse(String accessToken) { - long requestPersonData = 0, requestIdERVU = 0; - try { - long startTime = System.currentTimeMillis(); - PersonModel personModel = personalDataService.getPersonModel(accessToken); - requestPersonData = System.currentTimeMillis() - startTime; - Person person = copyToPerson(personModel); - startTime = System.currentTimeMillis(); - String kafkaResponse = replyingKafkaService.sendMessageAndGetReply(requestTopic, - requestReplyTopic, objectMapper.writeValueAsString(person) - ); - requestIdERVU = System.currentTimeMillis() - startTime; - return objectMapper.readValue(kafkaResponse, Response.class); - } - catch (Exception e) { - throw new EsiaException(e); - } - finally { - LOGGER.info("Thread {}: RequestPersonData: {}ms RequestIdERVU: {}ms", - Thread.currentThread().getId(), requestPersonData, requestIdERVU); - } + public Response getErvuIdResponse(PersonModel personModel) throws JsonProcessingException { + Person person = copyToPerson(personModel); + String kafkaResponse = replyingKafkaService.sendMessageAndGetReply(requestTopic, + requestReplyTopic, objectMapper.writeValueAsString(person) + ); + return objectMapper.readValue(kafkaResponse, Response.class); } private Person copyToPerson(PersonModel personModel) { diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaPersonalDataService.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaPersonalDataService.java index fcee2c2..b434a9f 100644 --- a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaPersonalDataService.java +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaPersonalDataService.java @@ -1,5 +1,6 @@ package ru.micord.ervu.security.esia.service; +import java.lang.invoke.MethodHandles; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -8,6 +9,8 @@ import java.time.Duration; import java.util.Base64; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.micord.ervu.security.esia.exception.EsiaException; import ru.micord.ervu.security.esia.config.EsiaConfig; import ru.micord.ervu.security.esia.model.EsiaAccessToken; @@ -23,6 +26,7 @@ import org.springframework.stereotype.Service; */ @Service public class EsiaPersonalDataService implements PersonalDataService { + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Autowired private EsiaConfig esiaConfig; @@ -32,6 +36,7 @@ public class EsiaPersonalDataService implements PersonalDataService { @Override public PersonModel getPersonModel(String accessToken) { + long startTime = System.currentTimeMillis(); try { EsiaAccessToken esiaAccessToken = readToken(accessToken); String prnsId = esiaAccessToken.getSbj_id(); @@ -39,9 +44,11 @@ public class EsiaPersonalDataService implements PersonalDataService { personModel.setPassportModel( getPassportModel(prnsId, accessToken, personModel.getrIdDoc())); personModel.setPrnsId(prnsId); + LOGGER.info("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime); return personModel; } catch (Exception e) { + LOGGER.error("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime); throw new RuntimeException(e); } } From ba6e3c54da5a83387436a285f183a3fb0984720d Mon Sep 17 00:00:00 2001 From: gulnaz Date: Fri, 31 Jan 2025 16:59:20 +0300 Subject: [PATCH 13/18] SUPPORT-8817: add and use new proto class for empty extract --- .../ervu/controller/ExtractController.java | 64 +++++++++++-------- .../ProtoResponseUnknownRecruitData.proto | 27 ++++++++ 2 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 backend/src/main/resources/ProtoResponseUnknownRecruitData.proto diff --git a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java index f8de58e..9d6b12d 100644 --- a/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java +++ b/backend/src/main/java/ru/micord/ervu/controller/ExtractController.java @@ -3,6 +3,7 @@ package ru.micord.ervu.controller; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; import org.apache.kafka.common.utils.Bytes; import org.springframework.beans.factory.annotation.Value; @@ -48,37 +49,44 @@ public class ExtractController { @GetMapping(value = "/extract/{formatRegistry}") public ResponseEntity getExtract(@PathVariable String formatRegistry) { UserIdsPair userIdsPair = SecurityUtil.getUserIdsPair(); - String ervuId = userIdsPair.getErvuId(); - byte[] reply; - - if (ervuId != null) { - ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry); - reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic, - registryExtractReplyTopic, request - ).get(); - } - else { - String esiaUserId = userIdsPair.getEsiaUserId(); // esiaUserid is not null here - String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); - PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); - - ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto( - personModel.getLastName(), - personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), - personModel.getSnils(), formatRegistry - ); - reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic, - registryExtractReplyTopic, emptyRequest - ).get(); - } + String fileName; + ByteString file; try { - ResponseData responseData = ResponseData.parseFrom(reply); - ExtractRegistry extractRegistry = responseData.getDataRegistryInformation() - .getExtractRegistry(); - String encodedFilename = URLEncoder.encode(extractRegistry.getFileName(), StandardCharsets.UTF_8); - InputStreamResource resource = new InputStreamResource(extractRegistry.getFile().newInput()); + if (ervuId != null) { + ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry); + byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic, + registryExtractReplyTopic, request).get(); + ResponseData responseData = ResponseData.parseFrom(reply); + ExtractRegistry extractRegistry = responseData.getDataRegistryInformation() + .getExtractRegistry(); + fileName = extractRegistry.getFileName(); + file = extractRegistry.getFile(); + + } + else { + String esiaUserId = userIdsPair.getEsiaUserId(); // esiaUserid is not null here + String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId); + PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken); + + ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto( + personModel.getLastName(), + personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(), + personModel.getSnils(), formatRegistry + ); + byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic, + registryExtractReplyTopic, emptyRequest).get(); + rtl.pgs.ervu.proto.emptyrequest.ResponseData responseData = rtl.pgs.ervu.proto.emptyrequest.ResponseData + .parseFrom(reply); + rtl.pgs.ervu.proto.emptyrequest.ExtractRegistry extractRegistry = responseData.getDataRegistryInformation() + .getExtractRegistry(); + fileName = extractRegistry.getFileName(); + file = extractRegistry.getFile(); + } + + String encodedFilename = URLEncoder.encode(fileName, StandardCharsets.UTF_8); + InputStreamResource resource = new InputStreamResource(file.newInput()); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename) .contentType(MediaType.APPLICATION_OCTET_STREAM) diff --git a/backend/src/main/resources/ProtoResponseUnknownRecruitData.proto b/backend/src/main/resources/ProtoResponseUnknownRecruitData.proto new file mode 100644 index 0000000..807530a --- /dev/null +++ b/backend/src/main/resources/ProtoResponseUnknownRecruitData.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +package rtl.pgs.ervu.proto.emptyrequest; +import "google/protobuf/timestamp.proto"; + +option java_multiple_files = true; +option java_outer_classname = "LkrpUnknownRecruitResponse"; +option java_package = "rtl.pgs.ervu.proto.emptyrequest"; + +message ExtractRegistry { + string fileName = 1; + string fileType = 2; + string fileDatetime = 3; + bytes file = 4; +}; + +message DataRegistryInformation { + ExtractRegistry extractRegistry = 1; +}; + +message ResponseData { + string lastName = 1; + string firstName = 2; + string middleName = 3; + string birthDate = 4; + DataRegistryInformation dataRegistryInformation = 5; +}; \ No newline at end of file From 0485296824a0ea771e80c2395c8c1c580a34a038 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Mon, 3 Feb 2025 13:04:19 +0300 Subject: [PATCH 14/18] cherry-pick from SUPPORT-8874 --- frontend/src/ts/ervu/component/container/LoadForm.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/ervu/component/container/LoadForm.ts b/frontend/src/ts/ervu/component/container/LoadForm.ts index 3472e78..e73d7f5 100644 --- a/frontend/src/ts/ervu/component/container/LoadForm.ts +++ b/frontend/src/ts/ervu/component/container/LoadForm.ts @@ -18,7 +18,7 @@ export class LoadForm extends Container { private ervuDataService: ErvuDataService; private subscription: Subscription; private fields: any[]; - private fieldDataList: FieldData[] = []; + private fieldDataList: FieldData[]; constructor(el: ElementRef, cd: ChangeDetectorRef) { super(el, cd); @@ -30,7 +30,7 @@ export class LoadForm extends Container { } protected loadContainer(): Promise { - return Promise.resolve(this.loadData()); + return this.fieldDataList ? this.loadData() : Promise.resolve(); } initialize() { @@ -39,6 +39,7 @@ export class LoadForm extends Container { this.ervuDataService = this.injector.get(ErvuDataService); this.subscription = this.ervuDataService.message.subscribe(value => { if (value) { + this.fieldDataList = []; this.fields.forEach(field => { let fieldData: FieldData = new FieldData(); fieldData.componentGuid = field.objectId; From cc23362eed3d624e555cca50aba3724872b0f62c Mon Sep 17 00:00:00 2001 From: gulnaz Date: Tue, 4 Feb 2025 11:32:21 +0300 Subject: [PATCH 15/18] log events --- frontend/src/ts/ervu/component/button/ExtractLoadService.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/ts/ervu/component/button/ExtractLoadService.ts b/frontend/src/ts/ervu/component/button/ExtractLoadService.ts index a9b1feb..4efc0a8 100644 --- a/frontend/src/ts/ervu/component/button/ExtractLoadService.ts +++ b/frontend/src/ts/ervu/component/button/ExtractLoadService.ts @@ -26,7 +26,9 @@ export class ExtractLoadService extends Behavior { super.initialize(); this.button = this.getScript(AbstractButton); this.httpClient = this.injector.get(HttpClient); + this.errorEvent.subscribe(() => console.log("error event occurred", this.errorEvent)); this.onClickFunction = () => { + console.log("click event occurred"); this.httpClient.get('extract/' + this.formatRegistry, { responseType: 'blob', observe: 'response' From 1580e6326d9bf250771360faea1717310bf6902f Mon Sep 17 00:00:00 2001 From: "m.epshtein" Date: Wed, 5 Feb 2025 09:32:36 +0300 Subject: [PATCH 16/18] fix header --- frontend/src/resources/template/app/component/app_header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/resources/template/app/component/app_header.html b/frontend/src/resources/template/app/component/app_header.html index 1361200..65248a1 100644 --- a/frontend/src/resources/template/app/component/app_header.html +++ b/frontend/src/resources/template/app/component/app_header.html @@ -1,7 +1,7 @@