diff --git a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java index 7f9eaef..3c15c4d 100644 --- a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java @@ -66,36 +66,18 @@ public class ImageFoundRequestHandler implements RequestHandler { searchResponseYandex = searchImageService.searchReverseByPublicUrl(fileEntity, "yandex_reverse_image", "visual_matches"); log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); - log.info("searchResponseYandex OK"); List allYandexImages = searchImageService.getAllImagesWithoutPagination( searchResponseYandex, "visual_matches"); searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens", "exact_matches"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); - log.info("searchResponseGoogle OK"); + log.info("searchResponseGoogle OK"); List allGoogleImages = searchImageService.getAllImagesWithoutPagination( searchResponseGoogle, "exact_matches"); allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages, allGoogleImages); log.info("allUniqueImages OK"); - log.info("allUniqueImages OK"); - log.info("allUniqueImages OK"); - log.info("allUniqueImages OK"); - log.info("allUniqueImages OK"); - log.info("allUniqueImages OK"); + } catch (TimeoutException e) { log.warn("Search timeout for file {}, returning empty results", fileId); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index 69edde1..b110bfc 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -35,6 +35,8 @@ public class FileSimilarityService { private final AuthTokenRepository authTokenRepository; + private final FileEntityRepository fileEntityRepository; + @Value("${server.baseurl}") private String baseUrl; @@ -138,7 +140,18 @@ public class FileSimilarityService { return duplicates; } - private final FileEntityRepository fileEntityRepository; + public boolean 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)) { + return true; + } + } + + return false; + } public Page findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable, String authToken) throws Exception { @@ -165,12 +178,12 @@ public class FileSimilarityService { .sorted(Comparator.comparingInt(SimilarFileDTO::getHammingDistance)) .collect(Collectors.toList()); } else { - String hash = calculateFileHash(fileEntity); + String hash = calculateFileHash(fileEntity.getFilePath()); Long userId = fileEntity.getUserId(); List fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType); for (FileEntity file : fileEntityList) { - if (calculateFileHash(file).equals(hash)) { + if (calculateFileHash(file.getFilePath()).equals(hash)) { allResults.add(buildDTO(file)); } } @@ -189,28 +202,15 @@ public class FileSimilarityService { } - private String calculateFileHash(FileEntity fileEntity) throws Exception { + private String calculateFileHash(String path) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); -// if (fileEntity.getStatus() == FileStatus.CLOUD) { -// File tempFile = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); -// try (InputStream is = new FileInputStream(tempFile)) { -// byte[] buffer = new byte[8192]; -// int read; -// while ((read = is.read(buffer)) > 0) { -// digest.update(buffer, 0, read); -// } -// } finally { -// tempFile.delete(); -// } -// } else { - try (InputStream is = new FileInputStream(fileEntity.getFilePath())) { - byte[] buffer = new byte[8192]; - int read; - while ((read = is.read(buffer)) > 0) { - digest.update(buffer, 0, read); - } -// } + try (InputStream is = new FileInputStream(path)) { + byte[] buffer = new byte[8192]; + int read; + while ((read = is.read(buffer)) > 0) { + digest.update(buffer, 0, read); + } } byte[] hashBytes = digest.digest(); 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 77a0634..5b33c53 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,8 +315,11 @@ public class FileUploadServiceImpl implements FileUploadService { String finalFilePath = assembleFileSynchronously(session); - if (!session.getFileType().startsWith("video") && findSimilar == 0) { + if (session.getFileType().startsWith("image") && findSimilar == 0) { checkForDuplicatesSynchronously(finalFilePath); + } else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document") + && findSimilar == 0) { + fileSimilarityService.hasDuplicatesByHash(finalFilePath, session.getUserId(), session.getFileType()); } session.setStatus(UploadStatus.COMPLETED);