From 83901de08213e58f06ad6930f87a58ed5fb4696e Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Wed, 25 Sep 2024 14:00:12 +0300 Subject: [PATCH 01/34] SUPPORT-8556: Fix --- ...ProducerConfig.java => AvKafkaConfig.java} | 28 ++++++++++++++++--- .../model/fileupload/DownloadResponse.java | 7 +++++ .../EmployeeInfoFileUploadService.java | 22 +++++++++++++-- .../ervu/service/InteractionService.java | 2 ++ .../ervu/service/InteractionServiceImpl.java | 11 +++++++- 5 files changed, 62 insertions(+), 8 deletions(-) rename backend/src/main/java/ervu/{KafkaProducerConfig.java => AvKafkaConfig.java} (65%) create mode 100644 backend/src/main/java/ervu/model/fileupload/DownloadResponse.java diff --git a/backend/src/main/java/ervu/KafkaProducerConfig.java b/backend/src/main/java/ervu/AvKafkaConfig.java similarity index 65% rename from backend/src/main/java/ervu/KafkaProducerConfig.java rename to backend/src/main/java/ervu/AvKafkaConfig.java index d13116a8..a6082681 100644 --- a/backend/src/main/java/ervu/KafkaProducerConfig.java +++ b/backend/src/main/java/ervu/AvKafkaConfig.java @@ -4,21 +4,21 @@ import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.config.SaslConfigs; +import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.core.DefaultKafkaProducerFactory; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.kafka.core.ProducerFactory; +import org.springframework.kafka.core.*; /** * @author Alexandr Shalaginov */ @Configuration -public class KafkaProducerConfig { +public class AvKafkaConfig { @Value("${av.kafka.bootstrap.servers}") private String kafkaUrl; @Value("${av.kafka.security.protocol}") @@ -52,6 +52,26 @@ public class KafkaProducerConfig { return props; } + @Bean("av-cons-factory") + public ConsumerFactory consumerFactory() { + return new DefaultKafkaConsumerFactory<>(consumerConfig()); + } + + @Bean("av-cons-configs") + public Map consumerConfig() { + Map props = new HashMap<>(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + + props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); + props.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\"" + + username + "\" password=\"" + password + "\";"); + props.put(SaslConfigs.SASL_MECHANISM, saslMechanism); + + return props; + } + @Bean("av-template") public KafkaTemplate kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); diff --git a/backend/src/main/java/ervu/model/fileupload/DownloadResponse.java b/backend/src/main/java/ervu/model/fileupload/DownloadResponse.java new file mode 100644 index 00000000..25f28c08 --- /dev/null +++ b/backend/src/main/java/ervu/model/fileupload/DownloadResponse.java @@ -0,0 +1,7 @@ +package ervu.model.fileupload; + +/** + * @author r.latypov + */ +public record DownloadResponse(OrgInfo orgInfo, FileInfo fileInfo) { +} diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index a566eddd..c4b71b9d 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -9,14 +9,13 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.fileupload.FileUploadWebDavClient; -import ervu.model.fileupload.EmployeeInfoFileFormType; -import ervu.model.fileupload.EmployeeInfoKafkaMessage; -import ervu.model.fileupload.FileStatus; +import ervu.model.fileupload.*; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -147,4 +146,21 @@ public class EmployeeInfoFileUploadService { private String getTimeZone() { return ZonedDateTime.now().getOffset().toString(); } + + @KafkaListener(id = "${av.kafka.group.id}", topics = "${av.kafka.download.response}", + containerFactory = "av-cons-factory") + public void listenKafka(String kafkaMessage) { + ObjectMapper mapper = new ObjectMapper(); + try { + DownloadResponse downloadResponse = mapper.readValue(kafkaMessage, DownloadResponse.class); + FileInfo fileInfo = downloadResponse.fileInfo(); + interactionService.updateStatus(fileInfo.getFileId(), fileInfo.getFileStatus().getStatus(), + downloadResponse.orgInfo().getOrgId() + ); + } + catch (JsonProcessingException e) { + throw new RuntimeException(String.format("Fail get json from: %s", kafkaMessage), e); + } + + } } diff --git a/backend/src/main/java/ru/micord/ervu/service/InteractionService.java b/backend/src/main/java/ru/micord/ervu/service/InteractionService.java index 9be9cb11..fc61c684 100644 --- a/backend/src/main/java/ru/micord/ervu/service/InteractionService.java +++ b/backend/src/main/java/ru/micord/ervu/service/InteractionService.java @@ -13,4 +13,6 @@ public interface InteractionService { List get(String ervuId, String[] excludedStatuses); void setStatus(String fileId, String status, String fileName, String form, Timestamp timestamp, String sender, Integer count, String ervuId); + + void updateStatus(String fileId, String status, String ervuId); } diff --git a/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java b/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java index d2adcdd9..76f34cef 100644 --- a/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java +++ b/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java @@ -42,6 +42,15 @@ public class InteractionServiceImpl implements InteractionService { .set(INTERACTION_LOG.SENDER, sender) .set(INTERACTION_LOG.FILE_NAME, fileName) .set(INTERACTION_LOG.RECORDS_SENT, count) - .set(INTERACTION_LOG.ERVU_ID, ervuId); + .set(INTERACTION_LOG.ERVU_ID, ervuId) + .execute(); + } + + public void updateStatus(String fileId, String status, String ervuId) { + dslContext.update(INTERACTION_LOG) + .set(INTERACTION_LOG.STATUS, status) + .where(INTERACTION_LOG.ERVU_ID.eq(ervuId)) + .and(INTERACTION_LOG.FILE_ID.eq(fileId)) + .execute(); } } From a398e26794123aacc9c4da94cfb83be180e63259 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Thu, 26 Sep 2024 09:40:06 +0300 Subject: [PATCH 02/34] SUPPORT-8556: Fix --- backend/src/main/java/ervu/AvKafkaConfig.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/ervu/AvKafkaConfig.java b/backend/src/main/java/ervu/AvKafkaConfig.java index a6082681..9788644e 100644 --- a/backend/src/main/java/ervu/AvKafkaConfig.java +++ b/backend/src/main/java/ervu/AvKafkaConfig.java @@ -4,15 +4,17 @@ import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.CommonClientConfigs; -import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.config.SaslConfigs; -import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.core.*; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; /** * @author Alexandr Shalaginov From 723a4b965494d797f70e3fde3075e87ff611bc64 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Thu, 26 Sep 2024 14:10:57 +0300 Subject: [PATCH 03/34] SUPPORT-8556: Fix --- config/micord.env | 2 ++ config/standalone/dev/standalone.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/config/micord.env b/config/micord.env index 42f78eb9..66a9973c 100644 --- a/config/micord.env +++ b/config/micord.env @@ -15,6 +15,8 @@ AV_KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT AV_KAFKA_SASL_MECHANISM=SCRAM-SHA-256 AV_KAFKA_USERNAME=user1 AV_KAFKA_PASSWORD=Blfi9d2OFG +AV_KAFKA_GROUP_ID=1 +AV_KAFKA_DOWNLOAD_RESPONSE=file-status ERVU_FILEUPLOAD_MAX_FILE_SIZE=5242880 ERVU_FILEUPLOAD_MAX_REQUEST_SIZE=6291456 ERVU_FILEUPLOAD_FILE_SIZE_THRESHOLD=0 diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml index 9daf4143..49203d51 100644 --- a/config/standalone/dev/standalone.xml +++ b/config/standalone/dev/standalone.xml @@ -89,6 +89,8 @@ + + From c9d7135af8d76d122cf37275e564abb8ecb8604c Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Thu, 26 Sep 2024 14:19:01 +0300 Subject: [PATCH 04/34] SUPPORT-8556: Fix --- .../service/fileupload/EmployeeInfoFileUploadService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index c4b71b9d..634a53d0 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -9,7 +9,11 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.fileupload.FileUploadWebDavClient; -import ervu.model.fileupload.*; +import ervu.model.fileupload.DownloadResponse; +import ervu.model.fileupload.EmployeeInfoFileFormType; +import ervu.model.fileupload.EmployeeInfoKafkaMessage; +import ervu.model.fileupload.FileInfo; +import ervu.model.fileupload.FileStatus; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From ea48e67cb90adf5edcbb0668f0647b5e54ab8280 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Fri, 27 Sep 2024 09:45:12 +0300 Subject: [PATCH 05/34] SUPPORT-8556: Fix --- backend/src/main/java/ervu/AvKafkaConfig.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/ervu/AvKafkaConfig.java b/backend/src/main/java/ervu/AvKafkaConfig.java index 9788644e..ea74f176 100644 --- a/backend/src/main/java/ervu/AvKafkaConfig.java +++ b/backend/src/main/java/ervu/AvKafkaConfig.java @@ -7,6 +7,7 @@ import org.apache.kafka.clients.CommonClientConfigs; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.config.SaslConfigs; import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -34,12 +35,14 @@ public class AvKafkaConfig { @Value("${av.kafka.sasl.mechanism}") private String saslMechanism; - @Bean("av-factory") + @Bean() + @Qualifier("avProducerFactory") public ProducerFactory producerFactory() { return new DefaultKafkaProducerFactory<>(producerConfigs()); } - @Bean("av-configs") + @Bean() + @Qualifier("avProducerConfigs") public Map producerConfigs() { Map props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); @@ -54,13 +57,15 @@ public class AvKafkaConfig { return props; } - @Bean("av-cons-factory") + @Bean() + @Qualifier("avConsumerFactory") public ConsumerFactory consumerFactory() { - return new DefaultKafkaConsumerFactory<>(consumerConfig()); + return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } - @Bean("av-cons-configs") - public Map consumerConfig() { + @Bean() + @Qualifier("avConsumerConfigs") + public Map consumerConfigs() { Map props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); @@ -74,7 +79,8 @@ public class AvKafkaConfig { return props; } - @Bean("av-template") + @Bean() + @Qualifier("avTemplate") public KafkaTemplate kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); } From 6866bacf52b8aadf8a0c9c8fbd379a8740d2a35c Mon Sep 17 00:00:00 2001 From: "ivanov.denis" Date: Mon, 30 Sep 2024 15:34:19 +0300 Subject: [PATCH 06/34] ? --- backend/src/main/java/WebAppInitializer.java | 19 ++++++++++++------- config/micord.env | 4 ++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/WebAppInitializer.java b/backend/src/main/java/WebAppInitializer.java index a0fc7d01..f63b73b9 100644 --- a/backend/src/main/java/WebAppInitializer.java +++ b/backend/src/main/java/WebAppInitializer.java @@ -3,6 +3,8 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; +import com.hazelcast.internal.util.JsonUtil; +import org.jooq.impl.QOM; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import org.springframework.web.util.IntrospectorCleanupListener; @@ -13,13 +15,6 @@ import org.springframework.web.util.IntrospectorCleanupListener; */ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - @Value("${ervu.fileupload.max_file_size}") - private int maxFileSize; - @Value("${ervu.fileupload.max_request_size}") - private int maxRequestSize; - @Value("${ervu.fileupload.file_size_threshold}") - private int fileSizeThreshold; - public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); servletContext.addListener(new IntrospectorCleanupListener()); @@ -41,11 +36,21 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { + int maxFileSize = Integer.parseInt(System.getenv("ervu.fileupload.max_file_size")); + int maxRequestSize = Integer.parseInt(System.getenv("${ervu.fileupload.max_request_size}")); + int fileSizeThreshold = Integer.parseInt(System.getenv("${ervu.fileupload.file_size_threshold}")); + MultipartConfigElement multipartConfigElement = new MultipartConfigElement( "/tmp", maxFileSize, maxRequestSize, fileSizeThreshold); registration.setMultipartConfig(multipartConfigElement); + + System.out.println("=8=8> MFS : " + multipartConfigElement.getMaxFileSize()); + System.out.println("=8=8> MRS : " + multipartConfigElement.getMaxRequestSize()); + System.out.println("=8=8> FST : " + multipartConfigElement.getFileSizeThreshold()); + } + } diff --git a/config/micord.env b/config/micord.env index 34ef2345..84054311 100644 --- a/config/micord.env +++ b/config/micord.env @@ -46,3 +46,7 @@ ERVU_KAFKA_EXCERPT_REQUEST_TOPIC=ervu.lkrp.excerpt.request S3_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900 S3_ACCESS_KEY=rlTdTvkmSXu9FsLhfecw S3_SECRET_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0 + +ervu.fileupload.max_file_size=1 +ervu.fileupload.max_request_size=10 +ervu.fileupload.file_size_threshold=10 From 34c61c590667eb64d455fd436b390b5d241628a3 Mon Sep 17 00:00:00 2001 From: "ivanov.denis" Date: Mon, 30 Sep 2024 16:30:18 +0300 Subject: [PATCH 07/34] SUPPORT-8438 --- backend/src/main/java/WebAppInitializer.java | 33 ++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/WebAppInitializer.java b/backend/src/main/java/WebAppInitializer.java index f63b73b9..eb8e8ca2 100644 --- a/backend/src/main/java/WebAppInitializer.java +++ b/backend/src/main/java/WebAppInitializer.java @@ -4,7 +4,10 @@ import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import com.hazelcast.internal.util.JsonUtil; +import ervu.client.fileupload.FileUploadWebDavClient; import org.jooq.impl.QOM; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import org.springframework.web.util.IntrospectorCleanupListener; @@ -15,6 +18,8 @@ import org.springframework.web.util.IntrospectorCleanupListener; */ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + private static final Logger logger = LoggerFactory.getLogger(WebAppInitializer.class); + public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); servletContext.addListener(new IntrospectorCleanupListener()); @@ -36,9 +41,11 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { - int maxFileSize = Integer.parseInt(System.getenv("ervu.fileupload.max_file_size")); - int maxRequestSize = Integer.parseInt(System.getenv("${ervu.fileupload.max_request_size}")); - int fileSizeThreshold = Integer.parseInt(System.getenv("${ervu.fileupload.file_size_threshold}")); + + // read from env or assign default values + int maxFileSize = parseOrDefault("ervu.fileupload.max_file_size", 5242880); + int maxRequestSize = parseOrDefault("ervu.fileupload.max_request_size", 6291456); + int fileSizeThreshold = parseOrDefault("ervu.fileupload.file_size_threshold", 0); MultipartConfigElement multipartConfigElement = new MultipartConfigElement( "/tmp", @@ -47,10 +54,24 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet fileSizeThreshold); registration.setMultipartConfig(multipartConfigElement); - System.out.println("=8=8> MFS : " + multipartConfigElement.getMaxFileSize()); - System.out.println("=8=8> MRS : " + multipartConfigElement.getMaxRequestSize()); - System.out.println("=8=8> FST : " + multipartConfigElement.getFileSizeThreshold()); + logger.info("Max file upload size is set to: " + multipartConfigElement.getMaxFileSize()); + logger.info("Max file upload request is set to: " + multipartConfigElement.getMaxRequestSize()); + logger.info("File size threshold is set to: " + multipartConfigElement.getFileSizeThreshold()); } + private int parseOrDefault(String envVar, int defaultVal) { + String envVarValue = System.getenv(envVar); + if (envVar == null) { + logger.info("Environment variable {} is null, using default value: {}", envVar, defaultVal); + return defaultVal; + } + try { + return Integer.parseInt(envVarValue); + } catch (NumberFormatException e) { + logger.info("Environment variable {} is not an integer, using default value: {}", envVar, defaultVal); + return defaultVal; + } + } + } From f21375bcc7fb418124cce77631ae33d3da5d9af3 Mon Sep 17 00:00:00 2001 From: "ivanov.denis" Date: Mon, 30 Sep 2024 17:13:07 +0300 Subject: [PATCH 08/34] SUPPORT-8438 val fix --- config/micord.env | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/micord.env b/config/micord.env index 84054311..1bf5a099 100644 --- a/config/micord.env +++ b/config/micord.env @@ -47,6 +47,6 @@ S3_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900 S3_ACCESS_KEY=rlTdTvkmSXu9FsLhfecw S3_SECRET_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0 -ervu.fileupload.max_file_size=1 -ervu.fileupload.max_request_size=10 -ervu.fileupload.file_size_threshold=10 +ervu.fileupload.max_file_size=5242880 +ervu.fileupload.max_request_size=6291456 +ervu.fileupload.file_size_threshold=0 From dc8aa4649a03626fbc4df37da23bf468f1c83411 Mon Sep 17 00:00:00 2001 From: "ivanov.denis" Date: Mon, 30 Sep 2024 17:14:35 +0300 Subject: [PATCH 09/34] SUPPORT-8438 import fix --- backend/src/main/java/WebAppInitializer.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/WebAppInitializer.java b/backend/src/main/java/WebAppInitializer.java index eb8e8ca2..1804b3d1 100644 --- a/backend/src/main/java/WebAppInitializer.java +++ b/backend/src/main/java/WebAppInitializer.java @@ -1,17 +1,13 @@ +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; +import org.springframework.web.util.IntrospectorCleanupListener; + import javax.servlet.MultipartConfigElement; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; -import com.hazelcast.internal.util.JsonUtil; -import ervu.client.fileupload.FileUploadWebDavClient; -import org.jooq.impl.QOM; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; -import org.springframework.web.util.IntrospectorCleanupListener; - /** * This initializer creates root context and registers dispatcher servlet * Spring scans for initializers automatically From e7d83594c66b834349d97d6fabeb201fbcbeb504 Mon Sep 17 00:00:00 2001 From: "ivanov.denis" Date: Mon, 30 Sep 2024 18:15:49 +0300 Subject: [PATCH 10/34] SUPPORT-8438 import fix --- backend/src/main/java/WebAppInitializer.java | 8 ++++---- config/micord.env | 8 ++++---- config/standalone/dev/standalone.xml | 3 --- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/WebAppInitializer.java b/backend/src/main/java/WebAppInitializer.java index 1804b3d1..a4c6c7de 100644 --- a/backend/src/main/java/WebAppInitializer.java +++ b/backend/src/main/java/WebAppInitializer.java @@ -39,9 +39,9 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet protected void customizeRegistration(ServletRegistration.Dynamic registration) { // read from env or assign default values - int maxFileSize = parseOrDefault("ervu.fileupload.max_file_size", 5242880); - int maxRequestSize = parseOrDefault("ervu.fileupload.max_request_size", 6291456); - int fileSizeThreshold = parseOrDefault("ervu.fileupload.file_size_threshold", 0); + int maxFileSize = parseOrDefault("ERVU_FILE_UPLOAD_MAX_FILE_SIZE", 5242880); + int maxRequestSize = parseOrDefault("ERVU_FILE_UPLOAD_MAX_REQUEST_SIZE", 6291456); + int fileSizeThreshold = parseOrDefault("ERVU_FILE_UPLOAD_FILE_SIZE_THRESHOLD", 0); MultipartConfigElement multipartConfigElement = new MultipartConfigElement( "/tmp", @@ -51,7 +51,7 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet registration.setMultipartConfig(multipartConfigElement); logger.info("Max file upload size is set to: " + multipartConfigElement.getMaxFileSize()); - logger.info("Max file upload request is set to: " + multipartConfigElement.getMaxRequestSize()); + logger.info("Max file upload request size is set to: " + multipartConfigElement.getMaxRequestSize()); logger.info("File size threshold is set to: " + multipartConfigElement.getFileSizeThreshold()); } diff --git a/config/micord.env b/config/micord.env index 1bf5a099..6490f81a 100644 --- a/config/micord.env +++ b/config/micord.env @@ -43,10 +43,10 @@ ERVU_KAFKA_PASSWORD=Blfi9d2OFG ERVU_KAFKA_EXCERPT_REPLY_TOPIC=ervu.lkrp.excerpt.response ERVU_KAFKA_EXCERPT_REQUEST_TOPIC=ervu.lkrp.excerpt.request +ERVU_FILE_UPLOAD_MAX_FILE_SIZE=5242880 +ERVU_FILE_UPLOAD_MAX_REQUEST_SIZE=6291456 +ERVU_FILE_UPLOAD_FILE_SIZE_THRESHOLD=0 + S3_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900 S3_ACCESS_KEY=rlTdTvkmSXu9FsLhfecw S3_SECRET_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0 - -ervu.fileupload.max_file_size=5242880 -ervu.fileupload.max_request_size=6291456 -ervu.fileupload.file_size_threshold=0 diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml index a15698dd..f6dd18cf 100644 --- a/config/standalone/dev/standalone.xml +++ b/config/standalone/dev/standalone.xml @@ -64,9 +64,6 @@ - - - From dbddd2baa465bfba0a0faa15b9d338ccdce3bd8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D1=82=D0=BE=D0=B1=D0=B8=D0=BD=20=D0=95?= =?UTF-8?q?=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9?= Date: Tue, 1 Oct 2024 08:43:13 +0300 Subject: [PATCH 11/34] removed ervu profile --- pom.xml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/pom.xml b/pom.xml index e0f9936f..6d5f3c68 100644 --- a/pom.xml +++ b/pom.xml @@ -682,22 +682,5 @@ true - - ervu - - - rtlabs-public - rtlabs-public - https://nexus-dev.pgs.rtlabs.ru/repository/maven-public - - - - - rtlabs-public - rtlabs-public - https://nexus-dev.pgs.rtlabs.ru/repository/maven-public - - - From 365e5e4b7d1c33fcaf030167ddbc606b40ad52d7 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Tue, 1 Oct 2024 10:59:53 +0300 Subject: [PATCH 12/34] SUPPORT-8556: Fix --- config/micord.env | 2 +- config/standalone/dev/standalone.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/micord.env b/config/micord.env index 99fadcbc..90cc544f 100644 --- a/config/micord.env +++ b/config/micord.env @@ -16,7 +16,7 @@ AV_KAFKA_SASL_MECHANISM=SCRAM-SHA-256 AV_KAFKA_USERNAME=user1 AV_KAFKA_PASSWORD=Blfi9d2OFG AV_KAFKA_GROUP_ID=1 -AV_KAFKA_DOWNLOAD_RESPONSE=file-status +AV_KAFKA_DOWNLOAD_RESPONSE=ervu.lkrp.av-fileupload-status ERVU_FILEUPLOAD_MAX_FILE_SIZE=5242880 ERVU_FILEUPLOAD_MAX_REQUEST_SIZE=6291456 ERVU_FILEUPLOAD_FILE_SIZE_THRESHOLD=0 diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml index 2ff5e841..1fc85543 100644 --- a/config/standalone/dev/standalone.xml +++ b/config/standalone/dev/standalone.xml @@ -95,7 +95,7 @@ - + From b83cae8ed6c2bf935cca38de276cd615dc9a6b76 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Tue, 1 Oct 2024 11:54:15 +0300 Subject: [PATCH 13/34] fix --- .../ervu/service/fileupload/EmployeeInfoFileUploadService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 634a53d0..0bf6b378 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -57,7 +57,7 @@ public class EmployeeInfoFileUploadService { public EmployeeInfoFileUploadService( FileUploadWebDavClient fileWebDavUploadClient, EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, - @Qualifier("av-template") KafkaTemplate kafkaTemplate, InteractionService interactionService, + @Qualifier("avTemplate") KafkaTemplate kafkaTemplate, InteractionService interactionService, UlDataService ulDataService, JwtTokenService jwtTokenService) { this.fileWebDavUploadClient = fileWebDavUploadClient; this.employeeInfoKafkaMessageService = employeeInfoKafkaMessageService; From e09381a0fe5b46a8c9b7c724a3cb246229b8e8d4 Mon Sep 17 00:00:00 2001 From: "m.epshtein" Date: Tue, 1 Oct 2024 13:43:10 +0300 Subject: [PATCH 14/34] change title --- frontend/index.html | 2 +- frontend/index.webpack.html | 2 +- frontend/preview.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 9e17d92e..a69a12ac 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,7 +1,7 @@ - ervu_lkrp_ul + Личный кабинет юр.лица diff --git a/frontend/index.webpack.html b/frontend/index.webpack.html index e470e781..54801a3c 100644 --- a/frontend/index.webpack.html +++ b/frontend/index.webpack.html @@ -1,7 +1,7 @@ - ervu_lkrp_ul + Личный кабинет юр.лица diff --git a/frontend/preview.html b/frontend/preview.html index 04126dc0..79b309ff 100644 --- a/frontend/preview.html +++ b/frontend/preview.html @@ -1,7 +1,7 @@ - Web BPM + Личный кабинет юр.лица From 8208e54fd5b02f5e6f2dc8528502b18624db8726 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Wed, 2 Oct 2024 11:12:58 +0300 Subject: [PATCH 15/34] fix beans and consumer config --- backend/src/main/java/ervu/AvKafkaConfig.java | 38 ++++++++++--------- .../EmployeeInfoFileUploadService.java | 2 +- .../ervu/kafka/ReplyingKafkaConfig.java | 34 +++++++---------- .../impl/BaseReplyingKafkaServiceImpl.java | 16 +++++--- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/backend/src/main/java/ervu/AvKafkaConfig.java b/backend/src/main/java/ervu/AvKafkaConfig.java index ea74f176..feb31556 100644 --- a/backend/src/main/java/ervu/AvKafkaConfig.java +++ b/backend/src/main/java/ervu/AvKafkaConfig.java @@ -4,13 +4,15 @@ import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.config.SaslConfigs; +import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; import org.springframework.kafka.core.DefaultKafkaProducerFactory; @@ -35,14 +37,12 @@ public class AvKafkaConfig { @Value("${av.kafka.sasl.mechanism}") private String saslMechanism; - @Bean() - @Qualifier("avProducerFactory") - public ProducerFactory producerFactory() { + @Bean + public ProducerFactory avProducerFactory() { return new DefaultKafkaProducerFactory<>(producerConfigs()); } - @Bean() - @Qualifier("avProducerConfigs") + @Bean public Map producerConfigs() { Map props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); @@ -57,19 +57,17 @@ public class AvKafkaConfig { return props; } - @Bean() - @Qualifier("avConsumerFactory") - public ConsumerFactory consumerFactory() { + @Bean + public ConsumerFactory avConsumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } - @Bean() - @Qualifier("avConsumerConfigs") + @Bean public Map consumerConfigs() { Map props = new HashMap<>(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); props.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\"" @@ -79,10 +77,16 @@ public class AvKafkaConfig { return props; } - @Bean() - @Qualifier("avTemplate") + @Bean("avContainerFactory") + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(avConsumerFactory()); + return factory; + } + + @Bean("avTemplate") public KafkaTemplate kafkaTemplate() { - return new KafkaTemplate<>(producerFactory()); + return new KafkaTemplate<>(avProducerFactory()); } } diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 0bf6b378..9b3b8596 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -152,7 +152,7 @@ public class EmployeeInfoFileUploadService { } @KafkaListener(id = "${av.kafka.group.id}", topics = "${av.kafka.download.response}", - containerFactory = "av-cons-factory") + containerFactory = "avContainerFactory") public void listenKafka(String kafkaMessage) { ObjectMapper mapper = new ObjectMapper(); try { diff --git a/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java index 978edc16..bcb64b1d 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java @@ -6,7 +6,6 @@ import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.config.SaslConfigs; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -48,8 +47,8 @@ public class ReplyingKafkaConfig { @Value("${ervu.kafka.sasl.mechanism}") private String saslMechanism; - @Bean("ervu") - public ProducerFactory producerFactory() { + @Bean + public ProducerFactory ervuProducerFactory() { Map configProps = new HashMap<>(); configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); @@ -61,14 +60,13 @@ public class ReplyingKafkaConfig { return new DefaultKafkaProducerFactory<>(configProps); } - @Bean - @Qualifier("ervu") + @Bean("ervuTemplate") public KafkaTemplate kafkaTemplate() { - return new KafkaTemplate<>(producerFactory()); + return new KafkaTemplate<>(ervuProducerFactory()); } - @Bean - public ConsumerFactory consumerFactory() { + @Bean("ervuConsumerFactory") + public ConsumerFactory ervuConsumerFactory() { Map configProps = new HashMap<>(); configProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); @@ -84,12 +82,11 @@ public class ReplyingKafkaConfig { @Bean public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); - factory.setConsumerFactory(consumerFactory()); + factory.setConsumerFactory(ervuConsumerFactory()); return factory; } -// @Bean() -// @Qualifier("excerpt-container") +// @Bean("excerpt-container") // public ConcurrentMessageListenerContainer excerptReplyContainer( // ConcurrentKafkaListenerContainerFactory factory) { // ConcurrentMessageListenerContainer container = factory.createContainer( @@ -98,16 +95,14 @@ public class ReplyingKafkaConfig { // return container; // } // -// @Bean() -// @Qualifier("excerpt-template") +// @Bean("excerpt-template") // public ReplyingKafkaTemplate excerptReplyingKafkaTemplate( // @Qualifier("ervu") ProducerFactory pf, // @Qualifier("excerpt-container") ConcurrentMessageListenerContainer container) { // return initReplyingKafkaTemplate(pf, container); // } // -// @Bean -// @Qualifier("org") +// @Bean("org") // public ConcurrentMessageListenerContainer replyContainer( // ConcurrentKafkaListenerContainerFactory factory) { // ConcurrentMessageListenerContainer container = factory.createContainer( @@ -116,8 +111,7 @@ public class ReplyingKafkaConfig { // return container; // } // -// @Bean -// @Qualifier("journal") +// @Bean("journal") // public ConcurrentMessageListenerContainer journalReplyContainer( // ConcurrentKafkaListenerContainerFactory factory) { // ConcurrentMessageListenerContainer container = factory.createContainer( @@ -126,16 +120,14 @@ public class ReplyingKafkaConfig { // return container; // } // -// @Bean -// @Qualifier("org") +// @Bean("org") // public ReplyingKafkaTemplate orgReplyingKafkaTemplate( // @Qualifier("ervu") ProducerFactory pf, // @Qualifier("org") ConcurrentMessageListenerContainer container) { // return initReplyingKafkaTemplate(pf, container); // } // -// @Bean -// @Qualifier("journal") +// @Bean("journal") // public ReplyingKafkaTemplate journalReplyingKafkaTemplate( // @Qualifier("ervu") ProducerFactory pf, // @Qualifier("journal") ConcurrentMessageListenerContainer container) { diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java index de3ef9ed..982210fb 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java @@ -26,18 +26,22 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService; @Service public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { -// protected abstract ReplyingKafkaTemplate getReplyingKafkaTemplate(); - @Autowired - @Qualifier("ervu") - private KafkaTemplate kafkaTemplate; - @Autowired - private ConsumerFactory consumerFactory; +// protected abstract ReplyingKafkaTemplate getReplyingKafkaTemplate() + private final KafkaTemplate kafkaTemplate; + private final ConsumerFactory consumerFactory; @Value("${ervu.kafka.group.id}") private String groupId; @Value("${ervu.kafka.reply.timeout:30}") private long replyTimeout; + public BaseReplyingKafkaServiceImpl( + @Qualifier("ervuTemplate") KafkaTemplate kafkaTemplate, + @Qualifier("ervuConsumerFactory") ConsumerFactory consumerFactory) { + this.kafkaTemplate = kafkaTemplate; + this.consumerFactory = consumerFactory; + } + public String sendMessageAndGetReply(String requestTopic, String replyTopic, String requestMessage) { From eb74e7296a2f4c0e809df3e3cd177e8958c5e52a Mon Sep 17 00:00:00 2001 From: gulnaz Date: Wed, 2 Oct 2024 11:18:27 +0300 Subject: [PATCH 16/34] fix getter name --- backend/src/main/java/ervu/model/fileupload/OrgInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ervu/model/fileupload/OrgInfo.java b/backend/src/main/java/ervu/model/fileupload/OrgInfo.java index 215fed6e..6258d139 100644 --- a/backend/src/main/java/ervu/model/fileupload/OrgInfo.java +++ b/backend/src/main/java/ervu/model/fileupload/OrgInfo.java @@ -26,7 +26,7 @@ public class OrgInfo { return orgId; } - public SenderInfo getPrnOid() { + public SenderInfo getSenderInfo() { return senderInfo; } From c955d835750c2f66abeeb153c3820fe0b4ff25b7 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Wed, 2 Oct 2024 16:28:11 +0300 Subject: [PATCH 17/34] sync --- .../java/ervu/model/fileupload/FileInfo.java | 19 +++++++++++-------- .../java/ervu/model/fileupload/OrgInfo.java | 9 ++++++--- .../EmployeeInfoFileUploadService.java | 3 +++ .../ervu/journal/mapper/JournalDtoMapper.java | 2 +- .../src/resources/css/components-lkrp.css | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/ervu/model/fileupload/FileInfo.java b/backend/src/main/java/ervu/model/fileupload/FileInfo.java index 4b988a12..5ee94d48 100644 --- a/backend/src/main/java/ervu/model/fileupload/FileInfo.java +++ b/backend/src/main/java/ervu/model/fileupload/FileInfo.java @@ -6,14 +6,17 @@ import java.util.Objects; * @author Alexandr Shalaginov */ public class FileInfo { - private final String fileId; - private final String fileUrl; - private final String fileName; - private final String filePatternCode; - private final String filePatternName; - private final String departureDateTime; - private final String timeZone; - private final FileStatus fileStatus; + private String fileId; + private String fileUrl; + private String fileName; + private String filePatternCode; + private String filePatternName; + private String departureDateTime; + private String timeZone; + private FileStatus fileStatus; + + public FileInfo() { + } public FileInfo(String fileId, String fileUrl, String fileName, String filePatternCode, String filePatternName, String departureDateTime, String timeZone, FileStatus fileStatus) { diff --git a/backend/src/main/java/ervu/model/fileupload/OrgInfo.java b/backend/src/main/java/ervu/model/fileupload/OrgInfo.java index 6258d139..767f3e3c 100644 --- a/backend/src/main/java/ervu/model/fileupload/OrgInfo.java +++ b/backend/src/main/java/ervu/model/fileupload/OrgInfo.java @@ -8,9 +8,12 @@ import ru.micord.ervu.journal.SenderInfo; * @author Alexandr Shalaginov */ public class OrgInfo { - private final String orgName; - private final String orgId; - private final SenderInfo senderInfo; + private String orgName; + private String orgId; + private SenderInfo senderInfo; + + public OrgInfo() { + } public OrgInfo(String orgName, String orgId, SenderInfo senderInfo) { this.orgName = orgName; diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 9b3b8596..8a46b011 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -1,5 +1,6 @@ package ervu.service.fileupload; +import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.ZonedDateTime; @@ -114,6 +115,8 @@ public class EmployeeInfoFileUploadService { private boolean sendMessage(String message) { ProducerRecord record = new ProducerRecord<>(this.kafkaTopicName, message); + record.headers().add("messageId", UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8)); + try { this.kafkaTemplate.send(record).get(); logger.debug("Success send record: {}", record); diff --git a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java index 04ef7522..6e34656e 100644 --- a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java +++ b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java @@ -33,7 +33,7 @@ public class JournalDtoMapper { return new JournalDto() .setDepartureDateTime(record.getSentDate().toString()) .setFileName(record.getFileName()) - .setFilePatternCode(Integer.valueOf(record.getForm().replace("№", ""))) + .setFilePatternCode(0) .setSenderFio(record.getSender()) .setStatus(record.getStatus()) .setFilesSentCount(record.getRecordsSent()) diff --git a/frontend/src/resources/css/components-lkrp.css b/frontend/src/resources/css/components-lkrp.css index 306dde4b..5ca59300 100644 --- a/frontend/src/resources/css/components-lkrp.css +++ b/frontend/src/resources/css/components-lkrp.css @@ -565,7 +565,7 @@ .webbpm.ervu_lkrp_ul .journal .grid { flex-direction: column; flex: 1 1 auto; - height: 100px; + height: 300px; } .webbpm.ervu_lkrp_ul .journal .fieldset button-component { display: block; From fd4cb5ee242f6cd37f695e172f4189ccd377ce53 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Thu, 3 Oct 2024 11:26:10 +0300 Subject: [PATCH 18/34] SUPPORT-8584: Fix --- .../ervu/kafka/model/ExcerptResponse.java | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/ExcerptResponse.java b/backend/src/main/java/ru/micord/ervu/kafka/model/ExcerptResponse.java index 51ec48f1..b0d79c7e 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/model/ExcerptResponse.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/ExcerptResponse.java @@ -1,9 +1,6 @@ package ru.micord.ervu.kafka.model; import java.io.Serializable; -import java.util.Date; - -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -13,25 +10,10 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; public class ExcerptResponse implements Serializable { private static final long serialVersionUID = 1L; - private String excerptId; - private String orgId; private String fileUrl; - @JsonFormat(pattern = "dd.MM.yyyy HH:mm") - private Date departureDateTime; - - private String timeZone; - - public String getExcerptId() { - return excerptId; - } - - public void setExcerptId(String excerptId) { - this.excerptId = excerptId; - } - public String getOrgId() { return orgId; } @@ -40,22 +22,6 @@ public class ExcerptResponse implements Serializable { this.orgId = orgId; } - public Date getDepartureDateTime() { - return departureDateTime; - } - - public void setDepartureDateTime(Date departureDateTime) { - this.departureDateTime = departureDateTime; - } - - public String getTimeZone() { - return timeZone; - } - - public void setTimeZone(String timeZone) { - this.timeZone = timeZone; - } - public String getFileUrl() { return fileUrl; } From e03f255df3b8d6701d7525a109e2e91a8323aa66 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Thu, 3 Oct 2024 11:59:26 +0300 Subject: [PATCH 19/34] SUPPORT-8583: exclude some file statuses --- config/micord.env | 1 + config/standalone/dev/standalone.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/micord.env b/config/micord.env index 3d3f7e5c..a97a326e 100644 --- a/config/micord.env +++ b/config/micord.env @@ -36,6 +36,7 @@ ERVU_KAFKA_ORG_REQUEST_TOPIC=ervu.organization.request ERVU_KAFKA_REPLY_TIMEOUT=30 ERVU_KAFKA_JOURNAL_REQUEST_TOPIC=ervu.organization.journal.request ERVU_KAFKA_JOURNAL_REPLY_TOPIC=ervu.organization.journal.response +DB.JOURNAL.EXCLUDED.STATUSES=Направлено в ЕРВУ,Получен ЕРВУ ESNSI_OKOPF_URL=https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&encoding=UTF_8 ESNSI_OKOPF_CRON_LOAD=0 0 */1 * * * ERVU_KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml index ce22e429..908d4e1a 100644 --- a/config/standalone/dev/standalone.xml +++ b/config/standalone/dev/standalone.xml @@ -86,6 +86,7 @@ + From d44217da39952f2f0bdf31c255d54b50e3f4c6ef Mon Sep 17 00:00:00 2001 From: gulnaz Date: Thu, 3 Oct 2024 11:59:45 +0300 Subject: [PATCH 20/34] SUPPORT-8583: fix timezone --- .../service/fileupload/EmployeeInfoFileUploadService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 8a46b011..c66c78c5 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -3,6 +3,7 @@ package ervu.service.fileupload; import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.UUID; @@ -37,7 +38,7 @@ import ru.micord.ervu.service.InteractionService; @Service public class EmployeeInfoFileUploadService { private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); - private static final String FORMAT = "dd.MM.yyyy HH:mm"; + private static final String FORMAT = "dd.MM.yyyy HH:mm:ss"; private final FileUploadWebDavClient fileWebDavUploadClient; private final EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService; @@ -151,7 +152,7 @@ public class EmployeeInfoFileUploadService { } private String getTimeZone() { - return ZonedDateTime.now().getOffset().toString(); + return ZonedDateTime.now(ZoneId.systemDefault()).getOffset().getId(); } @KafkaListener(id = "${av.kafka.group.id}", topics = "${av.kafka.download.response}", From 9f9d2431215357c46cb6628b5e64ac8fcb45efa9 Mon Sep 17 00:00:00 2001 From: Makarova Elena Date: Thu, 3 Oct 2024 12:53:50 +0300 Subject: [PATCH 21/34] height=100% --- .../business-model/Журнал взаимодействия.page | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/resources/src/main/resources/business-model/Журнал взаимодействия.page b/resources/src/main/resources/business-model/Журнал взаимодействия.page index 4680efd5..e84fe79b 100644 --- a/resources/src/main/resources/business-model/Журнал взаимодействия.page +++ b/resources/src/main/resources/business-model/Журнал взаимодействия.page @@ -636,6 +636,19 @@ "CLIENT_SIDE" + + style + + + + height + + "100%" + + + + + @@ -1277,8 +1290,8 @@ false false - true false + true From c2a719221718b08f644ad362ea07988100234b92 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Thu, 3 Oct 2024 17:11:56 +0300 Subject: [PATCH 22/34] fix --- .../ru/micord/ervu/security/esia/service/EsiaAuthService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 2ae17bb2..5950ce20 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 @@ -451,8 +451,8 @@ public class EsiaAuthService { brhs.setBrhOid(brhsModel.getBrhOid()); brhs.setKpp(brhsModel.getKpp()); brhs.setLeg(brhsModel.getLeg()); - brhs.setAddresses(brhsModel.getAddresses().getElements()); - brhs.setContacts(brhsModel.getContacts().getElements()); + brhs.setAddresses(brhsModel.getAddresses() != null ? brhsModel.getAddresses().getElements() : null); + brhs.setContacts(brhsModel.getContacts() != null ? brhsModel.getContacts().getElements() : null); return brhs; }).toArray(Brhs[]::new)); orgInfo.setAddresses(organizationModel.getAddresses().getElements()); From 7505aab3629d9535bf724cf663b4b22a33858a20 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Fri, 4 Oct 2024 17:01:50 +0300 Subject: [PATCH 23/34] SUPPORT-8583: pass client time zone to request header --- .../EmployeeInfoFileUploadController.java | 27 ++++++++++++++----- .../EmployeeInfoFileUploadService.java | 13 +++------ .../java/ru/micord/ervu/util/DateUtil.java | 2 +- .../component/fileupload/ErvuFileUpload.ts | 14 +++++++--- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java index d9e8b0c4..100972d3 100644 --- a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java +++ b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java @@ -1,11 +1,17 @@ package ervu.controller; +import java.time.ZonedDateTime; +import java.util.TimeZone; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import ervu.service.fileupload.EmployeeInfoFileUploadService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; /** @@ -21,7 +27,8 @@ public class EmployeeInfoFileUploadController { @RequestMapping(value = "/employee/document", method = RequestMethod.POST) public ResponseEntity saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile, - @RequestHeader("X-Employee-Info-File-Form-Type") String formType, HttpServletRequest request) { + @RequestHeader("X-Employee-Info-File-Form-Type") String formType, + @RequestHeader("Client-Time-Zone") String clientTimeZone, HttpServletRequest request) { String accessToken = null; String authToken = null; Cookie[] cookies = request.getCookies(); @@ -35,11 +42,17 @@ public class EmployeeInfoFileUploadController { } } } - if (accessToken != null && this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, accessToken, authToken)) { - return ResponseEntity.ok("File successfully uploaded."); - } - else { - return ResponseEntity.internalServerError().body("An error occurred while uploading file."); + + if (accessToken != null) { + String timeZone = ZonedDateTime.now(TimeZone.getTimeZone(clientTimeZone).toZoneId()) + .getOffset().getId(); + + if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, accessToken, + authToken, timeZone)) { + return ResponseEntity.ok("File successfully uploaded."); + } } + + return ResponseEntity.internalServerError().body("An error occurred while uploading file."); } } diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index c66c78c5..b6398db0 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -3,8 +3,6 @@ package ervu.service.fileupload; import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.UUID; @@ -59,7 +57,8 @@ public class EmployeeInfoFileUploadService { public EmployeeInfoFileUploadService( FileUploadWebDavClient fileWebDavUploadClient, EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, - @Qualifier("avTemplate") KafkaTemplate kafkaTemplate, InteractionService interactionService, + @Qualifier("avTemplate") KafkaTemplate kafkaTemplate, + InteractionService interactionService, UlDataService ulDataService, JwtTokenService jwtTokenService) { this.fileWebDavUploadClient = fileWebDavUploadClient; this.employeeInfoKafkaMessageService = employeeInfoKafkaMessageService; @@ -70,11 +69,10 @@ public class EmployeeInfoFileUploadService { } public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType, - String accessToken, String authToken) { + String accessToken, String authToken, String timeZone) { String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename()); LocalDateTime now = LocalDateTime.now(); String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT));; - String timeZone = getTimeZone(); if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) { FileStatus fileStatus = new FileStatus(); @@ -151,10 +149,6 @@ public class EmployeeInfoFileUploadService { } } - private String getTimeZone() { - return ZonedDateTime.now(ZoneId.systemDefault()).getOffset().getId(); - } - @KafkaListener(id = "${av.kafka.group.id}", topics = "${av.kafka.download.response}", containerFactory = "avContainerFactory") public void listenKafka(String kafkaMessage) { @@ -169,6 +163,5 @@ public class EmployeeInfoFileUploadService { catch (JsonProcessingException e) { throw new RuntimeException(String.format("Fail get json from: %s", kafkaMessage), e); } - } } diff --git a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java index b89d75ad..80644b92 100644 --- a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java +++ b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java @@ -14,7 +14,7 @@ import static org.springframework.util.StringUtils.hasText; public final class DateUtil { private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); - private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); private DateUtil() {} diff --git a/frontend/src/ts/ervu/component/fileupload/ErvuFileUpload.ts b/frontend/src/ts/ervu/component/fileupload/ErvuFileUpload.ts index efcb412a..3e0da6a8 100644 --- a/frontend/src/ts/ervu/component/fileupload/ErvuFileUpload.ts +++ b/frontend/src/ts/ervu/component/fileupload/ErvuFileUpload.ts @@ -91,10 +91,16 @@ export class ErvuFileUpload extends InputControl { }], maxFileSize: this.maxFileSizeMb ? this.maxFileSizeMb * 1024 * 1024 : undefined, queueLimit: this.maxFilesToUpload ? this.maxFilesToUpload : undefined, - headers: [{ - name: "X-Employee-Info-File-Form-Type", - value: EmployeeInfoFileFormType[this.formType] - }] + headers: [ + { + name: "X-Employee-Info-File-Form-Type", + value: EmployeeInfoFileFormType[this.formType] + }, + { + name: "Client-Time-Zone", + value: Intl.DateTimeFormat().resolvedOptions().timeZone + } + ] }); this.setUploaderMethods(); From 4f7555d59249b3841b54a575214b491d1a8bd990 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Mon, 7 Oct 2024 09:52:22 +0300 Subject: [PATCH 24/34] SUPPORT-8583: rename timeZone to offset --- .../ervu/controller/EmployeeInfoFileUploadController.java | 4 ++-- .../service/fileupload/EmployeeInfoFileUploadService.java | 4 ++-- .../fileupload/EmployeeInfoKafkaMessageService.java | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java index 100972d3..310a9acd 100644 --- a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java +++ b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java @@ -44,11 +44,11 @@ public class EmployeeInfoFileUploadController { } if (accessToken != null) { - String timeZone = ZonedDateTime.now(TimeZone.getTimeZone(clientTimeZone).toZoneId()) + String offset = ZonedDateTime.now(TimeZone.getTimeZone(clientTimeZone).toZoneId()) .getOffset().getId(); if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, accessToken, - authToken, timeZone)) { + authToken, offset)) { return ResponseEntity.ok("File successfully uploaded."); } } diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index b6398db0..7747496c 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -69,7 +69,7 @@ public class EmployeeInfoFileUploadService { } public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType, - String accessToken, String authToken, String timeZone) { + String accessToken, String authToken, String offset) { String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename()); LocalDateTime now = LocalDateTime.now(); String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT));; @@ -94,7 +94,7 @@ public class EmployeeInfoFileUploadService { employeeInfoFileFormType, departureDateTime, accessToken, - timeZone, + offset, fileStatus, ids[1], ids[0], diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java index f3b0d830..8afc0242 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java @@ -25,7 +25,7 @@ public class EmployeeInfoKafkaMessageService { public EmployeeInfoKafkaMessage getKafkaMessage(String fileId, String fileUrl, String fileName, EmployeeInfoFileFormType formType, String departureDateTime, String accessToken, - String timeZone, FileStatus fileStatus, String ervuId, String prnOid, PersonModel personModel) { + String offset, FileStatus fileStatus, String ervuId, String prnOid, PersonModel personModel) { return new EmployeeInfoKafkaMessage( getOrgInfo(accessToken, ervuId, prnOid, personModel), getFileInfo( @@ -34,14 +34,14 @@ public class EmployeeInfoKafkaMessageService { fileName, formType, departureDateTime, - timeZone, + offset, fileStatus ) ); } private FileInfo getFileInfo(String fileId, String fileUrl, String fileName, - EmployeeInfoFileFormType formType, String departureDateTime, String timeZone, + EmployeeInfoFileFormType formType, String departureDateTime, String offset, FileStatus fileStatus) { return new FileInfo( fileId, @@ -50,7 +50,7 @@ public class EmployeeInfoKafkaMessageService { formType.getFilePatternCode(), formType.getFilePatternName(), departureDateTime, - timeZone, + offset, fileStatus ); } From a8b13286b0e6f150dffe82497ecc9d4bc0246010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D1=82=D0=BE=D0=B1=D0=B8=D0=BD?= Date: Mon, 7 Oct 2024 09:58:17 +0300 Subject: [PATCH 25/34] updated version --- 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 fadaee82..118bc756 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ ru.micord.ervu.lkrp ul - 1.0.0-SNAPSHOT + 1.8.0-SNAPSHOT ru.micord.ervu.lkrp.ul backend diff --git a/distribution/pom.xml b/distribution/pom.xml index 6d789477..daa88118 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp ul - 1.0.0-SNAPSHOT + 1.8.0-SNAPSHOT ru.micord.ervu.lkrp.ul diff --git a/frontend/pom.xml b/frontend/pom.xml index d6ad792a..775e1b24 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp ul - 1.0.0-SNAPSHOT + 1.8.0-SNAPSHOT ru.micord.ervu.lkrp.ul diff --git a/pom.xml b/pom.xml index 6d5f3c68..f73ed156 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 ru.micord.ervu.lkrp ul - 1.0.0-SNAPSHOT + 1.8.0-SNAPSHOT pom backend diff --git a/resources/pom.xml b/resources/pom.xml index b532ba42..178bdb3b 100644 --- a/resources/pom.xml +++ b/resources/pom.xml @@ -4,7 +4,7 @@ ru.micord.ervu.lkrp ul - 1.0.0-SNAPSHOT + 1.8.0-SNAPSHOT ru.micord.ervu.lkrp.ul From 5967180bde55a282c57c471722bd80e4396cabcd Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Mon, 7 Oct 2024 11:07:53 +0300 Subject: [PATCH 26/34] SUPPORT-8584: Fix --- .../ervu/config/ErvuDispatcherConfig.java | 27 +++++++++++++++++++ .../kafka/controller/ErvuKafkaController.java | 8 ++---- .../java/ru/micord/ervu/s3/S3Connection.java | 7 +++-- .../java/ru/micord/ervu/s3/S3Service.java | 9 +++---- .../button/ErvuDownloadFileButton.ts | 10 +++++-- 5 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java diff --git a/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java b/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java new file mode 100644 index 00000000..fe3362f1 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java @@ -0,0 +1,27 @@ +package ru.micord.ervu.config; + +import java.util.List; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import ru.cg.webbpm.modules.webkit.DispatcherConfig; + +/** + * @author Eduard Tihomirov + */ +@Configuration +@EnableWebMvc +@Primary +public class ErvuDispatcherConfig extends DispatcherConfig { + + @Override + public void configureMessageConverters(List> converters) { + converters.add(converter()); + converters.add(new ResourceHttpMessageConverter()); + } + +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/controller/ErvuKafkaController.java b/backend/src/main/java/ru/micord/ervu/kafka/controller/ErvuKafkaController.java index 4021b4f0..7acc617a 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/controller/ErvuKafkaController.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/controller/ErvuKafkaController.java @@ -1,20 +1,16 @@ package ru.micord.ervu.kafka.controller; -import java.util.Arrays; -import java.util.Optional; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import ru.micord.ervu.kafka.model.Data; -import ru.micord.ervu.kafka.model.ErvuOrgResponse; import ru.micord.ervu.kafka.model.ExcerptResponse; import ru.micord.ervu.kafka.service.ReplyingKafkaService; import ru.micord.ervu.s3.S3Service; @@ -47,7 +43,7 @@ public class ErvuKafkaController { private ObjectMapper objectMapper; @RequestMapping(value = "/kafka/excerpt") - public ResponseEntity getExcerptFile(HttpServletRequest request) { + public ResponseEntity getExcerptFile(HttpServletRequest request) { try { String authToken = getAuthToken(request); Token token = jwtTokenService.getToken(authToken); diff --git a/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java b/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java index b0fec465..bf5da1c0 100644 --- a/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java +++ b/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java @@ -23,19 +23,22 @@ public class S3Connection { private String accessKey; @Value("${s3.secret_key}") private String secretKey; + @Value("${s3.path.style.enabled:true}") + private boolean pathStyleAccessEnabled; @Bean("outClient") public AmazonS3 getS3OutClient() { - return getS3Client(endpoint, accessKey, secretKey); + return getS3Client(endpoint, accessKey, secretKey, pathStyleAccessEnabled); } - private static AmazonS3 getS3Client(String endpoint, String accessKey, String secretKey) { + private static AmazonS3 getS3Client(String endpoint, String accessKey, String secretKey, Boolean pathStyleAccessEnabled) { AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); String region = Region.getRegion(Regions.DEFAULT_REGION).toString(); return AmazonS3ClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, region)) .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withPathStyleAccessEnabled(pathStyleAccessEnabled) .build(); } } diff --git a/backend/src/main/java/ru/micord/ervu/s3/S3Service.java b/backend/src/main/java/ru/micord/ervu/s3/S3Service.java index a7058528..c60c4711 100644 --- a/backend/src/main/java/ru/micord/ervu/s3/S3Service.java +++ b/backend/src/main/java/ru/micord/ervu/s3/S3Service.java @@ -1,14 +1,12 @@ package ru.micord.ervu.s3; -import java.io.File; -import java.net.URI; - import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3URI; import com.amazonaws.services.s3.model.S3Object; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -25,13 +23,14 @@ public class S3Service { this.outClient = outClient; } - public ResponseEntity getFile(String fileUrl) { + public ResponseEntity getFile(String fileUrl) { try { AmazonS3URI uri = new AmazonS3URI(fileUrl); S3Object s3Object = outClient.getObject(uri.getBucket(), uri.getKey()); InputStreamResource resource = new InputStreamResource(s3Object.getObjectContent()); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + uri.getKey()) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + uri.getKey() + "\"") + .contentLength(s3Object.getObjectMetadata().getContentLength()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); } diff --git a/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts b/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts index 1bef1d95..d312f554 100644 --- a/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts +++ b/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts @@ -28,10 +28,16 @@ export class ErvuDownloadFileButton extends AbstractButton { public doClickActions(): Promise { return this.httpClient.get('kafka/excerpt', { - responseType: 'blob' + responseType: 'blob', + observe: 'response' }).toPromise().then((response) => { - const url = window.URL.createObjectURL(response); + const contentDisposition = response.headers.get('Content-Disposition'); + const url = window.URL.createObjectURL(response.body); const a = document.createElement('a'); + const fileNameMatch = contentDisposition.match(/filename="(.+)"/); + if (fileNameMatch.length > 1) { + this.fileName = fileNameMatch[1]; + } a.href = url; a.download = this.fileName; document.body.appendChild(a); From 03fd4ff99eb25e3d623eb13fae11042e596c8af9 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Mon, 7 Oct 2024 12:38:43 +0300 Subject: [PATCH 27/34] SUPPORT-8584: Fix --- backend/src/main/java/AppConfig.java | 11 +++++++- .../ervu/config/ErvuDispatcherConfig.java | 27 ------------------- .../java/ru/micord/ervu/s3/S3Service.java | 6 ++++- .../button/ErvuDownloadFileButton.ts | 6 ++--- 4 files changed, 18 insertions(+), 32 deletions(-) delete mode 100644 backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java diff --git a/backend/src/main/java/AppConfig.java b/backend/src/main/java/AppConfig.java index b7d1e952..dc4b8770 100644 --- a/backend/src/main/java/AppConfig.java +++ b/backend/src/main/java/AppConfig.java @@ -1,4 +1,5 @@ import java.time.Duration; +import java.util.List; import javax.sql.DataSource; import liquibase.integration.spring.SpringLiquibase; @@ -14,10 +15,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.FilterType; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; import org.springframework.retry.annotation.EnableRetry; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * Root application context @@ -46,7 +50,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; @EnableWebMvc @EnableScheduling @EnableRetry -public class AppConfig { +public class AppConfig implements WebMvcConfigurer { @Bean public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){ @@ -77,4 +81,9 @@ public class AppConfig { liquibase.setChangeLog("classpath:config/changelog-master.xml"); return liquibase; } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(new ResourceHttpMessageConverter()); + } } diff --git a/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java b/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java deleted file mode 100644 index fe3362f1..00000000 --- a/backend/src/main/java/ru/micord/ervu/config/ErvuDispatcherConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.micord.ervu.config; - -import java.util.List; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.ResourceHttpMessageConverter; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import ru.cg.webbpm.modules.webkit.DispatcherConfig; - -/** - * @author Eduard Tihomirov - */ -@Configuration -@EnableWebMvc -@Primary -public class ErvuDispatcherConfig extends DispatcherConfig { - - @Override - public void configureMessageConverters(List> converters) { - converters.add(converter()); - converters.add(new ResourceHttpMessageConverter()); - } - -} diff --git a/backend/src/main/java/ru/micord/ervu/s3/S3Service.java b/backend/src/main/java/ru/micord/ervu/s3/S3Service.java index c60c4711..fce537a0 100644 --- a/backend/src/main/java/ru/micord/ervu/s3/S3Service.java +++ b/backend/src/main/java/ru/micord/ervu/s3/S3Service.java @@ -1,5 +1,8 @@ package ru.micord.ervu.s3; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3URI; @@ -28,8 +31,9 @@ public class S3Service { AmazonS3URI uri = new AmazonS3URI(fileUrl); S3Object s3Object = outClient.getObject(uri.getBucket(), uri.getKey()); InputStreamResource resource = new InputStreamResource(s3Object.getObjectContent()); + String encodedFilename = URLEncoder.encode(uri.getKey(), StandardCharsets.UTF_8); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + uri.getKey() + "\"") + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename) .contentLength(s3Object.getObjectMetadata().getContentLength()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); diff --git a/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts b/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts index d312f554..0aae45c6 100644 --- a/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts +++ b/frontend/src/ts/ervu/component/button/ErvuDownloadFileButton.ts @@ -34,9 +34,9 @@ export class ErvuDownloadFileButton extends AbstractButton { const contentDisposition = response.headers.get('Content-Disposition'); const url = window.URL.createObjectURL(response.body); const a = document.createElement('a'); - const fileNameMatch = contentDisposition.match(/filename="(.+)"/); - if (fileNameMatch.length > 1) { - this.fileName = fileNameMatch[1]; + const fileNameMatch = contentDisposition.match(/filename\*=?UTF-8''(.+)/i); + if (fileNameMatch && fileNameMatch.length > 1) { + this.fileName = decodeURIComponent(fileNameMatch[1].replace(/\+/g, '%20')); } a.href = url; a.download = this.fileName; From f93c0adc7f966c23b0feaeac8b90a2c548d40992 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Mon, 7 Oct 2024 13:23:51 +0300 Subject: [PATCH 28/34] fix --- backend/src/main/java/ru/micord/ervu/s3/S3Connection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java b/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java index bf5da1c0..f0134cc5 100644 --- a/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java +++ b/backend/src/main/java/ru/micord/ervu/s3/S3Connection.java @@ -23,7 +23,7 @@ public class S3Connection { private String accessKey; @Value("${s3.secret_key}") private String secretKey; - @Value("${s3.path.style.enabled:true}") + @Value("${s3.path.style.access.enabled:true}") private boolean pathStyleAccessEnabled; @Bean("outClient") From f7afc15c180fe3d3f4553ffc574180dec810c240 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Mon, 7 Oct 2024 13:26:34 +0300 Subject: [PATCH 29/34] SUPPORT-8590: fix time --- .../fileupload/EmployeeInfoFileUploadService.java | 10 ++++++---- .../micord/ervu/journal/mapper/JournalDtoMapper.java | 10 +++++----- .../src/main/java/ru/micord/ervu/util/DateUtil.java | 8 ++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 7747496c..fca49cba 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -1,8 +1,9 @@ package ervu.service.fileupload; import java.nio.charset.StandardCharsets; -import java.sql.Timestamp; +import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.UUID; @@ -29,6 +30,7 @@ import ru.micord.ervu.security.esia.service.UlDataService; import ru.micord.ervu.security.webbpm.jwt.model.Token; import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; import ru.micord.ervu.service.InteractionService; +import ru.micord.ervu.util.DateUtil; /** * @author Alexandr Shalaginov @@ -71,8 +73,7 @@ public class EmployeeInfoFileUploadService { public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType, String accessToken, String authToken, String offset) { String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename()); - LocalDateTime now = LocalDateTime.now(); - String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT));; + String departureDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMAT)); if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) { FileStatus fileStatus = new FileStatus(); @@ -101,7 +102,8 @@ public class EmployeeInfoFileUploadService { personModel ) ); - interactionService.setStatus(fileId, fileStatus.getStatus(), fileName, employeeInfoFileFormType.getFilePatternName(), Timestamp.valueOf(now), + interactionService.setStatus(fileId, fileStatus.getStatus(), fileName, employeeInfoFileFormType.getFilePatternCode(), + DateUtil.convertToTimestamp(Instant.now(), ZoneOffset.of(offset)), personModel.getLastName() + " " + personModel.getFirstName().charAt(0) + ". " + personModel.getMiddleName().charAt(0) + ".", (int) multipartFile.getSize(), ids[1]); return sendMessage(jsonMessage); diff --git a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java index 6e34656e..d3e909a6 100644 --- a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java +++ b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java @@ -1,6 +1,5 @@ package ru.micord.ervu.journal.mapper; -import java.sql.Timestamp; import java.time.ZoneOffset; import java.time.ZonedDateTime; @@ -9,6 +8,7 @@ import ru.micord.ervu.journal.JournalDto; import ru.micord.ervu.journal.JournalFileInfo; import ru.micord.ervu.journal.SenderInfo; +import static ru.micord.ervu.util.DateUtil.convertToTimestamp; import static ru.micord.ervu.util.StringUtils.convertToFio; public class JournalDtoMapper { @@ -16,9 +16,9 @@ public class JournalDtoMapper { public static JournalDto mapToJournalDto(JournalFileInfo journalFileInfo) { SenderInfo senderInfo = journalFileInfo.getSenderInfo(); return new JournalDto() - .setDepartureDateTime(Timestamp.from(ZonedDateTime.of(journalFileInfo.getDepartureDateTime(), - ZoneOffset.of(journalFileInfo.getTimeZone()) - ).toInstant()).toString()) + .setDepartureDateTime(convertToTimestamp( + ZonedDateTime.of(journalFileInfo.getDepartureDateTime(), ZoneOffset.systemDefault()).toInstant(), + ZoneOffset.of(journalFileInfo.getTimeZone())).toString()) .setFileName(journalFileInfo.getFileName()) .setFilePatternCode(journalFileInfo.getFilePatternCode()) .setSenderFio(convertToFio(senderInfo.getFirstName(), senderInfo.getMiddleName(), @@ -33,7 +33,7 @@ public class JournalDtoMapper { return new JournalDto() .setDepartureDateTime(record.getSentDate().toString()) .setFileName(record.getFileName()) - .setFilePatternCode(0) + .setFilePatternCode(Integer.valueOf(record.getForm())) .setSenderFio(record.getSender()) .setStatus(record.getStatus()) .setFilesSentCount(record.getRecordsSent()) diff --git a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java index 80644b92..ce1831c7 100644 --- a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java +++ b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java @@ -1,9 +1,13 @@ package ru.micord.ervu.util; +import java.sql.Timestamp; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import org.jetbrains.annotations.NotNull; import org.springframework.util.StringUtils; import static org.springframework.util.StringUtils.hasText; @@ -37,4 +41,8 @@ public final class DateUtil { public static String convertToString(LocalDate date, DateTimeFormatter formatter) { return date == null ? "" : date.format(formatter); } + + public static Timestamp convertToTimestamp(@NotNull Instant instant, ZoneOffset zoneOffset) { + return Timestamp.valueOf(LocalDateTime.ofInstant(instant, zoneOffset)); + } } From 76772df53014992f08f08dbeb9e299f06b3eda9e Mon Sep 17 00:00:00 2001 From: gulnaz Date: Mon, 7 Oct 2024 18:42:45 +0300 Subject: [PATCH 30/34] SUPPORT-8590: parse for client time zone --- .../EmployeeInfoFileUploadService.java | 17 +++++---- .../ervu/journal/mapper/JournalDtoMapper.java | 8 +--- .../java/ru/micord/ervu/util/DateUtil.java | 8 ---- .../grid/formatter/ClientDateTimeFormatter.ts | 38 +++++++++++++++++++ .../business-model/Журнал взаимодействия.page | 12 +----- 5 files changed, 51 insertions(+), 32 deletions(-) create mode 100644 frontend/src/ts/ervu/component/grid/formatter/ClientDateTimeFormatter.ts diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index fca49cba..c33d32d4 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -1,9 +1,8 @@ package ervu.service.fileupload; import java.nio.charset.StandardCharsets; -import java.time.Instant; +import java.sql.Timestamp; import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.UUID; @@ -30,7 +29,8 @@ import ru.micord.ervu.security.esia.service.UlDataService; import ru.micord.ervu.security.webbpm.jwt.model.Token; import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; import ru.micord.ervu.service.InteractionService; -import ru.micord.ervu.util.DateUtil; + +import static ru.micord.ervu.util.StringUtils.convertToFio; /** * @author Alexandr Shalaginov @@ -73,7 +73,7 @@ public class EmployeeInfoFileUploadService { public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType, String accessToken, String authToken, String offset) { String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename()); - String departureDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMAT)); + LocalDateTime now = LocalDateTime.now(); if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) { FileStatus fileStatus = new FileStatus(); @@ -87,6 +87,7 @@ public class EmployeeInfoFileUploadService { PersonModel personModel = employeeModel.getPerson(); Token token = jwtTokenService.getToken(authToken); String[] ids = token.getUserAccountId().split(":"); + String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT)); String jsonMessage = getJsonKafkaMessage( employeeInfoKafkaMessageService.getKafkaMessage( fileId, @@ -102,10 +103,10 @@ public class EmployeeInfoFileUploadService { personModel ) ); - interactionService.setStatus(fileId, fileStatus.getStatus(), fileName, employeeInfoFileFormType.getFilePatternCode(), - DateUtil.convertToTimestamp(Instant.now(), ZoneOffset.of(offset)), - personModel.getLastName() + " " + personModel.getFirstName().charAt(0) + ". " + personModel.getMiddleName().charAt(0) + ".", (int) multipartFile.getSize(), - ids[1]); + interactionService.setStatus(fileId, fileStatus.getStatus(), fileName, + employeeInfoFileFormType.getFilePatternCode(), Timestamp.valueOf(now), + convertToFio(personModel.getFirstName(), personModel.getMiddleName(), personModel.getLastName()), + (int) multipartFile.getSize(), ids[1]); return sendMessage(jsonMessage); } else { diff --git a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java index d3e909a6..63c3dfec 100644 --- a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java +++ b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java @@ -1,14 +1,12 @@ package ru.micord.ervu.journal.mapper; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; +import java.sql.Timestamp; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.InteractionLogRecord; import ru.micord.ervu.journal.JournalDto; import ru.micord.ervu.journal.JournalFileInfo; import ru.micord.ervu.journal.SenderInfo; -import static ru.micord.ervu.util.DateUtil.convertToTimestamp; import static ru.micord.ervu.util.StringUtils.convertToFio; public class JournalDtoMapper { @@ -16,9 +14,7 @@ public class JournalDtoMapper { public static JournalDto mapToJournalDto(JournalFileInfo journalFileInfo) { SenderInfo senderInfo = journalFileInfo.getSenderInfo(); return new JournalDto() - .setDepartureDateTime(convertToTimestamp( - ZonedDateTime.of(journalFileInfo.getDepartureDateTime(), ZoneOffset.systemDefault()).toInstant(), - ZoneOffset.of(journalFileInfo.getTimeZone())).toString()) + .setDepartureDateTime(Timestamp.valueOf(journalFileInfo.getDepartureDateTime()).toString()) .setFileName(journalFileInfo.getFileName()) .setFilePatternCode(journalFileInfo.getFilePatternCode()) .setSenderFio(convertToFio(senderInfo.getFirstName(), senderInfo.getMiddleName(), diff --git a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java index ce1831c7..80644b92 100644 --- a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java +++ b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java @@ -1,13 +1,9 @@ package ru.micord.ervu.util; -import java.sql.Timestamp; -import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import org.jetbrains.annotations.NotNull; import org.springframework.util.StringUtils; import static org.springframework.util.StringUtils.hasText; @@ -41,8 +37,4 @@ public final class DateUtil { public static String convertToString(LocalDate date, DateTimeFormatter formatter) { return date == null ? "" : date.format(formatter); } - - public static Timestamp convertToTimestamp(@NotNull Instant instant, ZoneOffset zoneOffset) { - return Timestamp.valueOf(LocalDateTime.ofInstant(instant, zoneOffset)); - } } diff --git a/frontend/src/ts/ervu/component/grid/formatter/ClientDateTimeFormatter.ts b/frontend/src/ts/ervu/component/grid/formatter/ClientDateTimeFormatter.ts new file mode 100644 index 00000000..94e44b90 --- /dev/null +++ b/frontend/src/ts/ervu/component/grid/formatter/ClientDateTimeFormatter.ts @@ -0,0 +1,38 @@ +import {DateTimeUtil, DefaultValueFormatter, GridValueFormatter} from "@webbpm/base-package"; +import {ValueFormatterParams} from "ag-grid-community"; + +export class ClientDateTimeFormatter extends DefaultValueFormatter implements GridValueFormatter { + + public dateFormat: string = ''; + + format(params: ValueFormatterParams): string { + if (this.isValueEmpty(params)) { + return super.format(params); + } + + // don't apply formatter to row with aggregation function + if (params.node.isRowPinned()) { + return params.value; + } + + if (!this.dateFormat) { + return ClientDateTimeFormatter.parseForClientTimeZoneAndFormat(params.value, DateTimeUtil.TIMESTAMP_FORMAT); + } + + if (!ClientDateTimeFormatter.isValidFormat(this.dateFormat)) { + throw new Error('Invalid date format = ' + this.dateFormat); + } + + return ClientDateTimeFormatter.parseForClientTimeZoneAndFormat(params.value, this.dateFormat); + } + + private static isValidFormat(format: string): boolean { + const validCharsRegex = /^[YyMmDdHhSsTZ.:\[\] -]*$/; + return format && validCharsRegex.test(format); + } + + private static parseForClientTimeZoneAndFormat(value: string, dateFormat: string): string { + let timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + return DateTimeUtil.parseIsoDateTime(value).tz(timezone).format(dateFormat); + } +} \ No newline at end of file diff --git a/resources/src/main/resources/business-model/Журнал взаимодействия.page b/resources/src/main/resources/business-model/Журнал взаимодействия.page index e84fe79b..a6fb82e5 100644 --- a/resources/src/main/resources/business-model/Журнал взаимодействия.page +++ b/resources/src/main/resources/business-model/Журнал взаимодействия.page @@ -682,17 +682,9 @@ valueFormatter - - - dateFormat - - "DD.MM.YYYY HH:mm:ss" - - - - DateTimeFormatter - component.grid.formatters + ClientDateTimeFormatter + ervu.component.grid.formatter From e485d0c17d286806a42ac735d639bebb4c762c1a Mon Sep 17 00:00:00 2001 From: gulnaz Date: Tue, 8 Oct 2024 17:29:50 +0300 Subject: [PATCH 31/34] SUPPORT-8591: check for message id of kafka response --- .../impl/BaseReplyingKafkaServiceImpl.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java index 982210fb..34ba1c62 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java @@ -2,16 +2,17 @@ package ru.micord.ervu.kafka.service.impl; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.util.Arrays; import java.util.Collections; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.header.internals.RecordHeader; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.core.ConsumerFactory; @@ -26,6 +27,8 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService; @Service public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { + private static final String MESSAGE_ID_HEADER = "messageId"; + // protected abstract ReplyingKafkaTemplate getReplyingKafkaTemplate() private final KafkaTemplate kafkaTemplate; private final ConsumerFactory consumerFactory; @@ -47,7 +50,7 @@ public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { String requestMessage) { ProducerRecord record = new ProducerRecord<>(requestTopic, requestMessage); record.headers().add(new RecordHeader(KafkaHeaders.REPLY_TOPIC, replyTopic.getBytes())); - //TODO fix No pending reply error + //TODO fix No pending reply error SUPPORT-8591 // RequestReplyFuture replyFuture = getReplyingKafkaTemplate() // .sendAndReceive(record); // @@ -60,7 +63,8 @@ public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { // throw new RuntimeException("Failed to get kafka response.", e); // } - record.headers().add("messageId", UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8)); + String messageId = UUID.randomUUID().toString(); + record.headers().add(MESSAGE_ID_HEADER, messageId.getBytes(StandardCharsets.UTF_8)); kafkaTemplate.send(record); AtomicReference responseRef = new AtomicReference<>(null); @@ -68,7 +72,18 @@ public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { consumerFactory.createConsumer(groupId, null)) { consumer.subscribe(Collections.singletonList(replyTopic)); ConsumerRecords consumerRecords = consumer.poll(Duration.ofSeconds(replyTimeout)); - consumerRecords.forEach(consumerRecord -> responseRef.set(consumerRecord.value())); + + for (ConsumerRecord consumerRecord : consumerRecords) { + boolean match = Arrays.stream(consumerRecord.headers().toArray()) + .anyMatch(header -> header.key().equals(MESSAGE_ID_HEADER) + && messageId.equals( + new String(header.value(), StandardCharsets.UTF_8))); + + if (match) { + responseRef.set(consumerRecord.value()); + break; + } + } consumer.commitSync(); } return Optional.ofNullable(responseRef.get()) From 75ed29e6abed25c63af1747bc4b6fbbe1034e255 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Tue, 8 Oct 2024 17:32:18 +0300 Subject: [PATCH 32/34] SUPPORT-8591: up kafka version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f73ed156..665d70f9 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ 1.0.1.RELEASE - 2.6.13 + 2.9.13 1.60 UTF-8 false From 9bbc260e9746fd89b673db454078c4de4bc4ad17 Mon Sep 17 00:00:00 2001 From: gulnaz Date: Wed, 9 Oct 2024 09:31:29 +0300 Subject: [PATCH 33/34] SUPPORT-8591: commit after checking --- .../ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java index 34ba1c62..de01ac72 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java @@ -81,10 +81,10 @@ public class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { if (match) { responseRef.set(consumerRecord.value()); + consumer.commitSync(); break; } } - consumer.commitSync(); } return Optional.ofNullable(responseRef.get()) .orElseThrow(() -> new RuntimeException("Kafka return result is null")); From 08574aa2145a4d18f9c02c56db262e653b995197 Mon Sep 17 00:00:00 2001 From: Eduard Tihomirov Date: Wed, 9 Oct 2024 09:38:04 +0300 Subject: [PATCH 34/34] SUPPORT-8601: Fix --- frontend/src/ts/modules/security/guard/auth.guard.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/modules/security/guard/auth.guard.ts b/frontend/src/ts/modules/security/guard/auth.guard.ts index c3b94d9c..95c2271e 100644 --- a/frontend/src/ts/modules/security/guard/auth.guard.ts +++ b/frontend/src/ts/modules/security/guard/auth.guard.ts @@ -3,6 +3,7 @@ import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from " import {Observable} from "rxjs"; import {HttpClient, HttpParams} from "@angular/common/http"; import {CookieService} from "ngx-cookie"; +import {MessagesService} from "@webbpm/base-package"; @Injectable({providedIn:'root'}) export abstract class AuthGuard implements CanActivate { @@ -10,7 +11,8 @@ export abstract class AuthGuard implements CanActivate { protected constructor( protected router: Router, private httpClient: HttpClient, - private cookieService: CookieService + private cookieService: CookieService, + private messageService: MessagesService ) { } @@ -28,7 +30,9 @@ export abstract class AuthGuard implements CanActivate { return true; } else if (error) { - throw new Error(error + ', error description =' + errorDescription); + let errorMessage = error + ', error description =' + errorDescription; + this.messageService.error(errorMessage) + throw new Error(errorMessage); } else if (code) { const params = new HttpParams().set('code', code);