From 1d137809e9d2221514af88fd94a02811f5711abd Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 11:55:39 +0300 Subject: [PATCH 01/19] SUPPORT-8381: add file upload service impl and file upload client --- .../fileupload/ErvuFileUploadClient.java | 10 ++++ .../impl/ErvuFileUploadClientImpl.java | 51 +++++++++++++++++++ .../impl/ErvuFileUploadV2ServiceImpl.java | 23 +++++++++ 3 files changed, 84 insertions(+) create mode 100644 backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java create mode 100644 backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java create mode 100644 backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java diff --git a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java new file mode 100644 index 00000000..20f492e6 --- /dev/null +++ b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java @@ -0,0 +1,10 @@ +package ervu.client.fileupload; + +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Alexandr Shalaginov + */ +public interface ErvuFileUploadClient { + boolean uploadFile(MultipartFile multipartFile); +} diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java new file mode 100644 index 00000000..56ab9289 --- /dev/null +++ b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java @@ -0,0 +1,51 @@ +package ervu.client.fileupload.impl; + +import ervu.client.fileupload.ErvuFileUploadClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Alexandr Shalaginov + */ +@Component +public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { + @Value("${file.upload.url:#{null}}") + private String url; + private final RestTemplate restTemplate; + private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); + + public ErvuFileUploadClientImpl() { + this.restTemplate = new RestTemplate(); + } + + @Override + public boolean uploadFile(MultipartFile multipartFile) { + if (this.url == null) { + throw new RuntimeException("Property file.upload.url is null"); + } + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("file", multipartFile.getResource()); + HttpEntity> requestEntity = new HttpEntity<>(body, headers); + ResponseEntity response = this.restTemplate.postForEntity(url, requestEntity, Object.class); + return response.getStatusCode().is2xxSuccessful(); + } + catch (RestClientException e) { + logger.error("Upload file failed", e); + return false; + } + } +} diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java new file mode 100644 index 00000000..18d1a1ba --- /dev/null +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -0,0 +1,23 @@ +package ervu.service.fileupload.impl; + +import ervu.client.fileupload.ErvuFileUploadClient; +import ervu.service.fileupload.FileUploadV2Service; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Alexandr Shalaginov + */ +@Service +public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { + private final ErvuFileUploadClient ervuFileUploadClient; + + public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient) { + this.ervuFileUploadClient = ervuFileUploadClient; + } + + @Override + public boolean saveFile(MultipartFile multipartFile) { + return this.ervuFileUploadClient.uploadFile(multipartFile); + } +} From 51c507a2b0f13b45cf13c85f1c90cfbbceddc03e Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 12:00:23 +0300 Subject: [PATCH 02/19] SUPPORT-8381: add spring kafka dependency --- backend/pom.xml | 4 ++++ pom.xml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/backend/pom.xml b/backend/pom.xml index 409ca774..dce5ddb7 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -99,6 +99,10 @@ org.springframework.security spring-security-config + + org.springframework.kafka + spring-kafka + ru.cg.webbpm.modules inject diff --git a/pom.xml b/pom.xml index c9cef478..d5e9d18e 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 3.174.1 72000 6.15.0 + 2.6.13 @@ -293,6 +294,11 @@ spring-security-kerberos-web ${spring-security-kerberos.version} + + org.springframework.kafka + spring-kafka + ${spring-kafka.version} + org.apache.httpcomponents httpcore From ac883a259ecf96c615a9000a3bf524576c89b36a Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 12:02:27 +0300 Subject: [PATCH 03/19] SUPPORT-8381: add kafka producer config --- .../src/main/java/KafkaProducerConfig.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 backend/src/main/java/KafkaProducerConfig.java diff --git a/backend/src/main/java/KafkaProducerConfig.java b/backend/src/main/java/KafkaProducerConfig.java new file mode 100644 index 00000000..7d741f62 --- /dev/null +++ b/backend/src/main/java/KafkaProducerConfig.java @@ -0,0 +1,40 @@ +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +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; + +/** + * @author Alexandr Shalaginov + */ +@Configuration +public class KafkaProducerConfig { + @Value("${kafka.send.url:#{null}}") + private String kafkaUrl; + + @Bean + public ProducerFactory producerFactory() { + return new DefaultKafkaProducerFactory<>(producerConfigs()); + } + + @Bean + public Map producerConfigs() { + Map props = new HashMap<>(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + return props; + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } +} + From e2ae106b8abe647aa6244eb6e4b1ff8d9e3f14c8 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 12:15:32 +0300 Subject: [PATCH 04/19] SUPPORT-8381: add kafka client --- .../src/main/java/KafkaProducerConfig.java | 5 ++- .../java/ervu/client/kafka/KafkaClient.java | 8 ++++ .../client/kafka/impl/KafkaClientImpl.java | 44 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/ervu/client/kafka/KafkaClient.java create mode 100644 backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java diff --git a/backend/src/main/java/KafkaProducerConfig.java b/backend/src/main/java/KafkaProducerConfig.java index 7d741f62..5db01f78 100644 --- a/backend/src/main/java/KafkaProducerConfig.java +++ b/backend/src/main/java/KafkaProducerConfig.java @@ -25,8 +25,11 @@ public class KafkaProducerConfig { @Bean public Map producerConfigs() { + if (this.kafkaUrl == null) { + throw new RuntimeException("Property kafka.send.url is null"); + } Map props = new HashMap<>(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl); + 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); return props; diff --git a/backend/src/main/java/ervu/client/kafka/KafkaClient.java b/backend/src/main/java/ervu/client/kafka/KafkaClient.java new file mode 100644 index 00000000..16705b85 --- /dev/null +++ b/backend/src/main/java/ervu/client/kafka/KafkaClient.java @@ -0,0 +1,8 @@ +package ervu.client.kafka; + +/** + * @author Alexandr Shalaginov + */ +public interface KafkaClient { + void sendMessage(String message); +} diff --git a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java new file mode 100644 index 00000000..265193c1 --- /dev/null +++ b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java @@ -0,0 +1,44 @@ +package ervu.client.kafka.impl; + +import ervu.client.kafka.KafkaClient; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; +import org.springframework.util.concurrent.ListenableFuture; + +/** + * @author Alexandr Shalaginov + */ +@Component +public class KafkaClientImpl implements KafkaClient { + @Value("${kafka.send.topic:#{null}}") + private String kafkaTopic; + private static final Logger logger = LoggerFactory.getLogger(KafkaClientImpl.class); + private final KafkaTemplate kafkaTemplate; + + public KafkaClientImpl(KafkaTemplate kafkaTemplate) { + this.kafkaTemplate = kafkaTemplate; + } + + public void sendMessage(String message) { + if (this.kafkaTopic == null) { + throw new RuntimeException("Property kafka.send.topic is null"); + } + ProducerRecord record = new ProducerRecord<>("topic", message); + + ListenableFuture> future = this.kafkaTemplate.send(record); + future.addCallback( + (result) -> { + logger.debug("Success send message: {}", result); + }, + (throwable) -> { + logger.error("Fail send message.", throwable); + } + ); + } +} + From 35dbbccf3effead6ad389cd14568296bfd59d42a Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 14:13:10 +0300 Subject: [PATCH 05/19] SUPPORT-8381: some changes --- .../java/ervu/client/kafka/KafkaClient.java | 2 +- .../client/kafka/impl/KafkaClientImpl.java | 23 +++++++++---------- .../impl/ErvuFileUploadV2ServiceImpl.java | 20 ++++++++++++++-- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/ervu/client/kafka/KafkaClient.java b/backend/src/main/java/ervu/client/kafka/KafkaClient.java index 16705b85..11d02142 100644 --- a/backend/src/main/java/ervu/client/kafka/KafkaClient.java +++ b/backend/src/main/java/ervu/client/kafka/KafkaClient.java @@ -4,5 +4,5 @@ package ervu.client.kafka; * @author Alexandr Shalaginov */ public interface KafkaClient { - void sendMessage(String message); + boolean sendMessage(String message); } diff --git a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java index 265193c1..54d6493d 100644 --- a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java +++ b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java @@ -24,21 +24,20 @@ public class KafkaClientImpl implements KafkaClient { this.kafkaTemplate = kafkaTemplate; } - public void sendMessage(String message) { + public boolean sendMessage(String message) { if (this.kafkaTopic == null) { throw new RuntimeException("Property kafka.send.topic is null"); } - ProducerRecord record = new ProducerRecord<>("topic", message); - - ListenableFuture> future = this.kafkaTemplate.send(record); - future.addCallback( - (result) -> { - logger.debug("Success send message: {}", result); - }, - (throwable) -> { - logger.error("Fail send message.", throwable); - } - ); + ProducerRecord record = new ProducerRecord<>(this.kafkaTopic, message); + try { + this.kafkaTemplate.send(record).get(); + logger.debug("Success send record: {}", record); + return true; + } + catch (Exception exception) { + logger.error("Fail send message.", exception); + return false; + } } } diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 18d1a1ba..d417a1a1 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -1,23 +1,39 @@ package ervu.service.fileupload.impl; import ervu.client.fileupload.ErvuFileUploadClient; +import ervu.client.kafka.KafkaClient; import ervu.service.fileupload.FileUploadV2Service; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; + /** * @author Alexandr Shalaginov */ @Service public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { + private final KafkaClient kafkaClient; + private final SecurityContext securityContext; private final ErvuFileUploadClient ervuFileUploadClient; - public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient) { + public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient, + KafkaClient kafkaClient, + SecurityContext securityContext) { this.ervuFileUploadClient = ervuFileUploadClient; + this.kafkaClient = kafkaClient; + this.securityContext = securityContext; } @Override public boolean saveFile(MultipartFile multipartFile) { - return this.ervuFileUploadClient.uploadFile(multipartFile); + if (this.ervuFileUploadClient.uploadFile(multipartFile)) { + String message = "{username='" + this.securityContext.getCurrentUsername() + + "',filename='" + multipartFile.getName() + "'}"; + return this.kafkaClient.sendMessage(message); + } + else { + return false; + } } } From 0bb98990e2c7bb46ad81ddaa7869d382ccd51670 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Mon, 15 Jul 2024 16:30:08 +0300 Subject: [PATCH 06/19] SUPPORT-8381: some changes (2) --- .../java/{ => ervu}/KafkaProducerConfig.java | 2 + .../fileupload/ErvuFileUploadClient.java | 4 +- .../impl/ErvuFileUploadClientImpl.java | 12 +++-- .../client/kafka/impl/KafkaClientImpl.java | 2 - .../impl/ErvuFileUploadV2ServiceImpl.java | 54 ++++++++++++++++--- 5 files changed, 58 insertions(+), 16 deletions(-) rename backend/src/main/java/{ => ervu}/KafkaProducerConfig.java (98%) diff --git a/backend/src/main/java/KafkaProducerConfig.java b/backend/src/main/java/ervu/KafkaProducerConfig.java similarity index 98% rename from backend/src/main/java/KafkaProducerConfig.java rename to backend/src/main/java/ervu/KafkaProducerConfig.java index 5db01f78..e0c26528 100644 --- a/backend/src/main/java/KafkaProducerConfig.java +++ b/backend/src/main/java/ervu/KafkaProducerConfig.java @@ -1,3 +1,5 @@ +package ervu; + import java.util.HashMap; import java.util.Map; diff --git a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java index 20f492e6..a55e30c5 100644 --- a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java @@ -1,10 +1,8 @@ package ervu.client.fileupload; -import org.springframework.web.multipart.MultipartFile; - /** * @author Alexandr Shalaginov */ public interface ErvuFileUploadClient { - boolean uploadFile(MultipartFile multipartFile); + boolean uploadFile(String filename, byte[] content); } diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java index 56ab9289..4dd222f8 100644 --- a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java +++ b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java @@ -4,6 +4,7 @@ import ervu.client.fileupload.ErvuFileUploadClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -13,7 +14,6 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import org.springframework.web.multipart.MultipartFile; /** * @author Alexandr Shalaginov @@ -30,7 +30,7 @@ public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { } @Override - public boolean uploadFile(MultipartFile multipartFile) { + public boolean uploadFile(String filename, byte[] content) { if (this.url == null) { throw new RuntimeException("Property file.upload.url is null"); } @@ -38,7 +38,13 @@ public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("file", multipartFile.getResource()); + ByteArrayResource resource = new ByteArrayResource(content) { + @Override + public String getFilename() { + return filename; + } + }; + body.add("file", resource); HttpEntity> requestEntity = new HttpEntity<>(body, headers); ResponseEntity response = this.restTemplate.postForEntity(url, requestEntity, Object.class); return response.getStatusCode().is2xxSuccessful(); diff --git a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java index 54d6493d..7fc8764e 100644 --- a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java +++ b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java @@ -6,9 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.kafka.support.SendResult; import org.springframework.stereotype.Component; -import org.springframework.util.concurrent.ListenableFuture; /** * @author Alexandr Shalaginov diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index d417a1a1..8a1affd4 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -1,8 +1,12 @@ package ervu.service.fileupload.impl; +import java.io.IOException; +import java.util.UUID; + import ervu.client.fileupload.ErvuFileUploadClient; import ervu.client.kafka.KafkaClient; import ervu.service.fileupload.FileUploadV2Service; +import org.apache.commons.io.FilenameUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -18,8 +22,7 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { private final ErvuFileUploadClient ervuFileUploadClient; public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient, - KafkaClient kafkaClient, - SecurityContext securityContext) { + KafkaClient kafkaClient, SecurityContext securityContext) { this.ervuFileUploadClient = ervuFileUploadClient; this.kafkaClient = kafkaClient; this.securityContext = securityContext; @@ -27,13 +30,48 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { @Override public boolean saveFile(MultipartFile multipartFile) { - if (this.ervuFileUploadClient.uploadFile(multipartFile)) { - String message = "{username='" + this.securityContext.getCurrentUsername() - + "',filename='" + multipartFile.getName() + "'}"; - return this.kafkaClient.sendMessage(message); + try { + String newFilename = getNewFilename(multipartFile.getOriginalFilename()); + byte[] content = multipartFile.getBytes(); + + if (this.ervuFileUploadClient.uploadFile(newFilename, content)) { + return this.kafkaClient.sendMessage(new KafkaMessage( + securityContext.getCurrentUsername(), + newFilename, + multipartFile.getOriginalFilename() + ).toString()); + } + else { + return false; + } } - else { - return false; + catch (IOException e) { + throw new RuntimeException(e); } } + + private String getNewFilename(String oldFilename) { + return UUID.randomUUID() + "." + FilenameUtils.getExtension(oldFilename); + } +} + +class KafkaMessage { + private String username; + private String filename; + private String originalFilename; + + public KafkaMessage(String username, String filename, String originalFilename) { + this.username = username; + this.filename = filename; + this.originalFilename = originalFilename; + } + + @Override + public String toString() { + return "KafkaMessage{" + + "username='" + username + '\'' + + ", filename='" + filename + '\'' + + ", originalFilename='" + originalFilename + '\'' + + '}'; + } } From 3e9f52efa3885ba2e9dfe92e5467cdeb2f4fc80a Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 09:32:17 +0300 Subject: [PATCH 07/19] SUPPORT-8381: some changes (2) --- .../impl/ErvuFileUploadV2ServiceImpl.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 8a1affd4..6c71ffbe 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -3,6 +3,8 @@ package ervu.service.fileupload.impl; import java.io.IOException; import java.util.UUID; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.fileupload.ErvuFileUploadClient; import ervu.client.kafka.KafkaClient; import ervu.service.fileupload.FileUploadV2Service; @@ -35,11 +37,14 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { byte[] content = multipartFile.getBytes(); if (this.ervuFileUploadClient.uploadFile(newFilename, content)) { - return this.kafkaClient.sendMessage(new KafkaMessage( - securityContext.getCurrentUsername(), - newFilename, - multipartFile.getOriginalFilename() - ).toString()); + String jsonMessage = getJsonKafkaMessage( + new KafkaMessage( + securityContext.getCurrentUsername(), + newFilename, + multipartFile.getOriginalFilename() + ) + ); + return this.kafkaClient.sendMessage(jsonMessage); } else { return false; @@ -53,12 +58,22 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { private String getNewFilename(String oldFilename) { return UUID.randomUUID() + "." + FilenameUtils.getExtension(oldFilename); } + + private String getJsonKafkaMessage(KafkaMessage kafkaMessage) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(kafkaMessage); + } + catch (JsonProcessingException e) { + throw new RuntimeException(String.format("Fail get json from: %s", kafkaMessage), e); + } + } } class KafkaMessage { - private String username; - private String filename; - private String originalFilename; + private final String username; + private final String filename; + private final String originalFilename; public KafkaMessage(String username, String filename, String originalFilename) { this.username = username; @@ -74,4 +89,4 @@ class KafkaMessage { ", originalFilename='" + originalFilename + '\'' + '}'; } -} +} \ No newline at end of file From 43de1d84f6bf76875dee3d168d10db2c80f5b082 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 09:44:46 +0300 Subject: [PATCH 08/19] SUPPORT-8381: some changes (3) --- .../impl/ErvuFileUploadV2ServiceImpl.java | 21 ----------- .../service/fileupload/impl/KafkaMessage.java | 37 +++++++++++++++++++ 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 6c71ffbe..8b4d23ec 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -68,25 +68,4 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { throw new RuntimeException(String.format("Fail get json from: %s", kafkaMessage), e); } } -} - -class KafkaMessage { - private final String username; - private final String filename; - private final String originalFilename; - - public KafkaMessage(String username, String filename, String originalFilename) { - this.username = username; - this.filename = filename; - this.originalFilename = originalFilename; - } - - @Override - public String toString() { - return "KafkaMessage{" + - "username='" + username + '\'' + - ", filename='" + filename + '\'' + - ", originalFilename='" + originalFilename + '\'' + - '}'; - } } \ No newline at end of file diff --git a/backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java b/backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java new file mode 100644 index 00000000..30c6cec6 --- /dev/null +++ b/backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java @@ -0,0 +1,37 @@ +package ervu.service.fileupload.impl; + +/** + * @author Alexandr Shalaginov + */ +class KafkaMessage { + private final String username; + private final String filename; + private final String originalFilename; + + public KafkaMessage(String username, String filename, String originalFilename) { + this.username = username; + this.filename = filename; + this.originalFilename = originalFilename; + } + + public String getUsername() { + return username; + } + + public String getFilename() { + return filename; + } + + public String getOriginalFilename() { + return originalFilename; + } + + @Override + public String toString() { + return "KafkaMessage{" + + "username='" + username + '\'' + + ", filename='" + filename + '\'' + + ", originalFilename='" + originalFilename + '\'' + + '}'; + } +} From 21a053a4ef0b9d37eb9da0d64023c3a74726f4f9 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 14:50:25 +0300 Subject: [PATCH 09/19] SUPPORT-8381: some changes (4) --- .../fileupload/ErvuFileUploadClient.java | 4 +- .../impl/ErvuFileUploadClientImpl.java | 55 ++++++++----------- .../impl/ErvuFileUploadV2ServiceImpl.java | 30 ++++------ 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java index a55e30c5..844fbd38 100644 --- a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java @@ -1,8 +1,10 @@ package ervu.client.fileupload; +import org.springframework.web.multipart.MultipartFile; + /** * @author Alexandr Shalaginov */ public interface ErvuFileUploadClient { - boolean uploadFile(String filename, byte[] content); + boolean uploadFile(String filename, MultipartFile multipartFile); } diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java index 4dd222f8..a36e6d60 100644 --- a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java +++ b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java @@ -1,19 +1,17 @@ package ervu.client.fileupload.impl; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + import ervu.client.fileupload.ErvuFileUploadClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; /** * @author Alexandr Shalaginov @@ -22,36 +20,29 @@ import org.springframework.web.client.RestTemplate; public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { @Value("${file.upload.url:#{null}}") private String url; - private final RestTemplate restTemplate; - private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); - - public ErvuFileUploadClientImpl() { - this.restTemplate = new RestTemplate(); - } @Override - public boolean uploadFile(String filename, byte[] content) { + public boolean uploadFile(String filename, MultipartFile multipartFile) { if (this.url == null) { throw new RuntimeException("Property file.upload.url is null"); } try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - MultiValueMap body = new LinkedMultiValueMap<>(); - ByteArrayResource resource = new ByteArrayResource(content) { - @Override - public String getFilename() { - return filename; - } - }; - body.add("file", resource); - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - ResponseEntity response = this.restTemplate.postForEntity(url, requestEntity, Object.class); - return response.getStatusCode().is2xxSuccessful(); + HttpURLConnection connection = (HttpURLConnection) new URL(this.url + "/" + filename).openConnection(); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestMethod("PUT"); + + OutputStream outputStream = new BufferedOutputStream(connection.getOutputStream()); + + outputStream.write(multipartFile.getBytes()); + outputStream.flush(); + outputStream.close(); + int responseCode = connection.getResponseCode(); + connection.disconnect(); + return (responseCode >= 200) && (responseCode <= 202); } - catch (RestClientException e) { - logger.error("Upload file failed", e); - return false; + catch (IOException e) { + throw new RuntimeException(e); } } } diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 8b4d23ec..4b203764 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -32,26 +32,20 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { @Override public boolean saveFile(MultipartFile multipartFile) { - try { - String newFilename = getNewFilename(multipartFile.getOriginalFilename()); - byte[] content = multipartFile.getBytes(); + String newFilename = getNewFilename(multipartFile.getOriginalFilename()); - if (this.ervuFileUploadClient.uploadFile(newFilename, content)) { - String jsonMessage = getJsonKafkaMessage( - new KafkaMessage( - securityContext.getCurrentUsername(), - newFilename, - multipartFile.getOriginalFilename() - ) - ); - return this.kafkaClient.sendMessage(jsonMessage); - } - else { - return false; - } + if (this.ervuFileUploadClient.uploadFile(newFilename, multipartFile)) { + String jsonMessage = getJsonKafkaMessage( + new KafkaMessage( + securityContext.getCurrentUsername(), + newFilename, + multipartFile.getOriginalFilename() + ) + ); + return this.kafkaClient.sendMessage(jsonMessage); } - catch (IOException e) { - throw new RuntimeException(e); + else { + return false; } } From e19dbcc3325f898fdf738e8b56df9796bef9b033 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 15:03:45 +0300 Subject: [PATCH 10/19] SUPPORT-8381: some changes (5) --- .../client/fileupload/impl/ErvuFileUploadClientImpl.java | 4 +++- .../service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java index a36e6d60..621ff16a 100644 --- a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java +++ b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java @@ -20,6 +20,7 @@ import org.springframework.web.multipart.MultipartFile; public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { @Value("${file.upload.url:#{null}}") private String url; + private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); @Override public boolean uploadFile(String filename, MultipartFile multipartFile) { @@ -42,7 +43,8 @@ public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { return (responseCode >= 200) && (responseCode <= 202); } catch (IOException e) { - throw new RuntimeException(e); + logger.error("Fail upload file: " + filename, e); + return false; } } } diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 4b203764..26ed7c98 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -1,6 +1,5 @@ package ervu.service.fileupload.impl; -import java.io.IOException; import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; @@ -9,6 +8,8 @@ import ervu.client.fileupload.ErvuFileUploadClient; import ervu.client.kafka.KafkaClient; import ervu.service.fileupload.FileUploadV2Service; import org.apache.commons.io.FilenameUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -22,6 +23,7 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { private final KafkaClient kafkaClient; private final SecurityContext securityContext; private final ErvuFileUploadClient ervuFileUploadClient; + private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadV2ServiceImpl.class); public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient, KafkaClient kafkaClient, SecurityContext securityContext) { @@ -45,6 +47,7 @@ public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { return this.kafkaClient.sendMessage(jsonMessage); } else { + logger.error("Fail upload file: {}", multipartFile.getOriginalFilename()); return false; } } From 7c15d10d541e8a75f4d79cfc980758c950982134 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 15:10:04 +0300 Subject: [PATCH 11/19] SUPPORT-8381: create studio component --- .../src/main/resources/FileUploadV2.component | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 resources/src/main/resources/FileUploadV2.component diff --git a/resources/src/main/resources/FileUploadV2.component b/resources/src/main/resources/FileUploadV2.component new file mode 100644 index 00000000..11a4763d --- /dev/null +++ b/resources/src/main/resources/FileUploadV2.component @@ -0,0 +1,64 @@ + + + f6d7a9d9-acfe-4414-a835-e9625fa06fb3 + FileUploadV2 + false + + 3.175.0-SNAPSHOT + + + ru.cg.webbpm.packages.base.resources + 3.174.1 + + + + + FileUploadV2 + false + false + + + FileUploadV2 + ervu.component.fileupload + + true + true + + + displayFileSize + + true + + + + displayProgressBar + + true + + + + visible + + true + + + + + + + FileUploadV2Controller + ervu.controller + + true + true + + + fileUploadV2Service + + + + + + + + From b6717f44b75c1b80ad79fa55eb5b9ec2c41548e6 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Tue, 16 Jul 2024 15:26:16 +0300 Subject: [PATCH 12/19] SUPPORT-8381: fix by review (1) --- .../ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java | 3 ++- .../src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java | 3 ++- .../service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java index 621ff16a..d41cfe19 100644 --- a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java +++ b/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java @@ -18,9 +18,10 @@ import org.springframework.web.multipart.MultipartFile; */ @Component public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { + private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); + @Value("${file.upload.url:#{null}}") private String url; - private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); @Override public boolean uploadFile(String filename, MultipartFile multipartFile) { diff --git a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java index 7fc8764e..b366f7ef 100644 --- a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java +++ b/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java @@ -13,9 +13,10 @@ import org.springframework.stereotype.Component; */ @Component public class KafkaClientImpl implements KafkaClient { + private static final Logger logger = LoggerFactory.getLogger(KafkaClientImpl.class); + @Value("${kafka.send.topic:#{null}}") private String kafkaTopic; - private static final Logger logger = LoggerFactory.getLogger(KafkaClientImpl.class); private final KafkaTemplate kafkaTemplate; public KafkaClientImpl(KafkaTemplate kafkaTemplate) { diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java index 26ed7c98..f9512532 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java @@ -20,10 +20,10 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; */ @Service public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { + private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadV2ServiceImpl.class); private final KafkaClient kafkaClient; private final SecurityContext securityContext; private final ErvuFileUploadClient ervuFileUploadClient; - private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadV2ServiceImpl.class); public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient, KafkaClient kafkaClient, SecurityContext securityContext) { From de14cbcea68e1a7889f0094c0c71283a516ec512 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 10:04:54 +0300 Subject: [PATCH 13/19] SUPPORT-8381: fix by review (2) --- ...yeeInformationFileWebDavUploadClient.java} | 15 +++----- .../fileupload/ErvuFileUploadClient.java | 10 ------ .../java/ervu/client/kafka/KafkaClient.java | 8 ----- ...tImpl.java => KafkaSendMessageClient.java} | 18 ++++------ ...ployeeInformationFileUploadController.java | 31 ++++++++++++++++ .../controller/FileUploadV2Controller.java | 35 ------------------- ...EmployeeInformationFileUploadService.java} | 26 +++++++------- .../fileupload/FileUploadV2Service.java | 10 ------ .../fileupload/{impl => }/KafkaMessage.java | 2 +- .../ervu/component/fileupload/FileUploadV2.ts | 2 +- .../src/main/resources/FileUploadV2.component | 16 --------- 11 files changed, 57 insertions(+), 116 deletions(-) rename backend/src/main/java/ervu/client/fileupload/{impl/ErvuFileUploadClientImpl.java => EmployeeInformationFileWebDavUploadClient.java} (74%) delete mode 100644 backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java delete mode 100644 backend/src/main/java/ervu/client/kafka/KafkaClient.java rename backend/src/main/java/ervu/client/kafka/{impl/KafkaClientImpl.java => KafkaSendMessageClient.java} (66%) create mode 100644 backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java delete mode 100644 backend/src/main/java/ervu/controller/FileUploadV2Controller.java rename backend/src/main/java/ervu/service/fileupload/{impl/ErvuFileUploadV2ServiceImpl.java => EmployeeInformationFileUploadService.java} (66%) delete mode 100644 backend/src/main/java/ervu/service/fileupload/FileUploadV2Service.java rename backend/src/main/java/ervu/service/fileupload/{impl => }/KafkaMessage.java (95%) diff --git a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java similarity index 74% rename from backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java rename to backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java index d41cfe19..1fc55bfd 100644 --- a/backend/src/main/java/ervu/client/fileupload/impl/ErvuFileUploadClientImpl.java +++ b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java @@ -1,4 +1,4 @@ -package ervu.client.fileupload.impl; +package ervu.client.fileupload; import java.io.BufferedOutputStream; import java.io.IOException; @@ -6,7 +6,6 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; -import ervu.client.fileupload.ErvuFileUploadClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -17,17 +16,13 @@ import org.springframework.web.multipart.MultipartFile; * @author Alexandr Shalaginov */ @Component -public class ErvuFileUploadClientImpl implements ErvuFileUploadClient { - private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadClientImpl.class); +public class EmployeeInformationFileWebDavUploadClient { + private static final Logger logger = LoggerFactory.getLogger(EmployeeInformationFileWebDavUploadClient.class); - @Value("${file.upload.url:#{null}}") + @Value("${file.webdav.upload.url:localhost:5757}") private String url; - @Override - public boolean uploadFile(String filename, MultipartFile multipartFile) { - if (this.url == null) { - throw new RuntimeException("Property file.upload.url is null"); - } + public boolean webDavUploadFile(String filename, MultipartFile multipartFile) { try { HttpURLConnection connection = (HttpURLConnection) new URL(this.url + "/" + filename).openConnection(); connection.setDoInput(true); diff --git a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java b/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java deleted file mode 100644 index 844fbd38..00000000 --- a/backend/src/main/java/ervu/client/fileupload/ErvuFileUploadClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package ervu.client.fileupload; - -import org.springframework.web.multipart.MultipartFile; - -/** - * @author Alexandr Shalaginov - */ -public interface ErvuFileUploadClient { - boolean uploadFile(String filename, MultipartFile multipartFile); -} diff --git a/backend/src/main/java/ervu/client/kafka/KafkaClient.java b/backend/src/main/java/ervu/client/kafka/KafkaClient.java deleted file mode 100644 index 11d02142..00000000 --- a/backend/src/main/java/ervu/client/kafka/KafkaClient.java +++ /dev/null @@ -1,8 +0,0 @@ -package ervu.client.kafka; - -/** - * @author Alexandr Shalaginov - */ -public interface KafkaClient { - boolean sendMessage(String message); -} diff --git a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java b/backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java similarity index 66% rename from backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java rename to backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java index b366f7ef..15433b4d 100644 --- a/backend/src/main/java/ervu/client/kafka/impl/KafkaClientImpl.java +++ b/backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java @@ -1,6 +1,5 @@ -package ervu.client.kafka.impl; +package ervu.client.kafka; -import ervu.client.kafka.KafkaClient; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,22 +11,19 @@ import org.springframework.stereotype.Component; * @author Alexandr Shalaginov */ @Component -public class KafkaClientImpl implements KafkaClient { - private static final Logger logger = LoggerFactory.getLogger(KafkaClientImpl.class); +public class KafkaSendMessageClient { + private static final Logger logger = LoggerFactory.getLogger(KafkaSendMessageClient.class); - @Value("${kafka.send.topic:#{null}}") - private String kafkaTopic; + @Value("${kafka.send.message.topic.name:messages-topic}") + private String kafkaTopicName; private final KafkaTemplate kafkaTemplate; - public KafkaClientImpl(KafkaTemplate kafkaTemplate) { + public KafkaSendMessageClient(KafkaTemplate kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public boolean sendMessage(String message) { - if (this.kafkaTopic == null) { - throw new RuntimeException("Property kafka.send.topic is null"); - } - ProducerRecord record = new ProducerRecord<>(this.kafkaTopic, message); + ProducerRecord record = new ProducerRecord<>(this.kafkaTopicName, message); try { this.kafkaTemplate.send(record).get(); logger.debug("Success send record: {}", record); diff --git a/backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java new file mode 100644 index 00000000..14528068 --- /dev/null +++ b/backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java @@ -0,0 +1,31 @@ +package ervu.controller; + +import ervu.service.fileupload.EmployeeInformationFileUploadService; +import org.springframework.http.ResponseEntity; +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; + +/** + * @author Alexandr Shalaginov + */ +@RestController +public class EmployeeInformationFileUploadController { + private final EmployeeInformationFileUploadService fileUploadService; + + public EmployeeInformationFileUploadController(EmployeeInformationFileUploadService fileUploadService) { + this.fileUploadService = fileUploadService; + } + + @RequestMapping(value = "/file/upload/employee-information", method = RequestMethod.POST) + public ResponseEntity saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile) { + if (this.fileUploadService.saveEmployeeInformationFile(multipartFile)) { + return ResponseEntity.ok("File successfully uploaded."); + } + else { + return ResponseEntity.internalServerError().body("An error occurred while uploading file."); + } + } +} diff --git a/backend/src/main/java/ervu/controller/FileUploadV2Controller.java b/backend/src/main/java/ervu/controller/FileUploadV2Controller.java deleted file mode 100644 index d9a80dfa..00000000 --- a/backend/src/main/java/ervu/controller/FileUploadV2Controller.java +++ /dev/null @@ -1,35 +0,0 @@ -package ervu.controller; - -import ervu.service.fileupload.FileUploadV2Service; -import org.springframework.http.ResponseEntity; -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; - -import ru.cg.webbpm.modules.standard_annotations.validation.NotNull; -import ru.cg.webbpm.modules.webkit.beans.Behavior; - -/** - * @author Alexandr Shalaginov - */ -@RestController -public class FileUploadV2Controller extends Behavior { - @NotNull - public final FileUploadV2Service fileUploadV2Service; - - public FileUploadV2Controller(FileUploadV2Service fileUploadV2Service) { - this.fileUploadV2Service = fileUploadV2Service; - } - - @RequestMapping(value = "/file/upload", method = RequestMethod.POST) - public ResponseEntity saveFile(@RequestParam("file") MultipartFile multipartFile) { - if (this.fileUploadV2Service.saveFile(multipartFile)) { - return ResponseEntity.ok("File successfully uploaded."); - } - else { - return ResponseEntity.internalServerError().body("An error occurred while uploading file."); - } - } -} diff --git a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java similarity index 66% rename from backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java rename to backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java index f9512532..c6cbc408 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/ErvuFileUploadV2ServiceImpl.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java @@ -1,12 +1,11 @@ -package ervu.service.fileupload.impl; +package ervu.service.fileupload; import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import ervu.client.fileupload.ErvuFileUploadClient; -import ervu.client.kafka.KafkaClient; -import ervu.service.fileupload.FileUploadV2Service; +import ervu.client.fileupload.EmployeeInformationFileWebDavUploadClient; +import ervu.client.kafka.KafkaSendMessageClient; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,24 +18,23 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; * @author Alexandr Shalaginov */ @Service -public class ErvuFileUploadV2ServiceImpl implements FileUploadV2Service { - private static final Logger logger = LoggerFactory.getLogger(ErvuFileUploadV2ServiceImpl.class); - private final KafkaClient kafkaClient; +public class EmployeeInformationFileUploadService { + private static final Logger logger = LoggerFactory.getLogger(EmployeeInformationFileUploadService.class); + private final KafkaSendMessageClient kafkaClient; private final SecurityContext securityContext; - private final ErvuFileUploadClient ervuFileUploadClient; + private final EmployeeInformationFileWebDavUploadClient fileWebDavUploadClient; - public ErvuFileUploadV2ServiceImpl(ErvuFileUploadClient ervuFileUploadClient, - KafkaClient kafkaClient, SecurityContext securityContext) { - this.ervuFileUploadClient = ervuFileUploadClient; + public EmployeeInformationFileUploadService(EmployeeInformationFileWebDavUploadClient fileWebDavUploadClient, + KafkaSendMessageClient kafkaClient, SecurityContext securityContext) { + this.fileWebDavUploadClient = fileWebDavUploadClient; this.kafkaClient = kafkaClient; this.securityContext = securityContext; } - @Override - public boolean saveFile(MultipartFile multipartFile) { + public boolean saveEmployeeInformationFile(MultipartFile multipartFile) { String newFilename = getNewFilename(multipartFile.getOriginalFilename()); - if (this.ervuFileUploadClient.uploadFile(newFilename, multipartFile)) { + if (this.fileWebDavUploadClient.webDavUploadFile(newFilename, multipartFile)) { String jsonMessage = getJsonKafkaMessage( new KafkaMessage( securityContext.getCurrentUsername(), diff --git a/backend/src/main/java/ervu/service/fileupload/FileUploadV2Service.java b/backend/src/main/java/ervu/service/fileupload/FileUploadV2Service.java deleted file mode 100644 index 274a64bd..00000000 --- a/backend/src/main/java/ervu/service/fileupload/FileUploadV2Service.java +++ /dev/null @@ -1,10 +0,0 @@ -package ervu.service.fileupload; - -import org.springframework.web.multipart.MultipartFile; - -/** - * @author Alexandr Shalaginov - */ -public interface FileUploadV2Service { - boolean saveFile(MultipartFile multipartFile); -} diff --git a/backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java b/backend/src/main/java/ervu/service/fileupload/KafkaMessage.java similarity index 95% rename from backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java rename to backend/src/main/java/ervu/service/fileupload/KafkaMessage.java index 30c6cec6..af65b12f 100644 --- a/backend/src/main/java/ervu/service/fileupload/impl/KafkaMessage.java +++ b/backend/src/main/java/ervu/service/fileupload/KafkaMessage.java @@ -1,4 +1,4 @@ -package ervu.service.fileupload.impl; +package ervu.service.fileupload; /** * @author Alexandr Shalaginov diff --git a/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts b/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts index e57153f6..37c3fa23 100644 --- a/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts +++ b/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts @@ -49,7 +49,7 @@ export class FileUploadV2 extends InputControl { protected isProgressBarVisible: boolean = false; private fileInputEl: any; - private url: string = '/backend/file/upload'; + private url: string = '/backend/file/upload/employee-information'; private messagesService: MessagesService; constructor(el: ElementRef, cd: ChangeDetectorRef) { diff --git a/resources/src/main/resources/FileUploadV2.component b/resources/src/main/resources/FileUploadV2.component index 11a4763d..8ab4395e 100644 --- a/resources/src/main/resources/FileUploadV2.component +++ b/resources/src/main/resources/FileUploadV2.component @@ -44,21 +44,5 @@ - - - FileUploadV2Controller - ervu.controller - - true - true - - - fileUploadV2Service - - - - - - From f4c32b085ae9fb1f57fb185c9010c01ffd352805 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 10:42:35 +0300 Subject: [PATCH 14/19] SUPPORT-8381: fix by review (3) --- ...oyeeInformationFileWebDavUploadClient.java | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java index 1fc55bfd..df9cf002 100644 --- a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java @@ -1,10 +1,10 @@ package ervu.client.fileupload; -import java.io.BufferedOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,23 +24,14 @@ public class EmployeeInformationFileWebDavUploadClient { public boolean webDavUploadFile(String filename, MultipartFile multipartFile) { try { - HttpURLConnection connection = (HttpURLConnection) new URL(this.url + "/" + filename).openConnection(); - connection.setDoInput(true); - connection.setDoOutput(true); - connection.setRequestMethod("PUT"); - - OutputStream outputStream = new BufferedOutputStream(connection.getOutputStream()); - - outputStream.write(multipartFile.getBytes()); - outputStream.flush(); - outputStream.close(); - int responseCode = connection.getResponseCode(); - connection.disconnect(); - return (responseCode >= 200) && (responseCode <= 202); + HttpClient httpClient = HttpClient.newBuilder().build(); + HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create(this.url + "/" + filename)) + .PUT(HttpRequest.BodyPublishers.ofByteArray(multipartFile.getBytes())).build(); + HttpResponse response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + return (response.statusCode() >= 200) && (response.statusCode() <= 202); } - catch (IOException e) { - logger.error("Fail upload file: " + filename, e); - return false; + catch (IOException | InterruptedException e) { + throw new RuntimeException(e); } } } From e3ae0b21ea12f0f002a52af56e74c4deb9bf8ad8 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 10:46:45 +0300 Subject: [PATCH 15/19] SUPPORT-8381: small fix --- .../fileupload/EmployeeInformationFileWebDavUploadClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java index df9cf002..b14fb9b9 100644 --- a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java @@ -19,7 +19,7 @@ import org.springframework.web.multipart.MultipartFile; public class EmployeeInformationFileWebDavUploadClient { private static final Logger logger = LoggerFactory.getLogger(EmployeeInformationFileWebDavUploadClient.class); - @Value("${file.webdav.upload.url:localhost:5757}") + @Value("${file.webdav.upload.url:http://localhost:5757}") private String url; public boolean webDavUploadFile(String filename, MultipartFile multipartFile) { From d87675f151f9664e9dd34f2eda1dc5d15a1ebe28 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 10:53:21 +0300 Subject: [PATCH 16/19] SUPPORT-8381: fix by review (4) --- ...t.java => EmployeeInfoFileWebDavUploadClient.java} | 4 ++-- ...ler.java => EmployeeInfoFileUploadController.java} | 8 ++++---- ...ervice.java => EmployeeInfoFileUploadService.java} | 11 ++++++----- 3 files changed, 12 insertions(+), 11 deletions(-) rename backend/src/main/java/ervu/client/fileupload/{EmployeeInformationFileWebDavUploadClient.java => EmployeeInfoFileWebDavUploadClient.java} (92%) rename backend/src/main/java/ervu/controller/{EmployeeInformationFileUploadController.java => EmployeeInfoFileUploadController.java} (75%) rename backend/src/main/java/ervu/service/fileupload/{EmployeeInformationFileUploadService.java => EmployeeInfoFileUploadService.java} (84%) diff --git a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java b/backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java similarity index 92% rename from backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java rename to backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java index b14fb9b9..ce7bebdf 100644 --- a/backend/src/main/java/ervu/client/fileupload/EmployeeInformationFileWebDavUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java @@ -16,8 +16,8 @@ import org.springframework.web.multipart.MultipartFile; * @author Alexandr Shalaginov */ @Component -public class EmployeeInformationFileWebDavUploadClient { - private static final Logger logger = LoggerFactory.getLogger(EmployeeInformationFileWebDavUploadClient.class); +public class EmployeeInfoFileWebDavUploadClient { + private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileWebDavUploadClient.class); @Value("${file.webdav.upload.url:http://localhost:5757}") private String url; diff --git a/backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java similarity index 75% rename from backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java rename to backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java index 14528068..01ac33ca 100644 --- a/backend/src/main/java/ervu/controller/EmployeeInformationFileUploadController.java +++ b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java @@ -1,6 +1,6 @@ package ervu.controller; -import ervu.service.fileupload.EmployeeInformationFileUploadService; +import ervu.service.fileupload.EmployeeInfoFileUploadService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -12,10 +12,10 @@ import org.springframework.web.multipart.MultipartFile; * @author Alexandr Shalaginov */ @RestController -public class EmployeeInformationFileUploadController { - private final EmployeeInformationFileUploadService fileUploadService; +public class EmployeeInfoFileUploadController { + private final EmployeeInfoFileUploadService fileUploadService; - public EmployeeInformationFileUploadController(EmployeeInformationFileUploadService fileUploadService) { + public EmployeeInfoFileUploadController(EmployeeInfoFileUploadService fileUploadService) { this.fileUploadService = fileUploadService; } diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java similarity index 84% rename from backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java rename to backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index c6cbc408..18615772 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInformationFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -4,7 +4,7 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import ervu.client.fileupload.EmployeeInformationFileWebDavUploadClient; +import ervu.client.fileupload.EmployeeInfoFileWebDavUploadClient; import ervu.client.kafka.KafkaSendMessageClient; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; @@ -18,13 +18,14 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; * @author Alexandr Shalaginov */ @Service -public class EmployeeInformationFileUploadService { - private static final Logger logger = LoggerFactory.getLogger(EmployeeInformationFileUploadService.class); +public class EmployeeInfoFileUploadService { + private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); private final KafkaSendMessageClient kafkaClient; private final SecurityContext securityContext; - private final EmployeeInformationFileWebDavUploadClient fileWebDavUploadClient; + private final EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient; - public EmployeeInformationFileUploadService(EmployeeInformationFileWebDavUploadClient fileWebDavUploadClient, + public EmployeeInfoFileUploadService( + EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient, KafkaSendMessageClient kafkaClient, SecurityContext securityContext) { this.fileWebDavUploadClient = fileWebDavUploadClient; this.kafkaClient = kafkaClient; From 5019238ed38a31e8318635261014f132b2c47575 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 11:13:52 +0300 Subject: [PATCH 17/19] SUPPORT-8381: fix by review (5) --- .../client/kafka/KafkaSendMessageClient.java | 38 ----------------- .../EmployeeInfoFileUploadService.java | 41 +++++++++++++++---- 2 files changed, 34 insertions(+), 45 deletions(-) delete mode 100644 backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java diff --git a/backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java b/backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java deleted file mode 100644 index 15433b4d..00000000 --- a/backend/src/main/java/ervu/client/kafka/KafkaSendMessageClient.java +++ /dev/null @@ -1,38 +0,0 @@ -package ervu.client.kafka; - -import org.apache.kafka.clients.producer.ProducerRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.stereotype.Component; - -/** - * @author Alexandr Shalaginov - */ -@Component -public class KafkaSendMessageClient { - private static final Logger logger = LoggerFactory.getLogger(KafkaSendMessageClient.class); - - @Value("${kafka.send.message.topic.name:messages-topic}") - private String kafkaTopicName; - private final KafkaTemplate kafkaTemplate; - - public KafkaSendMessageClient(KafkaTemplate kafkaTemplate) { - this.kafkaTemplate = kafkaTemplate; - } - - public boolean sendMessage(String message) { - ProducerRecord record = new ProducerRecord<>(this.kafkaTopicName, message); - try { - this.kafkaTemplate.send(record).get(); - logger.debug("Success send record: {}", record); - return true; - } - catch (Exception exception) { - logger.error("Fail send message.", exception); - return false; - } - } -} - diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 18615772..5b284afd 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -5,10 +5,11 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.fileupload.EmployeeInfoFileWebDavUploadClient; -import ervu.client.kafka.KafkaSendMessageClient; -import org.apache.commons.io.FilenameUtils; +import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -20,16 +21,21 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; @Service public class EmployeeInfoFileUploadService { private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); - private final KafkaSendMessageClient kafkaClient; + private final SecurityContext securityContext; private final EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient; + private final KafkaTemplate kafkaTemplate; + + @Value("${kafka.send.message.topic.name:employee-files}") + private String kafkaTopicName; public EmployeeInfoFileUploadService( EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient, - KafkaSendMessageClient kafkaClient, SecurityContext securityContext) { + SecurityContext securityContext, + KafkaTemplate kafkaTemplate) { this.fileWebDavUploadClient = fileWebDavUploadClient; - this.kafkaClient = kafkaClient; this.securityContext = securityContext; + this.kafkaTemplate = kafkaTemplate; } public boolean saveEmployeeInformationFile(MultipartFile multipartFile) { @@ -43,7 +49,7 @@ public class EmployeeInfoFileUploadService { multipartFile.getOriginalFilename() ) ); - return this.kafkaClient.sendMessage(jsonMessage); + return sendMessage(jsonMessage); } else { logger.error("Fail upload file: {}", multipartFile.getOriginalFilename()); @@ -51,8 +57,29 @@ public class EmployeeInfoFileUploadService { } } + private boolean sendMessage(String message) { + ProducerRecord record = new ProducerRecord<>(this.kafkaTopicName, message); + try { + this.kafkaTemplate.send(record).get(); + logger.debug("Success send record: {}", record); + return true; + } + catch (Exception exception) { + logger.error("Fail send message.", exception); + return false; + } + } + private String getNewFilename(String oldFilename) { - return UUID.randomUUID() + "." + FilenameUtils.getExtension(oldFilename); + return UUID.randomUUID() + getFileExtension(oldFilename); + } + + private String getFileExtension(String filename) { + int lastIndexOf = filename.lastIndexOf("."); + if (lastIndexOf == -1) { + return ""; + } + return filename.substring(lastIndexOf); } private String getJsonKafkaMessage(KafkaMessage kafkaMessage) { From 255fffc5238ff39d9431af28d63a215e2c7709b8 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 12:23:36 +0300 Subject: [PATCH 18/19] SUPPORT-8381: fix by review (6) --- ...ebDavUploadClient.java => EmployeeInfoWebDavClient.java} | 4 ++-- .../ervu/controller/EmployeeInfoFileUploadController.java | 2 +- .../service/fileupload/EmployeeInfoFileUploadService.java | 6 +++--- frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename backend/src/main/java/ervu/client/fileupload/{EmployeeInfoFileWebDavUploadClient.java => EmployeeInfoWebDavClient.java} (93%) diff --git a/backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java b/backend/src/main/java/ervu/client/fileupload/EmployeeInfoWebDavClient.java similarity index 93% rename from backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java rename to backend/src/main/java/ervu/client/fileupload/EmployeeInfoWebDavClient.java index ce7bebdf..7614b710 100644 --- a/backend/src/main/java/ervu/client/fileupload/EmployeeInfoFileWebDavUploadClient.java +++ b/backend/src/main/java/ervu/client/fileupload/EmployeeInfoWebDavClient.java @@ -16,8 +16,8 @@ import org.springframework.web.multipart.MultipartFile; * @author Alexandr Shalaginov */ @Component -public class EmployeeInfoFileWebDavUploadClient { - private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileWebDavUploadClient.class); +public class EmployeeInfoWebDavClient { + private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoWebDavClient.class); @Value("${file.webdav.upload.url:http://localhost:5757}") private String url; diff --git a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java index 01ac33ca..bd5befb5 100644 --- a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java +++ b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java @@ -19,7 +19,7 @@ public class EmployeeInfoFileUploadController { this.fileUploadService = fileUploadService; } - @RequestMapping(value = "/file/upload/employee-information", method = RequestMethod.POST) + @RequestMapping(value = "/employee/document", method = RequestMethod.POST) public ResponseEntity saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile) { if (this.fileUploadService.saveEmployeeInformationFile(multipartFile)) { 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 5b284afd..09345845 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -4,7 +4,7 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import ervu.client.fileupload.EmployeeInfoFileWebDavUploadClient; +import ervu.client.fileupload.EmployeeInfoWebDavClient; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,14 +23,14 @@ public class EmployeeInfoFileUploadService { private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); private final SecurityContext securityContext; - private final EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient; + private final EmployeeInfoWebDavClient fileWebDavUploadClient; private final KafkaTemplate kafkaTemplate; @Value("${kafka.send.message.topic.name:employee-files}") private String kafkaTopicName; public EmployeeInfoFileUploadService( - EmployeeInfoFileWebDavUploadClient fileWebDavUploadClient, + EmployeeInfoWebDavClient fileWebDavUploadClient, SecurityContext securityContext, KafkaTemplate kafkaTemplate) { this.fileWebDavUploadClient = fileWebDavUploadClient; diff --git a/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts b/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts index 37c3fa23..bc4418ef 100644 --- a/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts +++ b/frontend/src/ts/ervu/component/fileupload/FileUploadV2.ts @@ -49,7 +49,7 @@ export class FileUploadV2 extends InputControl { protected isProgressBarVisible: boolean = false; private fileInputEl: any; - private url: string = '/backend/file/upload/employee-information'; + private url: string = '/backend/employee/document'; private messagesService: MessagesService; constructor(el: ElementRef, cd: ChangeDetectorRef) { From 5da0d532814cd32a586ddd046fa98c58be2d3f83 Mon Sep 17 00:00:00 2001 From: Alexandr Shalaginov Date: Wed, 17 Jul 2024 12:38:39 +0300 Subject: [PATCH 19/19] SUPPORT-8381: fix by review (7) --- .../fileupload/EmployeeInfoFileUploadService.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 09345845..2f3bbb5d 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -10,6 +10,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -22,7 +24,6 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext; public class EmployeeInfoFileUploadService { private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); - private final SecurityContext securityContext; private final EmployeeInfoWebDavClient fileWebDavUploadClient; private final KafkaTemplate kafkaTemplate; @@ -31,10 +32,8 @@ public class EmployeeInfoFileUploadService { public EmployeeInfoFileUploadService( EmployeeInfoWebDavClient fileWebDavUploadClient, - SecurityContext securityContext, KafkaTemplate kafkaTemplate) { this.fileWebDavUploadClient = fileWebDavUploadClient; - this.securityContext = securityContext; this.kafkaTemplate = kafkaTemplate; } @@ -44,7 +43,7 @@ public class EmployeeInfoFileUploadService { if (this.fileWebDavUploadClient.webDavUploadFile(newFilename, multipartFile)) { String jsonMessage = getJsonKafkaMessage( new KafkaMessage( - securityContext.getCurrentUsername(), + getCurrentUsername(), newFilename, multipartFile.getOriginalFilename() ) @@ -91,4 +90,12 @@ public class EmployeeInfoFileUploadService { throw new RuntimeException(String.format("Fail get json from: %s", kafkaMessage), e); } } + + private String getCurrentUsername() { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth != null && auth.isAuthenticated()) { + return auth.getName(); + } + return null; + } } \ No newline at end of file