@@ -46,8 +46,8 @@ public class FileSimilarityService {
|
||||
|
||||
private final FileEntityRepository fileEntityRepository;
|
||||
|
||||
@Lazy
|
||||
private final NoCopyFileService noCopyFileService;
|
||||
// @Lazy
|
||||
// private final NoCopyFileService noCopyFileService;
|
||||
|
||||
@Value("${server.baseurl}")
|
||||
private String baseUrl;
|
||||
@@ -164,114 +164,80 @@ public class FileSimilarityService {
|
||||
}
|
||||
}
|
||||
|
||||
public Page<SimilarFileDTO> findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable,
|
||||
String authToken) throws Exception {
|
||||
FileEntity fileEntity = fileEntityRepository.findByFileId(fileId);
|
||||
String mimeType = fileEntity.getMimeType();
|
||||
List<SimilarFileDTO> allResults = new ArrayList<>();
|
||||
// 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);
|
||||
// }
|
||||
|
||||
if (mimeType.equals("image")) {
|
||||
public Page<SimilarFileDTO> findSimilarFiles(
|
||||
String fileId,
|
||||
List<String> similarityLevels,
|
||||
Pageable pageable,
|
||||
String authToken) {
|
||||
|
||||
try {
|
||||
var imageHashEntity = hashRepository.findById(fileId)
|
||||
.orElseThrow(() -> new RuntimeException("Hash not found"));
|
||||
.orElseThrow(() -> new RuntimeException("Hash not found for file: " + fileId));
|
||||
|
||||
Long hash64Hi = imageHashEntity.getHash64Hi();
|
||||
Long hash64Lo = imageHashEntity.getHash64Lo();
|
||||
List<SimilarImageProjection> candidates = authToken.equals("all") ? repository.findCandidates(fileId):
|
||||
repository.findCandidatesFromUserFiles(fileId, authTokenRepository.findUserIdByToken(authToken));
|
||||
List<SimilarImageProjection> candidates;
|
||||
if (authToken == null || "all".equals(authToken)) {
|
||||
candidates = repository.findCandidates(fileId);
|
||||
} else {
|
||||
Long userId = authTokenRepository.findUserIdByToken(authToken);
|
||||
candidates = repository.findCandidatesFromUserFiles(fileId, userId);
|
||||
}
|
||||
|
||||
List<String> similarityLevels = (filter != null && filter.getSimilarityLevels() != null)
|
||||
? filter.getSimilarityLevels()
|
||||
List<String> levels = (similarityLevels != null && !similarityLevels.isEmpty())
|
||||
? similarityLevels
|
||||
: List.of("DUPLICATE", "SIMILAR", "DIFFERENT");
|
||||
|
||||
allResults = candidates.stream()
|
||||
.map(c -> createSimilarFileResponse(c, hash64Hi, hash64Lo))
|
||||
.filter(response -> similarityLevels.contains(response.getSimilarityLevel()))
|
||||
List<SimilarFileDTO> allResults = candidates.stream()
|
||||
.map(c -> createSimilarFileResponse(c,
|
||||
imageHashEntity.getHash64Hi(),
|
||||
imageHashEntity.getHash64Lo()))
|
||||
.filter(dto -> levels.contains(dto.getSimilarityLevel()))
|
||||
.sorted(Comparator.comparingInt(SimilarFileDTO::getHammingDistance))
|
||||
.collect(Collectors.toList());
|
||||
} else {
|
||||
// Long userId = fileEntity.getUserId();
|
||||
// List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
||||
// NoCopyCheckResult noCopyCheckResult;
|
||||
//
|
||||
// for (FileEntity file : fileEntityList) {
|
||||
// Path path = Paths.get(file.getFilePath());
|
||||
// if (mimeType.equals("document")) {
|
||||
// noCopyCheckResult = (DocumentCheckResult) noCopyFileService.checkFile(
|
||||
// path.toFile(), FileProtector.Type.valueOf(file.getMimeType().toUpperCase()));
|
||||
// } else {
|
||||
// noCopyCheckResult = (AudioCheckResult) noCopyFileService.checkFile(
|
||||
// path.toFile(), FileProtector.Type.valueOf(file.getMimeType().toUpperCase()));
|
||||
// }
|
||||
//
|
||||
// switch (noCopyCheckResult) {
|
||||
// case DocumentCheckResult.Success success -> {
|
||||
// FileProtector.FileInfo info = success.getInfo();
|
||||
// allResults.add(buildDTO(file));
|
||||
// }
|
||||
// case DocumentCheckResult.Failed failed -> {
|
||||
// String message = failed.getMessage();
|
||||
// }
|
||||
// default -> throw new IllegalStateException("Unexpected result");
|
||||
// }
|
||||
// }
|
||||
|
||||
Long userId = fileEntity.getUserId();
|
||||
List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType);
|
||||
List<String> errors = new ArrayList<>();
|
||||
int start = (int) pageable.getOffset();
|
||||
int end = Math.min((start + pageable.getPageSize()), allResults.size());
|
||||
List<SimilarFileDTO> pageContent = start < allResults.size() ?
|
||||
allResults.subList(start, end) : Collections.emptyList();
|
||||
|
||||
for (FileEntity file : fileEntityList) {
|
||||
try {
|
||||
Path path = Paths.get(file.getFilePath());
|
||||
return new PageImpl<>(pageContent, pageable, allResults.size());
|
||||
|
||||
FileProtector.Type fileType = file.getMimeType().equals("document") ? FileProtector.Type.DOC:
|
||||
FileProtector.Type.AUDIO;
|
||||
|
||||
NoCopyCheckResult noCopyCheckResult = noCopyFileService.checkFile(path.toFile(), fileType);
|
||||
|
||||
switch (noCopyCheckResult) {
|
||||
case DocumentCheckResult.Success success -> {
|
||||
FileProtector.FileInfo info = success.getInfo();
|
||||
allResults.add(buildDTO(file));
|
||||
log.debug("File processed successfully: {}", file.getFilePath());
|
||||
}
|
||||
case AudioCheckResult.Success success -> {
|
||||
FileProtector.FileInfo info = success.getInfo();
|
||||
allResults.add(buildDTO(file));
|
||||
log.debug("File processed successfully: {}", file.getFilePath());
|
||||
}
|
||||
case DocumentCheckResult.Failed failed -> {
|
||||
String errorMessage = String.format("Document check failed for %s: %s",
|
||||
file.getFilePath(), failed.getMessage());
|
||||
log.warn(errorMessage);
|
||||
errors.add(errorMessage);
|
||||
}
|
||||
case AudioCheckResult.Failed failed -> {
|
||||
String errorMessage = String.format("Audio check failed for %s: %s",
|
||||
file.getFilePath(), failed.getMessage());
|
||||
log.warn(errorMessage);
|
||||
errors.add(errorMessage);
|
||||
}
|
||||
default -> throw new IllegalStateException("Unexpected result type: " + noCopyCheckResult.getClass().getSimpleName());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String errorMessage = String.format("Error processing file %s: %s",
|
||||
file.getFilePath(), e.getMessage());
|
||||
log.error(errorMessage, e);
|
||||
errors.add(errorMessage);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error finding similar files for fileId: {}", fileId, e);
|
||||
return new PageImpl<>(Collections.emptyList(), pageable, 0);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -322,7 +288,7 @@ public class FileSimilarityService {
|
||||
.build();
|
||||
}
|
||||
|
||||
private SimilarFileDTO buildDTO(FileEntity fileEntity) {
|
||||
public SimilarFileDTO buildDTO(FileEntity fileEntity) {
|
||||
return SimilarFileDTO.builder()
|
||||
.fileId(fileEntity.getId())
|
||||
.ownerId(fileEntity.getUserId())
|
||||
|
||||
Reference in New Issue
Block a user