diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 45a0721..9211860 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -157,88 +157,6 @@ public class ApiController { private final NoCopyFileService noCopyFileService; -// @GetMapping("/v{version}/files/{fileId}/similar") -// public ResponseEntity findSimilarFiles( -// @PathVariable("version") int version, -// @PathVariable String fileId, -// @RequestParam(value = "auth_token",required = false) String authToken, -// @RequestParam(required = false) List similarityLevels, -// @PageableDefault(size = 20, sort = "hammingDistance") Pageable pageable) throws Exception { -// SimilarityFilter filter = SimilarityFilter.builder() -// .similarityLevels(similarityLevels) -// .build(); -// FileEntity fileEntity = fileEntityRepository.findByFileId(fileId); -// Page similarFiles = null; -// List allResults = null; -// List 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 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 findSimilarFiles( @PathVariable("version") int version, diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index 8ad1d12..4219c9e 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -46,51 +46,9 @@ public class FileSimilarityService { private final FileEntityRepository fileEntityRepository; -// @Lazy -// private final NoCopyFileService noCopyFileService; - @Value("${server.baseurl}") private String baseUrl; - public List findSimilarFiles(String fileId) { - var imageHashEntity = hashRepository.findById(fileId) - .orElseThrow(() -> new RuntimeException("Hash not found")); - - Long hash64Hi = imageHashEntity.getHash64Hi(); - Long hash64Lo = imageHashEntity.getHash64Lo(); - - List candidates = repository.findCandidates(fileId); - - return candidates.stream() - .map(c -> { - Long cHi = c.getHash64Hi(); - Long cLo = c.getHash64Lo(); - - int hamming = fileUtil.hamming64(hash64Hi, hash64Lo, cHi, cLo); - - String level; - if (hamming <= 5) { - level = "DUPLICATE"; - } else if (hamming <= 12) { - level = "SIMILAR"; - } else { - level = "DIFFERENT"; - } - - return SimilarFileDTO.builder() - .fileId(c.getId()) - .ownerId(c.getUserId()) - .originalFileName(c.getOriginalFileName()) - .fileSize(c.getFileSize()) - .hammingDistance(hamming) - .similarityLevel(level) - .build(); - }) - .sorted((a, b) -> - Integer.compare(a.getHammingDistance(), b.getHammingDistance())) - .toList(); - } - public List findDuplicateByHammingDistance(String fileId, int hammingDistance, int duplicate, int similar) { List candidates = repository.findCandidates(fileId); @@ -152,50 +110,17 @@ public class FileSimilarityService { return duplicates; } -// public void hasDuplicatesByHash(String path, Long userId, String mimeType) throws Exception { -// String hash = calculateFileHash(path); -// List fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType); -// -// for (FileEntity file : fileEntityList) { -// if (calculateFileHash(file.getFilePath()).equals(hash)) { -// throw new DuplicateImageException("Duplicate", file.getId(), -// file.getUserId()); -// } -// } -// } + public void hasDuplicatesByHash(String path, Long userId, String mimeType) throws Exception { + String hash = calculateFileHash(path); + List fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType); -// public Page findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable, -// String authToken) throws Exception { -// -// var imageHashEntity = hashRepository.findById(fileId) -// .orElseThrow(() -> new RuntimeException("Hash not found")); -// -// Long hash64Hi = imageHashEntity.getHash64Hi(); -// Long hash64Lo = imageHashEntity.getHash64Lo(); -// List candidates = authToken.equals("all") ? repository.findCandidates(fileId): -// repository.findCandidatesFromUserFiles(fileId, authTokenRepository.findUserIdByToken(authToken)); -// -// List similarityLevels = (filter != null && filter.getSimilarityLevels() != null) -// ? filter.getSimilarityLevels() -// : List.of("DUPLICATE", "SIMILAR", "DIFFERENT"); -// -// List allResults = candidates.stream() -// .map(c -> createSimilarFileResponse(c, hash64Hi, hash64Lo)) -// .filter(response -> similarityLevels.contains(response.getSimilarityLevel())) -// .sorted(Comparator.comparingInt(SimilarFileDTO::getHammingDistance)) -// .collect(Collectors.toList()); -// -// int total = allResults.size(); -// int page = (pageable != null) ? pageable.getPageNumber() : 0; -// int size = (pageable != null) ? pageable.getPageSize() : 20; -// -// int fromIndex = Math.min(page * size, total); -// int toIndex = Math.min(fromIndex + size, total); -// -// List pageContent = allResults.subList(fromIndex, toIndex); -// -// return new PageImpl<>(pageContent, pageable, total); -// } + for (FileEntity file : fileEntityList) { + if (calculateFileHash(file.getFilePath()).equals(hash)) { + throw new DuplicateImageException("Duplicate", file.getId(), + file.getUserId()); + } + } + } public Page findSimilarFiles( String fileId, diff --git a/src/main/java/ru/soune/nocopy/service/file/FileStorageService.java b/src/main/java/ru/soune/nocopy/service/file/FileStorageService.java index 421f577..1a7a2fb 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileStorageService.java @@ -15,9 +15,6 @@ import java.nio.file.Paths; @Slf4j public class FileStorageService { -// @Autowired -// private FileStorageConfig storageConfig; - @Value("${file.storage.base-path}") private String basePath; diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java index 6ac96bb..dd47c08 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java @@ -26,6 +26,8 @@ public class AudioLocalSearchImpl implements AudioLocalSearch { public @Nullable FileProtector.FileInfo findBySignature(@NotNull String signature) { FileEntity fileEntity = fileEntityService.findBySignature(signature); + if (fileEntity == null) return null; + return fileUtil.createFileInfo(fileEntity); } diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java index 6c029a1..bc080c0 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java @@ -315,15 +315,15 @@ public class FileUploadServiceImpl implements FileUploadService { boolean isLastChunk = session.getChunksUploaded().equals(session.getTotalChunks()); if (isLastChunk) { - log.info("All chunks uploaded for session {}. Starting assembly...", - session.getUploadId()); - String finalFilePath = assembleFileSynchronously(session); if (findSimilar == 0) { if (session.getFileType().startsWith("image")) { checkForDuplicatesSynchronously(finalFilePath); } else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document")) { + fileSimilarityService.hasDuplicatesByHash(finalFilePath, session.getUserId(), + session.getFileType()); + File file = new File(finalFilePath); FileProtector.Type type = "document".equals(session.getFileType()) ? FileProtector.Type.DOC : FileProtector.Type.AUDIO;