From f3a0ab8181067eeea9654bfc5becd3f0232ac29a Mon Sep 17 00:00:00 2001 From: vladp Date: Fri, 27 Feb 2026 01:47:50 +0700 Subject: [PATCH] dev conver files --- .../nocopy/controller/ApiController.java | 50 ++++--------------- .../repository/FileEntityRepository.java | 3 ++ .../nocopy/service/FileSimilarityService.java | 27 ++++++++-- .../file/impl/FileUploadServiceImpl.java | 3 +- 4 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 2244b3b..db879d8 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -198,9 +198,18 @@ public class ApiController { } } - private List processNonImageFile(FileEntity fileEntity, String authToken) { + private List processNonImageFile(FileEntity fileEntity, String authToken) throws Exception { List results = new ArrayList<>(); + FileEntity duplicateByHash = fileSimilarityService.findDuplicateByHash(fileEntity.getProtectedFilePath(), + fileEntity.getMimeType(), fileEntity.getUserId()); + + if (duplicateByHash != null) { + results.add(fileSimilarityService.buildDTO(duplicateByHash)); + + return results; + } + File file = new File(fileEntity.getFilePath()); FileProtector.Type type = "document".equals(fileEntity.getMimeType()) ? FileProtector.Type.DOC : FileProtector.Type.AUDIO; @@ -465,45 +474,6 @@ public class ApiController { } } -// @GetMapping("/protect/{fileId}") -// public ResponseEntity protect( @PathVariable(required = false) String fileId) { -// Optional optionalFileEntity = fileEntityRepository.findById(fileId); -// -// if (!optionalFileEntity.isPresent()) { -// return ResponseEntity.notFound().build(); -// } -// FileEntity fileEntity = optionalFileEntity.get(); -// FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity); -// -// noCopyFileService.addFile(fileInfo); -// -// fileEntity.setProtectionStatus(ProtectionStatus.PROCESSING); -// fileEntityRepository.save(fileEntity); -// -// return ResponseEntity.ok().build(); -// } -// -// @GetMapping("/check/{fileId}/{type}") -// public ResponseEntity check(@PathVariable(required = false) String fileId, -// @PathVariable(required = false) String type) { -// Optional optionalFileEntity = fileEntityRepository.findById(fileId); -// -// if (!optionalFileEntity.isPresent()) { -// return ResponseEntity.notFound().build(); -// } -// -// FileEntity fileEntity = optionalFileEntity.get(); -// -// Path path = Paths.get(fileEntity.getProtectedFilePath()); -// -// File file = path.toFile(); -// -// NoCopyCheckResult noCopyCheckResult = noCopyFileService.checkFile(file, -// FileProtector.Type.valueOf(type.toUpperCase())); -// -// return ResponseEntity.ok().body(noCopyCheckResult); -// } - @GetMapping("/check/file_stats") public ResponseEntity checkFileProtectStats(@RequestHeader("Authorization") String tokenHeader) { String token = tokenHeader.replace("Bearer ", ""); diff --git a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java index 17cf09e..234cbc4 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java @@ -59,6 +59,9 @@ public interface FileEntityRepository extends JpaRepository @Query("SELECT f FROM FileEntity f WHERE f.mimeType = :mimeType") List findByMimeType(String mimeType); + @Query("SELECT f FROM FileEntity f WHERE f.mimeType = :mimeType AND f.userId IN :userIds") + List findByMimeTypeAndUserIds(String mimeType, List userIds); + @Query("SELECT MAX(f.supportId) FROM FileEntity f") Integer findMaxSupportId(); diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index da1b0e0..4401cad 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -103,16 +103,35 @@ public class FileSimilarityService { return duplicates; } - public void hasDuplicatesByHash(String path, String mimeType) throws Exception { + public void hasDuplicatesByHash(String path, String mimeType, Long userId) throws Exception { + FileEntity duplicateByHash = findDuplicateByHash(path, mimeType, userId); + if (duplicateByHash != null) { + throw new DuplicateImageException("Duplicate", duplicateByHash.getId(), + duplicateByHash.getUserId()); + } + } + + public FileEntity findDuplicateByHash(String path, String mimeType, Long userId) throws Exception { String hash = calculateFileHash(path); - List fileEntityList = fileEntityRepository.findByMimeType(mimeType); + User user = userRepository.findById(userId).orElseThrow(); + Company company = user.getCompany(); + List userIds = new ArrayList<>(); + + if (company != null) { + userIds.addAll(company.getUsers().stream().map(User::getId).toList()); + } else { + userIds.add(userId); + } + + List fileEntityList = fileEntityRepository.findByMimeTypeAndUserIds(mimeType, userIds); for (FileEntity file : fileEntityList) { if (calculateFileHash(file.getFilePath()).equals(hash)) { - throw new DuplicateImageException("Duplicate", file.getId(), - file.getUserId()); + return file; } } + + return null; } private final UserRepository userRepository; 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 e601f8c..cfcba2c 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 @@ -319,7 +319,8 @@ public class FileUploadServiceImpl implements FileUploadService { if (session.getFileType().startsWith("image")) { checkForDuplicatesSynchronously(finalFilePath); } else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document")) { - fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType()); + fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType(), + session.getUserId()); File file = new File(finalFilePath);