dev delete config
Test Workflow / test (push) Waiting to run

This commit is contained in:
vladp
2026-02-17 13:57:38 +07:00
parent 8147a6ce49
commit 78698d2873
2 changed files with 235 additions and 127 deletions
@@ -1,5 +1,10 @@
package ru.soune.nocopy.controller;
import com.vrt.NoCopyFileService;
import com.vrt.fileprotection.FileProtector;
import com.vrt.fileprotection.NoCopyCheckResult;
import com.vrt.fileprotection.audio.AudioCheckResult;
import com.vrt.fileprotection.documents.DocumentCheckResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
@@ -33,14 +38,12 @@ import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.file.FileUploadService;
import ru.soune.nocopy.util.FileUtil;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@@ -152,40 +155,179 @@ public class ApiController {
}
}
private final NoCopyFileService noCopyFileService;
// @GetMapping("/v{version}/files/{fileId}/similar")
// public ResponseEntity<BaseResponse> findSimilarFiles(
// @PathVariable("version") int version,
// @PathVariable String fileId,
// @RequestParam(value = "auth_token",required = false) String authToken,
// @RequestParam(required = false) List<String> similarityLevels,
// @PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) throws Exception {
// SimilarityFilter filter = SimilarityFilter.builder()
// .similarityLevels(similarityLevels)
// .build();
// FileEntity fileEntity = fileEntityRepository.findByFileId(fileId);
// Page<SimilarFileDTO> similarFiles = null;
// List<SimilarFileDTO> allResults = null;
// List<String> errors = new ArrayList<>();
//
// if (fileEntity.getMimeType().equals("image")) {
// similarFiles = fileSimilarityService.findSimilarFiles(fileId, filter, pageable, authToken);
// } else {
// File file = new File(fileEntity.getFilePath());
// FileProtector.Type type = fileEntity.getMimeType().equals("document") ? FileProtector.Type.DOC :
// FileProtector.Type.AUDIO;
//
// NoCopyCheckResult noCopyCheckResult = noCopyFileService.checkFile(file, type);
// FileEntity entity = fileEntityRepository.findByFileId(fileId);
//
// switch (noCopyCheckResult) {
// case DocumentCheckResult.Success success -> {
// FileProtector.FileInfo info = success.getInfo();
// allResults.add(fileSimilarityService.buildDTO(fileEntityRepository.findByFileId(info.getId())));
// log.debug("File processed successfully: {}", entity.getFilePath());
// }
// case AudioCheckResult.Success success -> {
// FileProtector.FileInfo info = success.getInfo();
//
// allResults.add(fileSimilarityService.buildDTO(fileEntityRepository.findByFileId(info.getId())));
// log.debug("File processed successfully: {}", entity.getFilePath());
// }
// case DocumentCheckResult.Failed failed -> {
// String errorMessage = String.format("Document check failed for %s: %s",
// entity.getFilePath(), failed.getMessage());
// log.warn(errorMessage);
// errors.add(errorMessage);
// }
// case AudioCheckResult.Failed failed -> {
// String errorMessage = String.format("Audio check failed for %s: %s",
// entity.getFilePath(), failed.getMessage());
// log.warn(errorMessage);
// errors.add(errorMessage);
// }
// default -> throw new IllegalStateException("Unexpected result type: " +
// noCopyCheckResult.getClass().getSimpleName());
// }
//
// }
//
//
// String messageDesc;
// MessageCode success;
// Map<String, Object> responseData = new HashMap<>();
//
// assert similarFiles != null;
// if (similarFiles.isEmpty()) {
// messageDesc = MessageCode.FILE_NOT_FOUND.getDescription();
// success = MessageCode.SUCCESS;
// responseData.put("content", similarFiles.getContent());
// responseData.put("page", similarFiles.getNumber());
// responseData.put("size", similarFiles.getSize());
// responseData.put("totalElements", similarFiles.getTotalElements());
// responseData.put("totalPages", similarFiles.getTotalPages());
// responseData.put("hasNext", similarFiles.hasNext());
// responseData.put("hasPrevious", similarFiles.hasPrevious());
// } else {
// messageDesc = MessageCode.SIMILAR_FILES_FOUND.getDescription();
// success = MessageCode.SUCCESS;
// responseData.put("content", allResults);
// }
//
//
// return ResponseEntity.ok()
// .body(new BaseResponse(20004, success.getCode(), messageDesc, responseData));
// }
@GetMapping("/v{version}/files/{fileId}/similar")
public ResponseEntity<BaseResponse> findSimilarFiles(
@PathVariable("version") int version,
@PathVariable String fileId,
@RequestParam(value = "auth_token",required = false) String authToken,
@RequestParam(value = "auth_token", required = false) String authToken,
@RequestParam(required = false) List<String> similarityLevels,
@PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) throws Exception {
SimilarityFilter filter = SimilarityFilter.builder()
.similarityLevels(similarityLevels)
.build();
Page<SimilarFileDTO> similarFiles = fileSimilarityService.findSimilarFiles(fileId, filter, pageable, authToken);
@PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) {
String messageDesc;
MessageCode success;
try {
FileEntity fileEntity = fileEntityRepository.findByFileId(fileId);
if (fileEntity == null) {
return ResponseEntity.ok().body(new BaseResponse(0, MessageCode.INVALID_FIELD.getCode(),
MessageCode.INVALID_FIELD.getDescription(), null));
}
if (similarFiles.isEmpty()) {
messageDesc = MessageCode.FILE_NOT_FOUND.getDescription();
success = MessageCode.SUCCESS;
} else {
messageDesc = MessageCode.SIMILAR_FILES_FOUND.getDescription();
success = MessageCode.SUCCESS;
BaseResponse response;
if ("image".equals(fileEntity.getMimeType())) {
Page<SimilarFileDTO> similarFilesPage = fileSimilarityService.findSimilarFiles(
fileId, similarityLevels, pageable, authToken);
response = buildSuccessResponse(similarFilesPage, MessageCode.SIMILAR_FILES_FOUND);
} else {
List<SimilarFileDTO> results = processNonImageFile(fileEntity, authToken);
response = buildSuccessResponse(results, MessageCode.SIMILAR_FILES_FOUND);
}
return ResponseEntity.ok(response);
} catch (Exception e) {
log.error("Error finding similar files: {}", e.getMessage(), e);
return ResponseEntity.ok().body(new BaseResponse(0, MessageCode.INVALID_FIELD.getCode(),
MessageCode.INVALID_FIELD.getDescription(), null));
}
}
private List<SimilarFileDTO> processNonImageFile(FileEntity fileEntity, String authToken) {
List<SimilarFileDTO> results = new ArrayList<>();
File file = new File(fileEntity.getFilePath());
FileProtector.Type type = "document".equals(fileEntity.getMimeType()) ?
FileProtector.Type.DOC : FileProtector.Type.AUDIO;
NoCopyCheckResult checkResult = noCopyFileService.checkFile(file, type);
switch (checkResult) {
case DocumentCheckResult.Success success -> {
FileProtector.FileInfo info = success.getInfo();
FileEntity entity = fileEntityRepository.findByFileId(info.getId());
if (entity != null) {
results.add(fileSimilarityService.buildDTO(entity));
}
}
case AudioCheckResult.Success success -> {
FileProtector.FileInfo info = success.getInfo();
FileEntity entity = fileEntityRepository.findByFileId(info.getId());
if (entity != null) {
results.add(fileSimilarityService.buildDTO(entity));
}
}
case DocumentCheckResult.Failed failed ->
log.warn("Document check failed: {}", failed.getMessage());
case AudioCheckResult.Failed failed ->
log.warn("Audio check failed: {}", failed.getMessage());
default -> log.warn("Unexpected result type: {}", checkResult.getClass().getSimpleName());
}
Map<String, Object> responseData = new HashMap<>();
responseData.put("content", similarFiles.getContent());
responseData.put("page", similarFiles.getNumber());
responseData.put("size", similarFiles.getSize());
responseData.put("totalElements", similarFiles.getTotalElements());
responseData.put("totalPages", similarFiles.getTotalPages());
responseData.put("hasNext", similarFiles.hasNext());
responseData.put("hasPrevious", similarFiles.hasPrevious());
return results;
}
return ResponseEntity.ok()
.body(new BaseResponse(20004, success.getCode(), messageDesc, responseData));
private BaseResponse buildSuccessResponse(Page<SimilarFileDTO> page, MessageCode messageCode) {
Map<String, Object> responseData = new HashMap<>();
responseData.put("content", page.getContent());
responseData.put("page", page.getNumber());
responseData.put("size", page.getSize());
responseData.put("totalElements", page.getTotalElements());
responseData.put("totalPages", page.getTotalPages());
responseData.put("hasNext", page.hasNext());
responseData.put("hasPrevious", page.hasPrevious());
return new BaseResponse(20004, messageCode.getCode(),
messageCode.getDescription(), responseData);
}
private BaseResponse buildSuccessResponse(List<SimilarFileDTO> list, MessageCode messageCode) {
Map<String, Object> responseData = new HashMap<>();
responseData.put("content", list);
responseData.put("totalElements", list.size());
return new BaseResponse(20004, messageCode.getCode(),
messageCode.getDescription(), responseData);
}
@GetMapping("/v{version}/files/progress/{uploadId}")