Files
no-copy/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java
T

216 lines
8.1 KiB
Java
Raw Normal View History

2026-03-06 17:28:52 +07:00
package ru.soune.nocopy.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
2026-04-28 15:41:57 +07:00
import org.springframework.data.domain.Page;
2026-03-06 17:28:52 +07:00
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import ru.soune.nocopy.dto.search.GlobalSearchStartRequest;
import ru.soune.nocopy.dto.search.GlobalSearchStartResponse;
import ru.soune.nocopy.dto.search.GlobalSearchStatusResponse;
2026-03-13 13:55:10 +07:00
import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO;
2026-04-28 15:41:57 +07:00
import ru.soune.nocopy.dto.violation.ViolationRequest;
2026-03-06 17:28:52 +07:00
import ru.soune.nocopy.entity.file.FileEntity;
import ru.soune.nocopy.entity.search.GlobalSearchTask;
import ru.soune.nocopy.entity.search.SearchStatus;
2026-03-12 17:27:22 +07:00
import ru.soune.nocopy.exception.NotFoundAuthToken;
2026-03-06 17:28:52 +07:00
import ru.soune.nocopy.repository.GlobalSearchTaskRepository;
import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.search.GlobalSearchService;
2026-03-13 13:48:03 +07:00
import ru.soune.nocopy.service.violation.ViolationService;
2026-03-06 17:28:52 +07:00
2026-04-28 15:41:57 +07:00
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
2026-03-06 17:28:52 +07:00
import java.util.*;
@Slf4j
@RestController
@RequestMapping("/api/v1/global-search")
@RequiredArgsConstructor
public class GlobalSearchController {
private final AuthService authService;
private final GlobalSearchService globalSearchService;
private final GlobalSearchTaskRepository globalSearchTaskRepository;
private final GlobalSearchTaskRepository searchTaskRepository;
2026-03-13 13:48:03 +07:00
private final ViolationService violationService;
2026-03-06 17:28:52 +07:00
@PostMapping("/start")
public ResponseEntity<?> startSearch(
@RequestBody GlobalSearchStartRequest request,
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
GlobalSearchStartResponse response = new GlobalSearchStartResponse();
2026-03-12 17:27:22 +07:00
try {
Long userId = authService.useUserAuthToken(tokenHeader);
List<FileEntity> filesToProcess = globalSearchService.getFilesToProcess(request, userId);
if (filesToProcess.isEmpty()) return ResponseEntity.ok().body("Files for search not found");
String taskId = globalSearchService.startSearch(request, userId, filesToProcess);
Optional<GlobalSearchTask> taskOptional = globalSearchTaskRepository.findById(taskId);
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
GlobalSearchTask task = taskOptional.orElseThrow();
response.setTaskId(taskId);
response.setStatus(SearchStatus.ACCEPTED.name());
response.setTotalFiles(task.getTotalFiles());
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
2026-03-06 17:28:52 +07:00
return ResponseEntity.ok(response);
}
2026-03-12 15:46:37 +07:00
@GetMapping("/actual-task")
public ResponseEntity<?> getStatus(@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
2026-03-12 17:27:22 +07:00
Optional<GlobalSearchTask> taskOptional;
2026-03-12 15:46:37 +07:00
2026-03-12 17:27:22 +07:00
try {
Long userId = authService.useUserAuthToken(tokenHeader);
2026-03-12 15:46:37 +07:00
2026-03-12 17:27:22 +07:00
taskOptional = searchTaskRepository.findByUserIdAndStatus(userId,
"PROCESSING");
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
2026-03-12 15:46:37 +07:00
return ResponseEntity.ok(taskOptional.get());
}
2026-04-28 15:41:57 +07:00
// @GetMapping("/violation-summary")
// public ResponseEntity<?> getSummary(@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
//
// if (tokenHeader == null || tokenHeader.isBlank()) {
// Map<String, Object> errorData = new HashMap<>();
// errorData.put("token", tokenHeader);
//
// return ResponseEntity.ok().body(Map.of("error", errorData));
// }
//
// List<FileViolationSummaryDTO> fileViolationsSummary;
//
// try {
// Long userId = authService.useUserAuthToken(tokenHeader);
//
// fileViolationsSummary =
// violationService.getFileViolationsSummary(userId);
//
// if (fileViolationsSummary.isEmpty()) return ResponseEntity.ok().body("Violations summary not found");
// } catch (NotFoundAuthToken e) {
// Map<String, Object> errorData = new HashMap<>();
// errorData.put("token", tokenHeader);
//
// return ResponseEntity.ok().body(Map.of("error", errorData));
// }
//
// return ResponseEntity.ok(fileViolationsSummary);
// }
2026-03-13 13:48:03 +07:00
2026-04-28 15:41:57 +07:00
@PostMapping("/violations")
public ResponseEntity<?> getViolations(@RequestBody ViolationRequest request) {
if (request.getToken() == null || request.getToken().isBlank()) {
2026-03-13 13:48:03 +07:00
Map<String, Object> errorData = new HashMap<>();
2026-04-28 15:41:57 +07:00
errorData.put("token", request.getToken());
2026-03-13 13:48:03 +07:00
return ResponseEntity.ok().body(Map.of("error", errorData));
}
try {
2026-04-28 15:41:57 +07:00
Long userId = authService.useUserAuthToken(request.getToken());
2026-03-13 13:48:03 +07:00
2026-04-28 15:41:57 +07:00
LocalDateTime start = parseDate(request.getStartDate());
LocalDateTime end = parseDate(request.getEndDate());
2026-03-13 13:48:03 +07:00
2026-04-28 15:41:57 +07:00
Page<FileViolationSummaryDTO> result = violationService.getFileViolationsSummary(
userId, request.getFileName(), request.getSortDirection(),
request.getPage(), request.getSize(), start, end);
return ResponseEntity.ok(result);
2026-03-13 13:48:03 +07:00
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
2026-04-28 15:41:57 +07:00
errorData.put("token", request.getToken());
2026-03-13 13:48:03 +07:00
return ResponseEntity.ok().body(Map.of("error", errorData));
}
}
2026-03-06 17:28:52 +07:00
@GetMapping("/status/{taskId}")
2026-03-10 22:47:43 +07:00
public ResponseEntity<?> getStatus(@PathVariable String taskId,
2026-03-06 17:28:52 +07:00
@RequestHeader(value = "Authorization", required = false) String tokenHeader) {
if (tokenHeader == null || tokenHeader.isBlank()) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
2026-03-12 17:27:22 +07:00
GlobalSearchStatusResponse response;
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
try {
Long userId = authService.useUserAuthToken(tokenHeader);
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
Optional<GlobalSearchTask> taskOptional = searchTaskRepository.findByTaskIdAndUserId(taskId, userId);
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
if (taskOptional.isEmpty()) return ResponseEntity.ok().body("Task not found");
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
GlobalSearchTask task = taskOptional.orElseThrow();
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
int progress = task.getTotalFiles() > 0 ? task.getProcessedFiles() * 100 / task.getTotalFiles() : 0;
2026-03-06 17:28:52 +07:00
2026-03-12 17:27:22 +07:00
response = new GlobalSearchStatusResponse();
response.setTaskId(taskId);
response.setStatus(task.getStatus());
response.setProgress(progress);
} catch (NotFoundAuthToken e) {
Map<String, Object> errorData = new HashMap<>();
errorData.put("token", tokenHeader);
return ResponseEntity.ok().body(Map.of("error", errorData));
}
2026-03-06 17:28:52 +07:00
return ResponseEntity.ok(response);
}
2026-04-28 15:41:57 +07:00
private LocalDateTime parseDate(String dateStr) {
try {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
} catch (DateTimeParseException e) {
log.error(e.getMessage());
return null;
}
}
2026-03-06 17:28:52 +07:00
}