@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user