dev delete config
Test Workflow / test (push) Waiting to run

This commit is contained in:
vladp
2026-02-17 15:39:26 +07:00
parent 8de13b410b
commit 74ba9709a9
5 changed files with 15 additions and 173 deletions
@@ -157,88 +157,6 @@ public class ApiController {
private final NoCopyFileService noCopyFileService; 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") @GetMapping("/v{version}/files/{fileId}/similar")
public ResponseEntity<BaseResponse> findSimilarFiles( public ResponseEntity<BaseResponse> findSimilarFiles(
@PathVariable("version") int version, @PathVariable("version") int version,
@@ -46,51 +46,9 @@ public class FileSimilarityService {
private final FileEntityRepository fileEntityRepository; private final FileEntityRepository fileEntityRepository;
// @Lazy
// private final NoCopyFileService noCopyFileService;
@Value("${server.baseurl}") @Value("${server.baseurl}")
private String 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, public List<SimilarFileDTO> findDuplicateByHammingDistance(String fileId, int hammingDistance,
int duplicate, int similar) { int duplicate, int similar) {
List<SimilarImageProjection> candidates = repository.findCandidates(fileId); List<SimilarImageProjection> candidates = repository.findCandidates(fileId);
@@ -152,50 +110,17 @@ public class FileSimilarityService {
return duplicates; return duplicates;
} }
// public void hasDuplicatesByHash(String path, Long userId, String mimeType) throws Exception { public void hasDuplicatesByHash(String path, Long userId, String mimeType) throws Exception {
// String hash = calculateFileHash(path); String hash = calculateFileHash(path);
// List<FileEntity> fileEntityList = fileEntityRepository.findByUserIdAndMimeType(userId, mimeType); 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 Page<SimilarFileDTO> findSimilarFiles(String fileId, SimilarityFilter filter, Pageable pageable, for (FileEntity file : fileEntityList) {
// String authToken) throws Exception { if (calculateFileHash(file.getFilePath()).equals(hash)) {
// throw new DuplicateImageException("Duplicate", file.getId(),
// var imageHashEntity = hashRepository.findById(fileId) file.getUserId());
// .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);
// }
public Page<SimilarFileDTO> findSimilarFiles( public Page<SimilarFileDTO> findSimilarFiles(
String fileId, String fileId,
@@ -15,9 +15,6 @@ import java.nio.file.Paths;
@Slf4j @Slf4j
public class FileStorageService { public class FileStorageService {
// @Autowired
// private FileStorageConfig storageConfig;
@Value("${file.storage.base-path}") @Value("${file.storage.base-path}")
private String basePath; private String basePath;
@@ -26,6 +26,8 @@ public class AudioLocalSearchImpl implements AudioLocalSearch {
public @Nullable FileProtector.FileInfo findBySignature(@NotNull String signature) { public @Nullable FileProtector.FileInfo findBySignature(@NotNull String signature) {
FileEntity fileEntity = fileEntityService.findBySignature(signature); FileEntity fileEntity = fileEntityService.findBySignature(signature);
if (fileEntity == null) return null;
return fileUtil.createFileInfo(fileEntity); return fileUtil.createFileInfo(fileEntity);
} }
@@ -315,15 +315,15 @@ public class FileUploadServiceImpl implements FileUploadService {
boolean isLastChunk = session.getChunksUploaded().equals(session.getTotalChunks()); boolean isLastChunk = session.getChunksUploaded().equals(session.getTotalChunks());
if (isLastChunk) { if (isLastChunk) {
log.info("All chunks uploaded for session {}. Starting assembly...",
session.getUploadId());
String finalFilePath = assembleFileSynchronously(session); String finalFilePath = assembleFileSynchronously(session);
if (findSimilar == 0) { if (findSimilar == 0) {
if (session.getFileType().startsWith("image")) { if (session.getFileType().startsWith("image")) {
checkForDuplicatesSynchronously(finalFilePath); checkForDuplicatesSynchronously(finalFilePath);
} else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document")) { } else if (session.getFileType().startsWith("audio") || session.getFileType().startsWith("document")) {
fileSimilarityService.hasDuplicatesByHash(finalFilePath, session.getUserId(),
session.getFileType());
File file = new File(finalFilePath); File file = new File(finalFilePath);
FileProtector.Type type = "document".equals(session.getFileType()) ? FileProtector.Type type = "document".equals(session.getFileType()) ?
FileProtector.Type.DOC : FileProtector.Type.AUDIO; FileProtector.Type.DOC : FileProtector.Type.AUDIO;