From 7ceed04db1f5b313c71a2e97f3adb516a39b6247 Mon Sep 17 00:00:00 2001 From: Maksim Tereshin Date: Tue, 26 Nov 2024 13:02:12 +0100 Subject: [PATCH] Add success messages, modify s3 handler, update csv generator --- .../org/micord/controller/ApiController.java | 8 ++-- .../org/micord/service/DownloadService.java | 38 ++++++++++++++++--- .../org/micord/service/RequestService.java | 28 +++++++++++++- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/config-data-executor/src/main/java/org/micord/controller/ApiController.java b/config-data-executor/src/main/java/org/micord/controller/ApiController.java index e5b29b5..7c1ee0c 100644 --- a/config-data-executor/src/main/java/org/micord/controller/ApiController.java +++ b/config-data-executor/src/main/java/org/micord/controller/ApiController.java @@ -35,7 +35,7 @@ public class ApiController { logger.debug("Starting block process for ids: {}", ids); apiService.process("block", ids); logger.debug("Finished block process for ids: {}", ids); - return ResponseEntity.ok(""); + return ResponseEntity.ok("Операция \"Блокировка\" завершена успешно."); } @PostMapping("/unblock") @@ -43,7 +43,7 @@ public class ApiController { logger.debug("Starting unblock process for ids: {}", ids); apiService.process("unblock", ids); logger.debug("Finished unblock process for ids: {}", ids); - return ResponseEntity.ok(""); + return ResponseEntity.ok("Операция \"Разблокировка\" завершена успешно."); } @PostMapping("/removeFromSystem") @@ -52,7 +52,7 @@ public class ApiController { logger.debug("Starting removeFromSystem process for ids: {}", ids); apiService.process("removeFromSystem", ids); logger.debug("Finished removeFromSystem process for ids: {}", ids); - return ResponseEntity.ok(""); + return ResponseEntity.ok("Операция \"Удаление данных по гражданину\" завершена успешно."); } @PostMapping("/removeFromCallList") @@ -61,7 +61,7 @@ public class ApiController { logger.debug("Starting removeFromCallList process for ids: {}", ids); apiService.process("removeFromCallList", ids); logger.debug("Finished removeFromCallList process for ids: {}", ids); - return ResponseEntity.ok(""); + return ResponseEntity.ok("Операция \"Удаление из списков на вызов\" завершена успешно."); } @PostMapping("/downloadCSV") diff --git a/config-data-executor/src/main/java/org/micord/service/DownloadService.java b/config-data-executor/src/main/java/org/micord/service/DownloadService.java index f1f0ace..d70ede4 100644 --- a/config-data-executor/src/main/java/org/micord/service/DownloadService.java +++ b/config-data-executor/src/main/java/org/micord/service/DownloadService.java @@ -7,9 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -41,14 +40,19 @@ public class DownloadService { File csvFile = File.createTempFile("download-", ".csv"); - try (PrintWriter writer = new PrintWriter(csvFile)) { + try (PrintWriter writer = new PrintWriter( + new OutputStreamWriter(new FileOutputStream(csvFile), StandardCharsets.UTF_8))) { + String lineSeparator = "\r\n"; + for (String[] row : results) { - writer.println(String.join(",", row)); + writer.print(formatCsvRow(row)); + writer.print(lineSeparator); } } catch (IOException e) { logger.error("Failed to write to CSV file", e); } + return csvFile; } @@ -58,6 +62,29 @@ public class DownloadService { return null; } + private String formatCsvRow(String[] row) { + StringBuilder formattedRow = new StringBuilder(); + + for (int i = 0; i < row.length; i++) { + if (i > 0) { + formattedRow.append(","); + } + + formattedRow.append("\""); + formattedRow.append(escapeCsvField(row[i])); + formattedRow.append("\""); + } + + return formattedRow.toString(); + } + + private String escapeCsvField(String field) { + if (field == null) { + return ""; + } + return field.replace("\"", "\"\""); + } + private Map buildSqlQuery(DownloadRequest request, List ids, LocalDate startDate, LocalDate endDate) { Map resultMap = new HashMap<>(); String endpointArguments; @@ -105,7 +132,6 @@ public class DownloadService { } catch (SQLException e) { logger.error("Failed to execute query for RequestArgument", e); - throw new RuntimeException("Error executing database query: " + argument.getRequestArgumentURL(), e); } } } diff --git a/config-data-executor/src/main/java/org/micord/service/RequestService.java b/config-data-executor/src/main/java/org/micord/service/RequestService.java index 2a21001..f157fc3 100644 --- a/config-data-executor/src/main/java/org/micord/service/RequestService.java +++ b/config-data-executor/src/main/java/org/micord/service/RequestService.java @@ -64,7 +64,8 @@ public class RequestService { for (RequestArgument argument : request.getRequestArguments()) { try (Connection connection = DatabaseConnection.getConnection( argument.getRequestArgumentConnectionParams())) { - Map query = buildSqlQuery(request, ids); + + Map query = buildSqlQueryForS3(request.getRequestURL(), ids); logger.debug("Starting fetching paths from database for S3 request"); long startExecTime = System.currentTimeMillis(); @@ -161,6 +162,31 @@ public class RequestService { } } + private Map buildSqlQueryForS3(String requestURL, List ids) { + logger.debug("Starting building SQL query for request: {}", requestURL); + long startExecTime = System.currentTimeMillis(); + Map resultMap = new HashMap<>(); + String endpointArguments; + + if (requestURL.contains(":=")) { + endpointArguments = "'{" + ids.stream() + .map(String::trim) + .collect(Collectors.joining(", ")) + "}'"; + } else { + endpointArguments = "(" + ids.stream() + .map(s -> "'" + s.trim() + "'") + .collect(Collectors.joining(", ")) + ")"; + } + + resultMap.put("requestURL", requestURL + .replace("${endpointArguments}", endpointArguments)); + + long endExecTime = System.currentTimeMillis(); + logger.debug("SQL query for S3 built in {} ms", endExecTime - startExecTime); + + return resultMap; + } + private Map buildSqlQuery(BaseRequest request, List ids) { logger.debug("Starting building SQL query for request: {}", request.getRequestURL()); long startExecTime = System.currentTimeMillis();