@@ -157,88 +157,6 @@ 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,
|
||||
|
||||
@@ -46,51 +46,9 @@ public class FileSimilarityService {
|
||||
|
||||
private final FileEntityRepository fileEntityRepository;
|
||||
|
||||
// @Lazy
|
||||
// private final NoCopyFileService noCopyFileService;
|
||||
|
||||
@Value("${server.baseurl}")
|
||||
private String baseUrl;
|
||||
|
||||
public List<SimilarFileDTO> findSimilarFiles(String fileId) {
|
||||
var imageHashEntity = hashRepository.findById(fileId)
|
||||
.orElseThrow(() -> new RuntimeException("Hash not found"));
|
||||
|
||||
Long hash64Hi = imageHashEntity.getHash64Hi();
|
||||
Long hash64Lo = imageHashEntity.getHash64Lo();
|
||||
|
||||
List<SimilarImageProjection> 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<SimilarFileDTO> findDuplicateByHammingDistance(String fileId, int hammingDistance,
|
||||
int duplicate, int similar) {
|
||||
List<SimilarImageProjection> 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<FileEntity> 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<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
||||
|
||||
// public Page<SimilarFileDTO> 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<SimilarImageProjection> candidates = authToken.equals("all") ? repository.findCandidates(fileId):
|
||||
// repository.findCandidatesFromUserFiles(fileId, authTokenRepository.findUserIdByToken(authToken));
|
||||
//
|
||||
// List<String> similarityLevels = (filter != null && filter.getSimilarityLevels() != null)
|
||||
// ? filter.getSimilarityLevels()
|
||||
// : List.of("DUPLICATE", "SIMILAR", "DIFFERENT");
|
||||
//
|
||||
// List<SimilarFileDTO> 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<SimilarFileDTO> 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<SimilarFileDTO> findSimilarFiles(
|
||||
String fileId,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user