From 2985d84b046983e6c2388b6a9bed9cf470923171 Mon Sep 17 00:00:00 2001 From: vladp Date: Fri, 13 Feb 2026 21:11:30 +0700 Subject: [PATCH 01/41] NCBACK-35 add cloud for save when download last chunk and after protected --- README.md | 12 ++- build.gradle | 6 ++ .../nocopy/controller/ApiController.java | 17 ++-- .../nocopy/controller/PhotoController.java | 86 ++++++++++++++++ .../service/file/FileEntityService.java | 9 +- .../service/file/FileUploadService.java | 3 +- .../file/cloud/CloudStorageService.java | 97 +++++++++++++++++++ .../file/impl/FileUploadServiceImpl.java | 36 +++++-- .../file/impl/ProtectionFileProviderImpl.java | 62 ++++++++++-- src/main/resources/application.yaml | 7 ++ 10 files changed, 305 insertions(+), 30 deletions(-) create mode 100644 src/main/java/ru/soune/nocopy/controller/PhotoController.java create mode 100644 src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java diff --git a/README.md b/README.md index 602cdd0..0d10a52 100644 --- a/README.md +++ b/README.md @@ -150,4 +150,14 @@ INSERT INTO referral_levels (id, name, min_invitees, reward_percentage) VALUES ('bronze', 'BRONZE', 0, 15), ('silver', 'SILVER', 6, 18), ('gold', 'GOLD', 16, 22), -('platinum', 'PLATINUM', 50, 25); \ No newline at end of file +('platinum', 'PLATINUM', 50, 25); + +------ + +Настройка Яндекс Клауд + +1. YCAJEpWAtaVkVGX0sH6_EupEg - индетификатор ключа +2. YCMmVykfXrZ_nfU13Vo4yoCVGa70DnTlBgF1pUzO - секретный ключ + + private static final String KEY_ID = "YCAJEmHZcWxzf4oGWvETG3mms"; + private static final String SECRET_KEY = "YCPAPZ32XC-LWb8xE0b_xTcBD8NZUCHpSOfu8LUG"; \ No newline at end of file diff --git a/build.gradle b/build.gradle index d8aaad8..745ea98 100644 --- a/build.gradle +++ b/build.gradle @@ -65,6 +65,12 @@ dependencies { implementation project(':referral') + //cloud + implementation("software.amazon.awssdk:aws-sdk-java:2.29.33") + implementation("software.amazon.awssdk:apache-client:2.29.33") + + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0") + implementation("org.springframework.boot:spring-boot-starter-web") } tasks.named('test') { diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 0e3c75a..d267848 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -32,6 +32,7 @@ import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.file.ProtectionsLimitService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileUploadService; @@ -291,6 +292,8 @@ public class ApiController { } } + private final CloudStorageService cloudStorageService; + @GetMapping("/v{version}/files/download/{fileId}") public ResponseEntity downloadFile( @PathVariable(required = false) String fileId, @@ -342,29 +345,29 @@ public class ApiController { errorData)); } - Path filePath = Paths.get(entityResponse.getProtectedFilePath()); -// Resource resource = new UrlResource(filePath.toUri()); - FileSystemResource resource = new FileSystemResource(filePath); + File file = cloudStorageService.readFileFromStorageByPath( + entityResponse.getProtectedFilePath()); long fileSize = Files.size(filePath); - if (!resource.exists()) { + if (!file.exists()) { Map errorData = new HashMap<>(); - errorData.put("resource", resource.exists()); + errorData.put("file", file.exists()); return ResponseEntity.ok().body(new BaseResponse(20004, MessageCode.FILE_DOWNLOAD_ERROR.getCode(), MessageCode.FILE_DOWNLOAD_ERROR.getDescription(), errorData)); } - String contentType = determineContentType(filePath); + + String contentType = determineContentType(filePath); return ResponseEntity.ok() .contentLength(fileSize) .contentType(MediaType.parseMediaType(contentType)) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") - .body(resource); + .body(file); } catch (FileEntityNotFoundException e) { Map errorData = new HashMap<>(); errorData.put("fileId", fileId); diff --git a/src/main/java/ru/soune/nocopy/controller/PhotoController.java b/src/main/java/ru/soune/nocopy/controller/PhotoController.java new file mode 100644 index 0000000..7a3b856 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/controller/PhotoController.java @@ -0,0 +1,86 @@ +package ru.soune.nocopy.controller; + +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; + +import java.io.IOException; +import java.net.URI; + +import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; + +@RestController +@RequestMapping("/photos") +@Tag(name = "Photos") +@ApiResponses(@ApiResponse(responseCode = "200", useReturnTypeSchema = true)) +public class PhotoController { + + private static final String KEY_ID = "YCAJEmHZcWxzf4oGWvETG3mms"; + private static final String SECRET_KEY = "YCPAPZ32XC-LWb8xE0b_xTcBD8NZUCHpSOfu8LUG"; + private static final String REGION = "ru-central1"; + private static final String S3_ENDPOINT = "https://storage.yandexcloud.net"; + + private static final String BUCKET = "ncp-test-storage"; + + private final S3Client s3Client; + + public PhotoController() { + AwsCredentials credentials = AwsBasicCredentials.create(KEY_ID, SECRET_KEY); + + s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(REGION)) + .endpointOverride(URI.create(S3_ENDPOINT)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + } + + + @PutMapping(consumes = MULTIPART_FORM_DATA_VALUE) + public String uploadFile(@RequestParam MultipartFile photo) throws IOException { + + String key = "photos/" + photo.getOriginalFilename(); + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(BUCKET) + .key(key) + .contentType(photo.getContentType()) + .build(); + + s3Client.putObject(putObjectRequest, RequestBody.fromBytes(photo.getBytes())); + + return key; + } + + @GetMapping + public ResponseEntity downloadFile(@RequestParam String key) throws IOException { + GetObjectRequest objectRequest = GetObjectRequest.builder() + .bucket(BUCKET) + .key(key) + .build(); + + var inputStream = s3Client.getObject(objectRequest); + byte[] data = inputStream.readAllBytes(); + + var headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline"); + headers.add(HttpHeaders.CONTENT_TYPE, inputStream.response().contentType()); + + return ResponseEntity.ok() + .headers(headers) + .body(data); + } +} + diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index b91eca9..33267b4 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -241,6 +241,10 @@ public class FileEntityService { fileEntityRepository.delete(fileEntity); } + public void deleteFromDisk(String deleteFilePath) throws IOException { + Files.deleteIfExists(Paths.get(deleteFilePath)); + } + @Transactional(readOnly = true) public long getUserStorageUsed(Long userId) { Long totalSize = fileEntityRepository.getTotalSizeByUserId(userId); @@ -256,12 +260,11 @@ public class FileEntityService { } @Transactional - public void writeProtectedFile(String id, byte[] data, String fileExt) throws IOException { + public FileEntity writeProtectedFile(String id, byte[] data, String fileExt) throws IOException { FileEntity fileEntity = fileEntityRepository.findById(id) .orElseThrow(() -> new RuntimeException("File not found: " + id)); String extension = determineFileExtension(fileExt, fileEntity); - log.info("EXTENSION: {}", extension); Path protectedFilePath = prepareProtectedPath(fileEntity, extension); if (Files.exists(protectedFilePath)) { @@ -276,7 +279,7 @@ public class FileEntityService { fileEntity.setFileExtension(extension); fileEntity.setProtectionStatus(ProtectionStatus.PROTECTED); - fileEntityRepository.save(fileEntity); + return fileEntityRepository.save(fileEntity); } public void clearTempFiles(long userId) throws IOException { diff --git a/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java b/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java index 1ae1a28..cab2d8e 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java @@ -2,6 +2,7 @@ package ru.soune.nocopy.service.file; import org.springframework.web.multipart.MultipartFile; import ru.soune.nocopy.dto.file.UploadProgressResponse; +import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.file.FileUploadSession; @@ -19,5 +20,5 @@ public interface FileUploadService { UploadProgressResponse getUploadProgress(String uploadId); - void completeFileProcessingAsync(FileUploadSession session, FileStatus status); + FileEntity completeFileProcessingAsync(FileUploadSession session, FileStatus status); } diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java new file mode 100644 index 0000000..8b848d5 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -0,0 +1,97 @@ +package ru.soune.nocopy.service.file.cloud; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import ru.soune.nocopy.service.file.FileEntityService; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; + +@Service +@Slf4j +@RequiredArgsConstructor +public class CloudStorageService { + + private final FileEntityService fileEntityService; + + @Value("${yandex.cloud.key}") + private String key; + + @Value("${yandex.cloud.secret-key}") + private String secretKey; + + @Value("${yandex.cloud.region}") + private String region; + + @Value("${yandex.cloud.s3-endpoint}") + private String s3endpoint; + + @Value("${yandex.cloud.bucket}") + private String bucket; + + public void saveFilesToStorage(String mimeType, String extension, String sendToCloudFilePath) { + AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); + + S3Client s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(region)) + .endpointOverride(URI.create(s3endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + + String mimeTypeFromFile = mimeType.equals("document") ? "application" : mimeType; + String contentType = mimeTypeFromFile + "/" + extension; + String filePath = "files/" + sendToCloudFilePath; + + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(filePath) + .contentType(contentType) + .build(); + + try { + s3Client.putObject(putObjectRequest, + RequestBody.fromBytes(Files.readAllBytes(Paths.get(sendToCloudFilePath)))); + fileEntityService.deleteFromDisk(sendToCloudFilePath); + } catch (IOException e) { + log.error("Failed to read file: {}", filePath, e); + } + } + + public File readFileFromStorageByPath(String filePath) throws IOException { + GetObjectRequest objectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key("files/" + filePath) + .build(); + AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); + + S3Client s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(region)) + .endpointOverride(URI.create(s3endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + + String tempDir = System.getProperty("java.io.tmpdir"); + String fileName = filePath.replace("/", "_"); + File tempFile = new File(tempDir, fileName); + + s3Client.getObject(objectRequest, tempFile.toPath()); + + return tempFile; + } +} 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 db52626..0f1b889 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 @@ -3,6 +3,7 @@ package ru.soune.nocopy.service.file.impl; import com.vrt.NoCopyFileService; import com.vrt.fileprotection.FileProtector; import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +25,7 @@ import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.ImageHashService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileUploadService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.tariff.TariffConstants; import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.util.FileUtil; @@ -83,6 +85,8 @@ public class FileUploadServiceImpl implements FileUploadService { private final TariffInfoService tariffInfoService; + private final CloudStorageService cloudStorageService; + @PostConstruct public void init() { try { @@ -219,7 +223,8 @@ public class FileUploadServiceImpl implements FileUploadService { @Async("fileUploadTaskExecutor") @Transactional @Override - public void completeFileProcessingAsync(FileUploadSession session, FileStatus status) { + public FileEntity completeFileProcessingAsync(FileUploadSession session, FileStatus status) { + FileEntity saved = null; try { Path filePath = Paths.get(session.getFilePath()); String checksum = calculateChecksum(filePath); @@ -238,7 +243,7 @@ public class FileUploadServiceImpl implements FileUploadService { .status(status) .build(); - FileEntity saved = fileEntityRepository.save(fileEntity); + saved = fileEntityRepository.save(fileEntity); if (session.getFileType().equals("image")) { Map hash = imageHashService.calculateHash(filePath); @@ -248,18 +253,13 @@ public class FileUploadServiceImpl implements FileUploadService { cleanupSessionFiles(session); - if (status != FileStatus.TEMP) { - FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity); - - noCopyFileService.addFile(fileInfo); - } - log.info("File processing completed for session: {}", session.getUploadId()); - } catch (Exception e) { log.error("Failed to complete file processing for session {}: {}", session.getUploadId(), e.getMessage(), e); } + + return saved; } private void validateSession(FileUploadSession session) { @@ -291,6 +291,9 @@ public class FileUploadServiceImpl implements FileUploadService { } } + @Autowired + private EntityManager entityManager; + private UploadProgressResponse processChunk(FileUploadSession session, Integer chunkNumber, MultipartFile chunkFile, Integer findSimilar) { String chunkPath = null; @@ -331,8 +334,21 @@ public class FileUploadServiceImpl implements FileUploadService { fileEntityService.clearTempFiles(session.getUserId()); } - completeFileProcessingAsync(session, status); + FileEntity fileEntity = completeFileProcessingAsync(session, status); + //TODO CHECK FOR PROTECTED + fileEntityRepository.flush(); + + entityManager.clear(); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getFilePath()); + + if (status != FileStatus.TEMP) { + FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity); + + noCopyFileService.addFile(fileInfo); + } if (status != FileStatus.TEMP) { String fileType = session.getFileType(); diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 9661001..382301d 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -7,7 +7,10 @@ import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.stereotype.Component; +import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.service.file.FileEntityService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.File; import java.io.IOException; @@ -24,27 +27,55 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { private final FileEntityService fileEntityService; + private final CloudStorageService cloudStorageService; + + private final FileEntityRepository fileEntityRepository; + @Nullable @Override public File getImageFile(@NotNull String id) { - return fileEntityService.getFileById(id); + FileEntity fileEntity = fileEntityRepository.findById(id).orElseThrow(() -> + new RuntimeException("File not found: " + id)); + try { + return cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Nullable @Override public File getVideoFile(@NotNull String id) { - return fileEntityService.getFileById(id); + FileEntity fileEntity = fileEntityRepository.findById(id).orElseThrow(() -> + new RuntimeException("File not found: " + id)); + try { + return cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Nullable @Override public File getAudioFile(@NotNull String id) { - return fileEntityService.getFileById(id); + FileEntity fileEntity = fileEntityRepository.findById(id).orElseThrow(() -> + new RuntimeException("File not found: " + id)); + try { + return cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Override public @Nullable File getDocument(@NotNull String id) { - return fileEntityService.getFileById(id); + FileEntity fileEntity = fileEntityRepository.findById(id).orElseThrow(() -> + new RuntimeException("File not found: " + id)); + try { + return cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Override @@ -79,7 +110,11 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public com.vrt.fileprotection.OperationResult writeAudioFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { try { - fileEntityService.writeProtectedFile(id, data, fileExt); + FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getProtectedFilePath()); + return OperationResult.Companion.success(); } catch (Exception e) { log.error("Failed to create protected file: {}", id, e); @@ -91,7 +126,11 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public com.vrt.fileprotection.OperationResult writeVideoFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { try { - fileEntityService.writeProtectedFile(id, data, fileExt); + FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getProtectedFilePath()); + return OperationResult.Companion.success(); } catch (Exception e) { log.error("Failed to create protected file: {}", id, e); @@ -103,7 +142,11 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public com.vrt.fileprotection.OperationResult writeImageFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { try { - fileEntityService.writeProtectedFile(id, data, fileExt); + FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getProtectedFilePath()); + return OperationResult.Companion.success(); } catch (Exception e) { log.error("Failed to create protected file: {}", id, e); @@ -114,7 +157,10 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public @NotNull OperationResult writeDocumentFile(@NotNull String id, @NotNull byte[] data) { try { - fileEntityService.writeProtectedFile(id, data, null); + FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, null); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getProtectedFilePath()); return OperationResult.Companion.success(); } catch (Exception e) { log.error("Failed to create protected file: {}", id, e); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e5abeb3..88623a9 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -100,6 +100,13 @@ yandex: api-key: ${YANDEX_API_KEY:AQVNyaVaUmgUb1GMCtf5zSEqFxy0woXrcMOOB43q} folder-id: ${YANDEX_FOLDER_ID:b1gokpdbm6qfpsou8pcd} search-url: ${YANDEX_SEARCH_URL:https://searchapi.api.cloud.yandex.net/v2/image/search_by_image} + cloud: + key: "YCAJEmHZcWxzf4oGWvETG3mms" + secret-key: "YCPAPZ32XC-LWb8xE0b_xTcBD8NZUCHpSOfu8LUG" + region: "ru-central1" + s3-endpoint: "https://storage.yandexcloud.net" + bucket: "ncp-test-storage" + searchapi: api-key: ${SEARCHAPI_API_KEY:rdwNzCr2eybYVbU1KrGTJAgm} From a25b33fe13f1d614f9dc6106784d4658710c1d78 Mon Sep 17 00:00:00 2001 From: vladp Date: Mon, 16 Feb 2026 15:04:58 +0700 Subject: [PATCH 02/41] NCBACK-35 add worked logic for save protected files --- .../nocopy/controller/ApiController.java | 31 +---- .../nocopy/controller/PhotoController.java | 86 -------------- .../nocopy/handler/FileEntityHandler.java | 2 +- .../service/file/FileCleanupService.java | 51 +++++++++ .../service/file/FileEntityService.java | 108 ++++-------------- .../file/cloud/CloudStorageService.java | 39 ++++++- .../file/impl/FileUploadServiceImpl.java | 2 - src/main/resources/application.yaml | 2 +- 8 files changed, 113 insertions(+), 208 deletions(-) delete mode 100644 src/main/java/ru/soune/nocopy/controller/PhotoController.java diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index d267848..535302b 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -74,6 +74,8 @@ public class ApiController { private final AuthTokenRepository authTokenRepository; + private final CloudStorageService cloudStorageService; + @PostMapping("/v{version}/data") public ResponseEntity handlePostRequest(@RequestBody BaseRequest request, @PathVariable("version") int version) { @@ -292,8 +294,6 @@ public class ApiController { } } - private final CloudStorageService cloudStorageService; - @GetMapping("/v{version}/files/download/{fileId}") public ResponseEntity downloadFile( @PathVariable(required = false) String fileId, @@ -441,33 +441,6 @@ public class ApiController { return ResponseEntity.ok().body(fileTypeStats); } - private boolean hasDuplicate(List similarFiles) { - return similarFiles.stream().anyMatch(f -> f.getHammingDistance() <= 5); - } - - private ResponseEntity handleDuplicate(FileEntity fileEntity, List similarFiles) - throws IOException { - fileEntityService.deleteFromDisk(fileEntity); - - fileEntityService.softDeleteFileWithHash(fileEntity); - - Optional originalFile = fileEntityRepository.findById(similarFiles.get(0).getFileId()); - - if (originalFile.isPresent()) { - Map duplicateInfo = Map.of( - "duplicate_file_id", originalFile.get().getId(), - "owner_user_id", String.valueOf(originalFile.get().getUserId())); - - return ResponseEntity.ok().body(new BaseResponse( - 20004, - MessageCode.DUPLICATE_FILE_UPLOAD.getCode(), - "Failed to upload chunk, duplicate", - duplicateInfo)); - } - - return null; - } - private ResponseEntity buildSuccessResponse(String uploadId, Integer chunkNumber, MultipartFile chunk, String fileId) { ChunkUploadResponse responseBody = ChunkUploadResponse.builder() diff --git a/src/main/java/ru/soune/nocopy/controller/PhotoController.java b/src/main/java/ru/soune/nocopy/controller/PhotoController.java deleted file mode 100644 index 7a3b856..0000000 --- a/src/main/java/ru/soune/nocopy/controller/PhotoController.java +++ /dev/null @@ -1,86 +0,0 @@ -package ru.soune.nocopy.controller; - -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; -import software.amazon.awssdk.auth.credentials.AwsCredentials; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.core.sync.RequestBody; -import software.amazon.awssdk.http.apache.ApacheHttpClient; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; - -import java.io.IOException; -import java.net.URI; - -import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; - -@RestController -@RequestMapping("/photos") -@Tag(name = "Photos") -@ApiResponses(@ApiResponse(responseCode = "200", useReturnTypeSchema = true)) -public class PhotoController { - - private static final String KEY_ID = "YCAJEmHZcWxzf4oGWvETG3mms"; - private static final String SECRET_KEY = "YCPAPZ32XC-LWb8xE0b_xTcBD8NZUCHpSOfu8LUG"; - private static final String REGION = "ru-central1"; - private static final String S3_ENDPOINT = "https://storage.yandexcloud.net"; - - private static final String BUCKET = "ncp-test-storage"; - - private final S3Client s3Client; - - public PhotoController() { - AwsCredentials credentials = AwsBasicCredentials.create(KEY_ID, SECRET_KEY); - - s3Client = S3Client.builder() - .httpClient(ApacheHttpClient.create()) - .region(Region.of(REGION)) - .endpointOverride(URI.create(S3_ENDPOINT)) - .credentialsProvider(StaticCredentialsProvider.create(credentials)) - .build(); - } - - - @PutMapping(consumes = MULTIPART_FORM_DATA_VALUE) - public String uploadFile(@RequestParam MultipartFile photo) throws IOException { - - String key = "photos/" + photo.getOriginalFilename(); - PutObjectRequest putObjectRequest = PutObjectRequest.builder() - .bucket(BUCKET) - .key(key) - .contentType(photo.getContentType()) - .build(); - - s3Client.putObject(putObjectRequest, RequestBody.fromBytes(photo.getBytes())); - - return key; - } - - @GetMapping - public ResponseEntity downloadFile(@RequestParam String key) throws IOException { - GetObjectRequest objectRequest = GetObjectRequest.builder() - .bucket(BUCKET) - .key(key) - .build(); - - var inputStream = s3Client.getObject(objectRequest); - byte[] data = inputStream.readAllBytes(); - - var headers = new HttpHeaders(); - headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline"); - headers.add(HttpHeaders.CONTENT_TYPE, inputStream.response().contentType()); - - return ResponseEntity.ok() - .headers(headers) - .body(data); - } -} - diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 3a1f56e..4d9c867 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -302,7 +302,7 @@ public class FileEntityHandler implements RequestHandler { int fullDelete = fileRequest.getFullDelete() == null ? 0 : fileRequest.getFullDelete(); if (fileEntity.getStatus().equals(FileStatus.DELETED) || fullDelete == 1) { - fileEntityService.deleteFromDisk(fileEntity); + fileEntityService.deleteFromStorageDisk(fileEntity); response = DeleteFileResponse.builder() .fileId(fileRequest.getFileId()) .message("File deleted from disk") diff --git a/src/main/java/ru/soune/nocopy/service/file/FileCleanupService.java b/src/main/java/ru/soune/nocopy/service/file/FileCleanupService.java index 06e91eb..3ed37c7 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileCleanupService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileCleanupService.java @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import ru.soune.nocopy.entity.user.ProtectedFileCheck; import ru.soune.nocopy.repository.ProtectedFileCheckRepository; +import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; @@ -15,7 +16,10 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Slf4j @Component @@ -35,6 +39,7 @@ public class FileCleanupService { log.info("Starting cleanup of expired temporary files"); cleanupOldPeriods(); + cleanupTempFilesNightly(); Path tempDir = Paths.get(basePath, "temp"); if (!Files.exists(tempDir)) { @@ -98,4 +103,50 @@ public class FileCleanupService { protectedFileCheckRepository.saveAll(checks); log.info("Cleaned up {} old protection usage records", checks.size()); } + + private void cleanupTempFilesNightly() { + log.info("Starting nightly cleanup of temporary files"); + + String tempDir = System.getProperty("java.io.tmpdir"); + Path tempPath = Paths.get(tempDir); + + if (!Files.exists(tempPath)) { + return; + } + + Instant cutoffTime = Instant.now().minus(24, ChronoUnit.HOURS); // 24 часа + int deletedCount = 0; + + try (Stream files = Files.list(tempPath)) { + List tempFiles = files + .filter(path -> { + String filename = path.getFileName().toString(); + return filename.contains("_") && + !filename.endsWith(".tmp") && + Files.isRegularFile(path); + }) + .collect(Collectors.toList()); + + for (Path filePath : tempFiles) { + try { + File file = filePath.toFile(); + Instant lastModified = Instant.ofEpochMilli(file.lastModified()); + + if (lastModified.isBefore(cutoffTime)) { + boolean deleted = Files.deleteIfExists(filePath); + if (deleted) { + deletedCount++; + } + } + } catch (IOException e) { + log.error("Error deleting file: {}", filePath, e); + } + } + + log.info("Nightly cleanup deleted {} temporary files", deletedCount); + + } catch (IOException e) { + log.error("Failed to list temp directory", e); + } + } } diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index 33267b4..7a6a4cb 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -18,8 +18,8 @@ import ru.soune.nocopy.repository.SimilarImageProjection; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.ImageHashService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -43,6 +43,8 @@ public class FileEntityService { private final UserRepository userRepository; + private final CloudStorageService cloudStorageService; + @Transactional(noRollbackFor = DuplicateImageException.class) public FileEntity createFromUploadSession(FileUploadSession session, String checksum) { log.info("Creating FileEntity for upload session: {}", session.getUploadId()); @@ -56,7 +58,7 @@ public class FileEntityService { Map imageHash = Map.of(); - if (session.getFileType().startsWith("image")) { + if (!session.getFileType().startsWith("video")) { imageHash = imageHashService.calculateHash(filePath); List duplicatedByHash = fileSimilarityService.findDuplicatedByHash( imageHash.get("hi"), imageHash.get("low")); @@ -117,38 +119,6 @@ public class FileEntityService { return convertToResponse(fileEntity, version); } - @Transactional(readOnly = true) - public FileEntityResponse getByFilePath(String filePath, int version) { - FileEntity fileEntity = fileEntityRepository.findByFilePath(filePath) - .orElseThrow(() -> new FileEntityNotFoundException("Path: " + filePath)); - - return convertToResponse(fileEntity, version); - } - - - @Transactional(readOnly = true) - public FileResponse getAllUserFiles(Long userId, int version) { - List fileEntities = fileEntityRepository.findByUserIdAndStatus( - userId, FileStatus.ACTIVE); - - List files = fileEntities.stream() - .map(file -> convertToResponse(file, version)) - .collect(Collectors.toList()); - - long totalSize = fileEntities.stream() - .mapToLong(FileEntity::getFileSize) - .sum(); - - return FileResponse.builder() - .files(files) - .totalCount(files.size()) - .totalSize(totalSize) - .formattedTotalSize(formatFileSize(totalSize)) - .page(1) - .pageSize(files.size()) - .build(); - } - @Transactional(readOnly = true) public FileResponse getUserFiles(Long userId, int page, int pageSize, int version) { User user = userRepository.findById(userId).orElseThrow(); @@ -200,19 +170,6 @@ public class FileEntityService { .build(); } - @Transactional - public FileEntity markAsDeleted(FileEntity fileEntity) throws IOException { - fileEntity.setStatus(FileStatus.DELETED); - fileEntity.setUpdatedAt(LocalDateTime.now()); - fileEntity.setProtectionStatus(ProtectionStatus.NOT_PROTECTED); - - Path path = Paths.get(fileEntity.getProtectedFilePath()); - Files.deleteIfExists(path); - fileEntity.setProtectedFilePath(""); - - return fileEntityRepository.save(fileEntity); - } - public void softDeleteFileWithHash(FileEntity fileEntity) throws IOException { if (fileEntity.getImageHash() != null) { fileEntity.setImageHash(null); @@ -229,14 +186,9 @@ public class FileEntityService { fileEntityRepository.save(fileEntity); } - public void deleteFromDisk(FileEntity fileEntity) throws IOException { - Path path = Paths.get(fileEntity.getFilePath()); - - if (!Files.exists(path)) { - return; - } - - Files.delete(path); + public void deleteFromStorageDisk(FileEntity fileEntity) { + cloudStorageService.deleteFileFromStorage(fileEntity.getFilePath()); + cloudStorageService.deleteFileFromStorage(fileEntity.getProtectedFilePath()); fileEntityRepository.delete(fileEntity); } @@ -282,11 +234,11 @@ public class FileEntityService { return fileEntityRepository.save(fileEntity); } - public void clearTempFiles(long userId) throws IOException { + public void clearTempFiles(long userId) { List fileByUserIdAndStatus = fileEntityRepository.findFileByUserIdAndStatus(userId, FileStatus.TEMP); for (FileEntity fileEntity : fileByUserIdAndStatus) { - deleteFromDisk(fileEntity); + deleteFromStorageDisk(fileEntity); } } @@ -298,24 +250,6 @@ public class FileEntityService { return fileEntityRepository.findFileIdByFilePath(filePath); } - public File getFileById(String id) { - try { - FileEntity fileEntity = fileEntityRepository.findById(id).orElseThrow(() -> - new RuntimeException("File not found: " + id)); - - File file = new File(fileEntity.getFilePath()); - - if (!file.exists()) { - throw new RuntimeException("File not found on disk: " + fileEntity.getFilePath()); - } - - return file; - } catch (Exception e) { - log.error("Error getting file: {}", id, e); - return null; - } - } - public Path prepareProtectedPath(FileEntity fileEntity, String extension) throws IOException { Path originalPath = Paths.get(fileEntity.getFilePath()); @@ -352,6 +286,18 @@ public class FileEntityService { fileEntityRepository.save(fileEntity); } + public String formatFileSize(long size) { + if (size < 1024) { + return size + " B"; + } else if (size < 1024 * 1024) { + return String.format("%.1f KB", size / 1024.0); + } else if (size < 1024 * 1024 * 1024) { + return String.format("%.1f MB", size / (1024.0 * 1024.0)); + } else { + return String.format("%.1f GB", size / (1024.0 * 1024.0 * 1024.0)); + } + } + private boolean checkFileExistsOnDisk(String filePath) { try { return Files.exists(Paths.get(filePath)); @@ -404,16 +350,4 @@ public class FileEntityService { .protectedFilePath(fileEntity.getProtectedFilePath()) .build(); } - - public String formatFileSize(long size) { - if (size < 1024) { - return size + " B"; - } else if (size < 1024 * 1024) { - return String.format("%.1f KB", size / 1024.0); - } else if (size < 1024 * 1024 * 1024) { - return String.format("%.1f MB", size / (1024.0 * 1024.0)); - } else { - return String.format("%.1f GB", size / (1024.0 * 1024.0 * 1024.0)); - } - } } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index 8b848d5..bbe90d0 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -55,7 +55,7 @@ public class CloudStorageService { String mimeTypeFromFile = mimeType.equals("document") ? "application" : mimeType; String contentType = mimeTypeFromFile + "/" + extension; - String filePath = "files/" + sendToCloudFilePath; + String filePath = "files" + sendToCloudFilePath; PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucket) @@ -75,7 +75,7 @@ public class CloudStorageService { public File readFileFromStorageByPath(String filePath) throws IOException { GetObjectRequest objectRequest = GetObjectRequest.builder() .bucket(bucket) - .key("files/" + filePath) + .key("files" + filePath) .build(); AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); @@ -94,4 +94,39 @@ public class CloudStorageService { return tempFile; } + + public void deleteFileFromStorage(String filePath) { + if (filePath == null || filePath.isEmpty()) { + log.warn("Attempted to delete file with empty path"); + return; + } + + AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); + + S3Client s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(region)) + .endpointOverride(URI.create(s3endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + + String cloudKey = "files" + filePath; + + try { + try { + s3Client.headObject(builder -> builder.bucket(bucket).key(cloudKey).build()); + } catch (Exception e) { + log.warn("File does not exist in cloud storage: {}", cloudKey); + return; + } + + s3Client.deleteObject(builder -> builder.bucket(bucket).key(cloudKey).build()); + + log.info("File successfully deleted from cloud storage: {}", cloudKey); + + } catch (Exception e) { + log.error("Failed to delete file from cloud storage: {}", cloudKey, e); + throw new RuntimeException("Failed to delete file from cloud storage: " + cloudKey, e); + } + } } 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 0f1b889..c1e3948 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 @@ -181,7 +181,6 @@ public class FileUploadServiceImpl implements FileUploadService { } @Override - @Transactional public UploadProgressResponse uploadChunk(String uploadId, Integer chunkNumber, MultipartFile chunkFile, Integer findSimilar) { FileUploadSession session = sessionRepository.findById(uploadId) @@ -336,7 +335,6 @@ public class FileUploadServiceImpl implements FileUploadService { FileEntity fileEntity = completeFileProcessingAsync(session, status); - //TODO CHECK FOR PROTECTED fileEntityRepository.flush(); entityManager.clear(); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 88623a9..7f8823c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -105,7 +105,7 @@ yandex: secret-key: "YCPAPZ32XC-LWb8xE0b_xTcBD8NZUCHpSOfu8LUG" region: "ru-central1" s3-endpoint: "https://storage.yandexcloud.net" - bucket: "ncp-test-storage" + bucket: "no-copy-storage" searchapi: From daef30ec1158e328baca3ade712967d13b5b4ea0 Mon Sep 17 00:00:00 2001 From: vladp Date: Mon, 16 Feb 2026 16:05:15 +0700 Subject: [PATCH 03/41] NCBACK-35 add worked logic for save protected files --- .../soune/nocopy/handler/FileEntityHandler.java | 5 ++++- .../nocopy/service/file/FileEntityService.java | 9 +-------- .../service/file/cloud/CloudStorageService.java | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 4d9c867..3953ab9 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -12,6 +12,7 @@ import ru.soune.nocopy.entity.file.ProtectionStatus; import ru.soune.nocopy.exception.FileEntityNotFoundException; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.repository.FileEntityRepository; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileStatsService; @@ -35,6 +36,8 @@ public class FileEntityHandler implements RequestHandler { private final FileEntityRepository fileEntityRepository; + private final CloudStorageService cloudStorageService; + @Override public BaseResponse handle(BaseRequest request) { try { @@ -302,7 +305,7 @@ public class FileEntityHandler implements RequestHandler { int fullDelete = fileRequest.getFullDelete() == null ? 0 : fileRequest.getFullDelete(); if (fileEntity.getStatus().equals(FileStatus.DELETED) || fullDelete == 1) { - fileEntityService.deleteFromStorageDisk(fileEntity); + cloudStorageService.deleteFromStorageDisk(fileEntity); response = DeleteFileResponse.builder() .fileId(fileRequest.getFileId()) .message("File deleted from disk") diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index 7a6a4cb..bf076a5 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -186,13 +186,6 @@ public class FileEntityService { fileEntityRepository.save(fileEntity); } - public void deleteFromStorageDisk(FileEntity fileEntity) { - cloudStorageService.deleteFileFromStorage(fileEntity.getFilePath()); - cloudStorageService.deleteFileFromStorage(fileEntity.getProtectedFilePath()); - - fileEntityRepository.delete(fileEntity); - } - public void deleteFromDisk(String deleteFilePath) throws IOException { Files.deleteIfExists(Paths.get(deleteFilePath)); } @@ -238,7 +231,7 @@ public class FileEntityService { List fileByUserIdAndStatus = fileEntityRepository.findFileByUserIdAndStatus(userId, FileStatus.TEMP); for (FileEntity fileEntity : fileByUserIdAndStatus) { - deleteFromStorageDisk(fileEntity); + cloudStorageService.deleteFromStorageDisk(fileEntity); } } diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index bbe90d0..ab12a0d 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -4,7 +4,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import ru.soune.nocopy.service.file.FileEntityService; +import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.repository.FileEntityRepository; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; @@ -26,7 +27,7 @@ import java.nio.file.Paths; @RequiredArgsConstructor public class CloudStorageService { - private final FileEntityService fileEntityService; + private final FileEntityRepository fileEntityRepository; @Value("${yandex.cloud.key}") private String key; @@ -66,7 +67,7 @@ public class CloudStorageService { try { s3Client.putObject(putObjectRequest, RequestBody.fromBytes(Files.readAllBytes(Paths.get(sendToCloudFilePath)))); - fileEntityService.deleteFromDisk(sendToCloudFilePath); + Files.deleteIfExists(Paths.get(sendToCloudFilePath)); } catch (IOException e) { log.error("Failed to read file: {}", filePath, e); } @@ -129,4 +130,14 @@ public class CloudStorageService { throw new RuntimeException("Failed to delete file from cloud storage: " + cloudKey, e); } } + + public void deleteFromStorageDisk(FileEntity fileEntity) { + deleteFileFromStorage(fileEntity.getFilePath()); + + if (fileEntity.getProtectedFilePath() != null) { + deleteFileFromStorage(fileEntity.getProtectedFilePath()); + } + + fileEntityRepository.delete(fileEntity); + } } From 69e758a71074155ebdf26cb550d944f8722db613 Mon Sep 17 00:00:00 2001 From: vladp Date: Tue, 31 Mar 2026 14:43:34 +0700 Subject: [PATCH 04/41] dev email send when tokens not found --- .../java/ru/soune/nocopy/service/FileSimilarityService.java | 6 +++++- src/main/java/ru/soune/nocopy/service/ImageHashService.java | 5 ++++- .../nocopy/service/file/impl/FileUploadServiceImpl.java | 6 ++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index cb7334c..96b6b04 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -17,6 +17,7 @@ import ru.soune.nocopy.entity.file.ImageHashEntity; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.DuplicateImageException; import ru.soune.nocopy.repository.*; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; import java.io.File; @@ -41,6 +42,8 @@ public class FileSimilarityService { private final FileEntityRepository fileEntityRepository; + private final CloudStorageService cloudStorageService; + @Value("${server.baseurl}") private String baseUrl; @@ -198,8 +201,9 @@ public class FileSimilarityService { private String calculateFileHash(String path) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); + File file = cloudStorageService.readFileFromStorageByPath(path); - try (InputStream is = new FileInputStream(path)) { + try (InputStream is = new FileInputStream(file)) { byte[] buffer = new byte[8192]; int read; while ((read = is.read(buffer)) > 0) { diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index 0d1bbd6..9a97a55 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.ImageHashEntity; import ru.soune.nocopy.repository.ImageHashRepository; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.File; import java.io.IOException; @@ -22,8 +23,10 @@ public class ImageHashService { private final ImageHashRepository repository; + private final CloudStorageService cloudStorageService; + public Map calculateHash(Path imagePath) throws IOException { - File file = imagePath.toFile(); + File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); 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 bcf88b0..3f381f4 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 @@ -333,7 +333,8 @@ public class FileUploadServiceImpl implements FileUploadService { fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType(), session.getUserId()); - File file = new File(finalFilePath); +// File file = new File(finalFilePath); + File file = cloudStorageService.readFileFromStorageByPath(finalFilePath); if (session.getFileType().startsWith("audio") && !isWavFile(file)) { session.setStatus(UploadStatus.FAILED); @@ -389,7 +390,7 @@ public class FileUploadServiceImpl implements FileUploadService { fileEntity.getFilePath()); if (status != FileStatus.TEMP) { - FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity); + FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, session.getConvertTo()); noCopyFileService.addFile(fileInfo); } @@ -532,6 +533,7 @@ public class FileUploadServiceImpl implements FileUploadService { private void checkForDuplicatesSynchronously(String filePath) throws IOException , DuplicateImageException { Path path = Paths.get(filePath); + Map hash = imageHashService.calculateHash(path); List duplicates = fileSimilarityService.findDuplicatedByHash( From be1ad7f0669606605563c7299cc9fa5e9094ff83 Mon Sep 17 00:00:00 2001 From: vladp Date: Sat, 4 Apr 2026 11:26:35 +0700 Subject: [PATCH 05/41] dev add notification entity --- .../java/ru/soune/nocopy/controller/ApiController.java | 9 +-------- .../service/file/impl/ProtectionFileProviderImpl.java | 2 -- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 1851c60..07a03ec 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -7,7 +7,6 @@ import com.vrt.fileprotection.audio.AudioCheckResult; import com.vrt.fileprotection.documents.DocumentCheckResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.core.io.FileSystemResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -26,7 +25,6 @@ import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.entity.company.Company; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; -import ru.soune.nocopy.entity.file.ProtectionStatus; import ru.soune.nocopy.entity.file.UploadStatus; import ru.soune.nocopy.entity.user.AuthToken; import ru.soune.nocopy.entity.user.User; @@ -49,10 +47,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -174,8 +169,6 @@ public class ApiController { } } - private final NoCopyFileService noCopyFileService; - @GetMapping("/v{version}/files/{fileId}/similar") public ResponseEntity findSimilarFiles( @PathVariable("version") int version, diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 3da08f1..702ceed 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -37,8 +37,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { private final CloudStorageService cloudStorageService; - private final FileEntityRepository fileEntityRepository; - @Nullable @Override public File getImageFile(@NotNull String id) { From aef2c1dfe0ab20aee5f1bf30c260ea5a10c8d93b Mon Sep 17 00:00:00 2001 From: vladp Date: Wed, 8 Apr 2026 21:58:28 +0700 Subject: [PATCH 06/41] dev add verified notifications --- README.md | 1 + .../ru/soune/nocopy/repository/FileEntityRepository.java | 9 --------- .../java/ru/soune/nocopy/service/ImageHashService.java | 4 +++- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1e518c5..ad40cf0 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ server_name dev-workspace.not-copy.com; ssl_certificate_key /etc/letsencrypt/live/dev-workspace.not-copy.com/privkey.pem; location /api/ { + proxy_pass http://localhost:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java index e54e23b..becdb7b 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java @@ -58,12 +58,6 @@ public interface FileEntityRepository extends JpaRepository List findFileByUserIdAndStatus(Long userId, FileStatus status); - @Query("SELECT f FROM FileEntity f WHERE f.userId = :userId AND f.mimeType = :mimeType") - List findByUserIdAndMimeType(Long userId, String mimeType); - - @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); @@ -75,7 +69,4 @@ public interface FileEntityRepository extends JpaRepository Page findByStatusIn(List statuses, Pageable pageable); List findByUserIdAndStatusIn(Long userId, List statuses); - - @Query("SELECT f FROM FileEntity f WHERE f.userId = :userId AND f.status IN :statuses") - List findByStatuses(Long userId, @Param("statuses") List statuses); } diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index 9a97a55..515513d 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -26,7 +26,9 @@ public class ImageHashService { private final CloudStorageService cloudStorageService; public Map calculateHash(Path imagePath) throws IOException { - File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); +// File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); + File file = imagePath.toFile(); + PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); From 31140e810b4a52c8c52f196f45dbd7d550ef5f6b Mon Sep 17 00:00:00 2001 From: vladp Date: Thu, 9 Apr 2026 11:03:31 +0700 Subject: [PATCH 07/41] dev delete async --- .../service/file/FileUploadService.java | 4 +--- .../file/impl/FileUploadServiceImpl.java | 19 ++++++------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java b/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java index d76c320..28dad71 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileUploadService.java @@ -6,8 +6,6 @@ import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.file.FileUploadSession; -import java.io.IOException; - public interface FileUploadService { FileUploadSession initUpload(Long userId, String fileName, String fileType, String extension, String convertTo, long fileSize); @@ -20,5 +18,5 @@ public interface FileUploadService { UploadProgressResponse getUploadProgress(String uploadId); - FileEntity completeFileProcessingAsync(FileUploadSession session, FileStatus status); + FileEntity completeFileProcessing(FileUploadSession session, FileStatus status); } 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 af9f173..5833a97 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 @@ -226,11 +226,9 @@ public class FileUploadServiceImpl implements FileUploadService { return UploadProgressResponse.fromSession(session); } - @Async("fileUploadTaskExecutor") @Transactional @Override - public FileEntity completeFileProcessingAsync(FileUploadSession session, FileStatus status) { - FileEntity saved = null; + public FileEntity completeFileProcessing(FileUploadSession session, FileStatus status) { try { Path filePath = Paths.get(session.getFilePath()); String checksum = calculateChecksum(filePath); @@ -249,11 +247,10 @@ public class FileUploadServiceImpl implements FileUploadService { .status(status) .build(); - saved = fileEntityRepository.save(fileEntity); + FileEntity saved = fileEntityRepository.save(fileEntity); if (session.getFileType().equals("image")) { Map hash = imageHashService.calculateHash(filePath); - imageHashService.create(saved, hash); } @@ -261,17 +258,17 @@ public class FileUploadServiceImpl implements FileUploadService { if (status != FileStatus.TEMP) { FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, session.getConvertTo()); - noCopyFileService.addFile(fileInfo); } log.info("File processing completed for session: {}", session.getUploadId()); + return saved; + } catch (Exception e) { log.error("Failed to complete file processing for session {}: {}", session.getUploadId(), e.getMessage(), e); + throw new FileUploadException("Failed to complete file processing", e); } - - return saved; } private void validateSession(FileUploadSession session) { @@ -386,11 +383,7 @@ public class FileUploadServiceImpl implements FileUploadService { fileEntityService.clearTempFiles(session.getUserId()); } - FileEntity fileEntity = completeFileProcessingAsync(session, status); - - fileEntityRepository.flush(); - - entityManager.clear(); + FileEntity fileEntity = completeFileProcessing(session, status); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getFilePath()); From b0cc5720a64cfd45696cb9c1156d4c542d5fe504 Mon Sep 17 00:00:00 2001 From: vladp Date: Thu, 16 Apr 2026 17:32:49 +0700 Subject: [PATCH 08/41] dev add statistic files protected --- .../nocopy/service/file/impl/FileUploadServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 517d587..212c3c0 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 @@ -343,7 +343,7 @@ public class FileUploadServiceImpl implements FileUploadService { session.setStatus(UploadStatus.COMPLETED); session.setFilePath(finalFilePath); - completeFileProcessingAsync(session, FileStatus.PRIVATE); + completeFileProcessing(session, FileStatus.PRIVATE); } else { sessionRepository.save(session); } @@ -365,9 +365,6 @@ public class FileUploadServiceImpl implements FileUploadService { } } - @Autowired - private EntityManager entityManager; - private UploadProgressResponse processChunk(FileUploadSession session, Integer chunkNumber, MultipartFile chunkFile, Integer findSimilar) { String chunkPath = null; From 2ab91dee58f8907db288ae058e9094f24fe7fd06 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Mon, 20 Apr 2026 14:26:10 +0700 Subject: [PATCH 09/41] dev fix save to storage --- .../file/impl/FileUploadServiceImpl.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) 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 212c3c0..fe3b5c5 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 @@ -258,15 +258,9 @@ public class FileUploadServiceImpl implements FileUploadService { } cleanupSessionFiles(session); - - if (status != FileStatus.TEMP && status != FileStatus.PRIVATE) { - FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, session.getConvertTo()); - noCopyFileService.addFile(fileInfo); - } - log.info("File processing completed for session: {}", session.getUploadId()); - return saved; + return saved; } catch (Exception e) { log.error("Failed to complete file processing for session {}: {}", session.getUploadId(), e.getMessage(), e); @@ -450,17 +444,17 @@ public class FileUploadServiceImpl implements FileUploadService { cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getFilePath()); - if (status != FileStatus.TEMP) { - FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, session.getConvertTo()); - - noCopyFileService.addFile(fileInfo); - } - if (status != FileStatus.TEMP) { String fileType = session.getFileType(); tariffInfoService.writeOffTokens(session.getUserId(), costService.protectFileCost(fileType), OperationType.FILE_UPLOAD); } + + if (status != FileStatus.TEMP) { + FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, session.getConvertTo()); + + noCopyFileService.addFile(fileInfo); + } } else { sessionRepository.save(session); } From 9cd5965b37950a91cc7758e2aec666500808d146 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Mon, 20 Apr 2026 18:16:46 +0700 Subject: [PATCH 10/41] dev change logic for get files for search --- .../nocopy/controller/FileController.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 38cf43e..4063e77 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -4,6 +4,7 @@ import com.vrt.NoCopyFileService; import com.vrt.fileprotection.FileProtector; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.http.*; import org.springframework.web.bind.annotation.*; @@ -18,8 +19,11 @@ import ru.soune.nocopy.service.file.CheckCounterService; import ru.soune.nocopy.service.file.FileStorageService; import ru.soune.nocopy.service.file.ImageResizeService; import ru.soune.nocopy.service.file.ZipService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; +import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -51,6 +55,8 @@ public class FileController { private ZipService zipService; + private CloudStorageService cloudStorageService; + @GetMapping("/public/{fileId}") public ResponseEntity getPublicFile(@PathVariable String fileId) { try { @@ -63,7 +69,12 @@ public class FileController { return ResponseEntity.notFound().build(); } - Resource resource = fileStorageService.loadFileAsResource(fileEntity.getFilePath()); + File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + + if (file == null || !file.exists()) { + log.error("File not found in storage: {}", fileEntity.getFilePath()); + return ResponseEntity.notFound().build(); + } MediaType mediaType = getMediaType(fileEntity); @@ -71,13 +82,14 @@ public class FileController { .filename(fileEntity.getOriginalFileName(), StandardCharsets.UTF_8) .build(); + InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); + return ResponseEntity.ok() .contentType(mediaType) .contentLength(Files.size(filePath)) .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()) .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") .body(resource); - } catch (FileNotFoundException e) { log.warn("Not on disk: {}", fileId); return ResponseEntity.notFound().build(); @@ -113,9 +125,12 @@ public class FileController { FileEntity fileEntity = fileRepository.findById(fileId) .orElseThrow(() -> new RuntimeException("File not found")); - String path = imageResizeService.getPath(fileEntity, type); + File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); - Resource resource = fileStorageService.loadFileAsResource(path); + if (file == null || !file.exists()) { + log.error("File not found in storage: {}", fileEntity.getFilePath()); + return ResponseEntity.notFound().build(); + } if (fileEntity.getProtectionStatus() == ProtectionStatus.NOT_PROTECTED || fileEntity.getProtectionStatus() == ProtectionStatus.PROCESSING) { @@ -128,6 +143,8 @@ public class FileController { String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8) .replace("+", "%20"); + InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); + return ResponseEntity.ok() .contentType(new MediaType(fileEntity.getMimeType(), fileEntity.getFileExtension())) .header(HttpHeaders.CONTENT_DISPOSITION, From 9cde6f3bb610f72ff7e6643539effe70b6522e9c Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Mon, 20 Apr 2026 18:31:32 +0700 Subject: [PATCH 11/41] dev change logic for get files for search --- src/main/java/ru/soune/nocopy/service/ImageHashService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index 515513d..9a97a55 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -26,9 +26,7 @@ public class ImageHashService { private final CloudStorageService cloudStorageService; public Map calculateHash(Path imagePath) throws IOException { -// File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); - File file = imagePath.toFile(); - + File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); From 1476509b480a591e7901cd2d59f4f773d227ea9a Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Mon, 20 Apr 2026 18:50:47 +0700 Subject: [PATCH 12/41] dev change --- .../java/ru/soune/nocopy/service/ImageHashService.java | 4 +++- .../service/file/impl/FileUploadServiceImpl.java | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index 9a97a55..515513d 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -26,7 +26,9 @@ public class ImageHashService { private final CloudStorageService cloudStorageService; public Map calculateHash(Path imagePath) throws IOException { - File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); +// File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); + File file = imagePath.toFile(); + PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); 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 fe3b5c5..cdb6b40 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 @@ -390,8 +390,8 @@ public class FileUploadServiceImpl implements FileUploadService { fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType(), session.getUserId()); -// File file = new File(finalFilePath); - File file = cloudStorageService.readFileFromStorageByPath(finalFilePath); + File file = new File(finalFilePath); +// File file = cloudStorageService.readFileFromStorageByPath(finalFilePath); if (session.getFileType().startsWith("audio") && !isWavFile(file)) { session.setStatus(UploadStatus.FAILED); @@ -431,8 +431,6 @@ public class FileUploadServiceImpl implements FileUploadService { session.setStatus(UploadStatus.COMPLETED); session.setFilePath(finalFilePath); - notificationService.addNotification(NotificationType.FILE_ADDED_TO_SYSTEM, session.getUserId()); - FileStatus status = findSimilar == 0 ? FileStatus.MODERATION: FileStatus.TEMP; if (status == FileStatus.TEMP) { @@ -447,7 +445,9 @@ public class FileUploadServiceImpl implements FileUploadService { if (status != FileStatus.TEMP) { String fileType = session.getFileType(); - tariffInfoService.writeOffTokens(session.getUserId(), costService.protectFileCost(fileType), OperationType.FILE_UPLOAD); + tariffInfoService.writeOffTokens(session.getUserId(), costService.protectFileCost(fileType), + OperationType.FILE_UPLOAD); + notificationService.addNotification(NotificationType.FILE_ADDED_TO_SYSTEM, session.getUserId()); } if (status != FileStatus.TEMP) { From 4e0e953253d056c8ac8591c6fa40eff7093e14eb Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Mon, 20 Apr 2026 19:50:32 +0700 Subject: [PATCH 13/41] dev change --- .../nocopy/service/file/impl/FileUploadServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 cdb6b40..3cd223f 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 @@ -433,15 +433,15 @@ public class FileUploadServiceImpl implements FileUploadService { FileStatus status = findSimilar == 0 ? FileStatus.MODERATION: FileStatus.TEMP; - if (status == FileStatus.TEMP) { - fileEntityService.clearTempFiles(session.getUserId()); - } - FileEntity fileEntity = completeFileProcessing(session, status); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getFilePath()); + if (status == FileStatus.TEMP) { + fileEntityService.clearTempFiles(session.getUserId()); + } + if (status != FileStatus.TEMP) { String fileType = session.getFileType(); From 6366cbc96bf39b0ae7778aea444152290ad0b653 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 00:36:22 +0700 Subject: [PATCH 14/41] dev change --- src/main/java/ru/soune/nocopy/service/ImageHashService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index 515513d..a71be82 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -28,7 +28,9 @@ public class ImageHashService { public Map calculateHash(Path imagePath) throws IOException { // File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); File file = imagePath.toFile(); - + if (file == null) { + file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); + } PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); From 9ad4830edb2463b659749ae4932eb91589bd2e34 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 01:06:50 +0700 Subject: [PATCH 15/41] dev fix file public endpoint --- .../ru/soune/nocopy/controller/ApiController.java | 3 +-- .../ru/soune/nocopy/controller/FileController.java | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 2544f33..6ec431a 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -505,8 +505,7 @@ public class ApiController { } Path filePath = Paths.get(entityResponse.getProtectedFilePath()); - File file = cloudStorageService.readFileFromStorageByPath( - entityResponse.getProtectedFilePath()); + File file = cloudStorageService.readFileFromStorageByPath(entityResponse.getProtectedFilePath()); long fileSize = Files.size(filePath); if (!file.exists()) { diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 4063e77..0754fd1 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -63,11 +63,11 @@ public class FileController { FileEntity fileEntity = fileRepository.findById(fileId) .orElseThrow(() -> new FileNotFoundException("Not found: " + fileId)); - Path filePath = Paths.get(fileEntity.getFilePath()); - if (!Files.exists(filePath)) { - log.error("Not on disk: {}", fileEntity.getFilePath()); - return ResponseEntity.notFound().build(); - } +// Path filePath = Paths.get(fileEntity.getFilePath()); +// if (!Files.exists(filePath)) { +// log.error("Not on disk: {}", fileEntity.getFilePath()); +// return ResponseEntity.notFound().build(); +// } File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); @@ -86,7 +86,7 @@ public class FileController { return ResponseEntity.ok() .contentType(mediaType) - .contentLength(Files.size(filePath)) + .contentLength(file.length()) .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()) .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") .body(resource); From 7492b8aa7fe1b6e88b88d207cb6000cb0d5b90ea Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 01:31:30 +0700 Subject: [PATCH 16/41] dev fix file public endpoint --- .../soune/nocopy/controller/ApiController.java | 16 +--------------- .../soune/nocopy/controller/FileController.java | 6 ------ 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 6ec431a..d6a884a 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -504,9 +504,7 @@ public class ApiController { errorData)); } - Path filePath = Paths.get(entityResponse.getProtectedFilePath()); File file = cloudStorageService.readFileFromStorageByPath(entityResponse.getProtectedFilePath()); - long fileSize = Files.size(filePath); if (!file.exists()) { Map errorData = new HashMap<>(); @@ -518,11 +516,8 @@ public class ApiController { errorData)); } - String contentType = determineContentType(filePath); - return ResponseEntity.ok() - .contentLength(fileSize) - .contentType(MediaType.parseMediaType(contentType)) + .contentLength(file.length()) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") .body(file); @@ -624,13 +619,4 @@ public class ApiController { return errorDetail; } - - - private String determineContentType(Path filePath) throws IOException { - String contentType = Files.probeContentType(filePath); - if (contentType == null) { - contentType = "application/octet-stream"; - } - return contentType; - } } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 0754fd1..50a49ce 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -63,12 +63,6 @@ public class FileController { FileEntity fileEntity = fileRepository.findById(fileId) .orElseThrow(() -> new FileNotFoundException("Not found: " + fileId)); -// Path filePath = Paths.get(fileEntity.getFilePath()); -// if (!Files.exists(filePath)) { -// log.error("Not on disk: {}", fileEntity.getFilePath()); -// return ResponseEntity.notFound().build(); -// } - File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); if (file == null || !file.exists()) { From 61dcada97319711b8f44d3d8d11d783daa08de3c Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 01:43:40 +0700 Subject: [PATCH 17/41] dev delete check file on disk --- .../nocopy/controller/ApiController.java | 18 ++++++++--------- .../service/file/FileEntityService.java | 20 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index d6a884a..73eb749 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -494,15 +494,15 @@ public class ApiController { errorData)); } - if (!entityResponse.isExistsOnDisk()) { - Map errorData = new HashMap<>(); - errorData.put("onDisk", entityResponse.isExistsOnDisk()); - - return ResponseEntity.ok().body(new BaseResponse(20004, - MessageCode.FILE_NOT_EXIST.getCode(), - MessageCode.FILE_NOT_EXIST.getDescription(), - errorData)); - } +// if (!entityResponse.isExistsOnDisk()) { +// Map errorData = new HashMap<>(); +// errorData.put("onDisk", entityResponse.isExistsOnDisk()); +// +// return ResponseEntity.ok().body(new BaseResponse(20004, +// MessageCode.FILE_NOT_EXIST.getCode(), +// MessageCode.FILE_NOT_EXIST.getDescription(), +// errorData)); +// } File file = cloudStorageService.readFileFromStorageByPath(entityResponse.getProtectedFilePath()); diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index fe480bb..b1d9a06 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -323,14 +323,14 @@ public class FileEntityService { } } - private boolean checkFileExistsOnDisk(String filePath) { - try { - return Files.exists(Paths.get(filePath)); - } catch (Exception e) { - log.warn("Error checking file existence: {}", filePath, e); - return false; - } - } +// private boolean checkFileExistsOnDisk(String filePath) { +// try { +// return Files.exists(Paths.get(filePath)); +// } catch (Exception e) { +// log.warn("Error checking file existence: {}", filePath, e); +// return false; +// } +// } private String determineFileExtension(String fileExt, FileEntity fileEntity) { if (fileExt != null) { @@ -343,7 +343,7 @@ public class FileEntityService { private final FileMonitoringRepository fileMonitoringRepository; private FileEntityResponse convertToResponse(FileEntity fileEntity, int version) { - boolean existsOnDisk = checkFileExistsOnDisk(fileEntity.getFilePath()); +// boolean existsOnDisk = checkFileExistsOnDisk(fileEntity.getFilePath()); User user = userRepository.findById(fileEntity.getUserId()).get(); String fileName = fileEntity.getOriginalFileName(); String name = fileName; @@ -375,7 +375,7 @@ public class FileEntityService { .updatedAt(fileEntity.getUpdatedAt()) .formattedSize(formatFileSize(fileEntity.getFileSize())) .downloadUrl("/api/v" + version + "/files/download/" + fileEntity.getId()) - .existsOnDisk(existsOnDisk) +// .existsOnDisk(existsOnDisk) .supportId(fileEntity.getSupportId()) .protectStatus(fileEntity.getProtectionStatus().toString()) .fileName(name + "_nocopy_protected" + "." + fileEntity.getFileExtension()) From 631066b217ee485f26105486ef4a74b9342c2dda Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 01:52:48 +0700 Subject: [PATCH 18/41] dev delete check file on disk --- src/main/java/ru/soune/nocopy/controller/ApiController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 73eb749..aa803b2 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -7,6 +7,7 @@ import com.vrt.fileprotection.audio.AudioCheckResult; import com.vrt.fileprotection.documents.DocumentCheckResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.FileSystemResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -520,7 +521,7 @@ public class ApiController { .contentLength(file.length()) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") - .body(file); + .body(new FileSystemResource(file)); } catch (FileEntityNotFoundException e) { Map errorData = new HashMap<>(); errorData.put("fileId", fileId); From 3b68b3337c9363333cf7dc20dd9386058fafbeb1 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 02:10:17 +0700 Subject: [PATCH 19/41] dev delete check file on disk --- .../nocopy/controller/ApiController.java | 47 ++++++++++--------- .../file/cloud/CloudStorageService.java | 20 ++++++++ 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index aa803b2..1877d68 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -8,6 +8,7 @@ import com.vrt.fileprotection.documents.DocumentCheckResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -45,6 +46,7 @@ import ru.soune.nocopy.util.FileUtil; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -494,6 +496,7 @@ public class ApiController { MessageCode.FILE_DELETE.getDescription(), errorData)); } +//TODO // if (!entityResponse.isExistsOnDisk()) { // Map errorData = new HashMap<>(); @@ -505,23 +508,23 @@ public class ApiController { // errorData)); // } - File file = cloudStorageService.readFileFromStorageByPath(entityResponse.getProtectedFilePath()); + InputStream stream = cloudStorageService.readFileFromStorage(entityResponse.getProtectedFilePath()); - if (!file.exists()) { - Map errorData = new HashMap<>(); - errorData.put("file", file.exists()); - - return ResponseEntity.ok().body(new BaseResponse(20004, - MessageCode.FILE_DOWNLOAD_ERROR.getCode(), - MessageCode.FILE_DOWNLOAD_ERROR.getDescription(), - errorData)); - } +// if (!file.exists()) { +// Map errorData = new HashMap<>(); +// errorData.put("file", file.exists()); +// +// return ResponseEntity.ok().body(new BaseResponse(20004, +// MessageCode.FILE_DOWNLOAD_ERROR.getCode(), +// MessageCode.FILE_DOWNLOAD_ERROR.getDescription(), +// errorData)); +// } return ResponseEntity.ok() - .contentLength(file.length()) + .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") - .body(new FileSystemResource(file)); + .body(new InputStreamResource(stream)); } catch (FileEntityNotFoundException e) { Map errorData = new HashMap<>(); errorData.put("fileId", fileId); @@ -538,16 +541,16 @@ public class ApiController { MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), errorData)); - } catch (IOException e) { - Map errorData = new HashMap<>(); - errorData.put("token", tokenHeader); - errorData.put("fileId", fileId); - errorData.put("version", version); - - return ResponseEntity.ok().body(new BaseResponse(20004, - MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getCode(), - MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getDescription(), - errorData)); +// } catch (IOException e) { +// Map errorData = new HashMap<>(); +// errorData.put("token", tokenHeader); +// errorData.put("fileId", fileId); +// errorData.put("version", version); +// +// return ResponseEntity.ok().body(new BaseResponse(20004, +// MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getCode(), +// MessageCode.FILE_DOWNLOAD_ERROR_NOT_CORRECT_FIELD.getDescription(), +// errorData)); } } diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index ab12a0d..d508e41 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -10,6 +10,7 @@ import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @@ -18,6 +19,7 @@ import software.amazon.awssdk.services.s3.model.PutObjectRequest; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; @@ -96,6 +98,24 @@ public class CloudStorageService { return tempFile; } + public InputStream readFileFromStorage(String filePath) { + GetObjectRequest objectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key("files" + filePath) + .build(); + + AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); + + S3Client s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(region)) + .endpointOverride(URI.create(s3endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + + return s3Client.getObject(objectRequest, ResponseTransformer.toInputStream()); + } + public void deleteFileFromStorage(String filePath) { if (filePath == null || filePath.isEmpty()) { log.warn("Attempted to delete file with empty path"); From fdc17b83258762d417c3214aa50a10a08598f029 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 02:21:33 +0700 Subject: [PATCH 20/41] dev delete check file on disk --- .../nocopy/controller/FileController.java | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 50a49ce..fa8edc0 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -22,13 +22,10 @@ import ru.soune.nocopy.service.file.ZipService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -58,17 +55,12 @@ public class FileController { private CloudStorageService cloudStorageService; @GetMapping("/public/{fileId}") - public ResponseEntity getPublicFile(@PathVariable String fileId) { + public ResponseEntity getPublicFile(@PathVariable String fileId) { try { FileEntity fileEntity = fileRepository.findById(fileId) .orElseThrow(() -> new FileNotFoundException("Not found: " + fileId)); - File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); - - if (file == null || !file.exists()) { - log.error("File not found in storage: {}", fileEntity.getFilePath()); - return ResponseEntity.notFound().build(); - } + InputStream inputStream = cloudStorageService.readFileFromStorage(fileEntity.getFilePath()); MediaType mediaType = getMediaType(fileEntity); @@ -76,19 +68,17 @@ public class FileController { .filename(fileEntity.getOriginalFileName(), StandardCharsets.UTF_8) .build(); - InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); - return ResponseEntity.ok() .contentType(mediaType) - .contentLength(file.length()) .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()) .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") - .body(resource); + .body(new InputStreamResource(inputStream)); + } catch (FileNotFoundException e) { - log.warn("Not on disk: {}", fileId); + log.warn("File not found in DB: {}", fileId); return ResponseEntity.notFound().build(); - } catch (IOException e) { - log.error("Read file exception: {}", fileId, e); + } catch (Exception e) { + log.error("Error reading file: {}", fileId, e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } From 5fc9563a4ee8133f21302009ed216d42b150e34a Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 02:59:21 +0700 Subject: [PATCH 21/41] dev delete check file on disk --- .../soune/nocopy/service/file/ImageResizeService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/ru/soune/nocopy/service/file/ImageResizeService.java b/src/main/java/ru/soune/nocopy/service/file/ImageResizeService.java index 57d6216..34d4c00 100644 --- a/src/main/java/ru/soune/nocopy/service/file/ImageResizeService.java +++ b/src/main/java/ru/soune/nocopy/service/file/ImageResizeService.java @@ -1,10 +1,12 @@ package ru.soune.nocopy.service.file; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import javax.imageio.ImageIO; import java.awt.*; @@ -18,9 +20,13 @@ import java.util.List; @Service @Slf4j +@RequiredArgsConstructor public class ImageResizeService { + private final CloudStorageService cloudStorageService; + private static final int THUMBNAIL_SIZE = 150; + private static final int MEDIUM_SIZE = 600; @Value("${file.storage.base-path}") @@ -50,11 +56,15 @@ public class ImageResizeService { if (original.getWidth() > THUMBNAIL_SIZE) { String thumbPath = resizeAndSave(original, baseName + "_thumb", THUMBNAIL_SIZE); file.setThumbnailPath(thumbPath); + cloudStorageService.saveFilesToStorage(file.getMimeType(), file.getFileExtension(), + thumbPath); } if (original.getWidth() > MEDIUM_SIZE) { String mediumPath = resizeAndSave(original, baseName + "_medium", MEDIUM_SIZE); file.setMediumPath(mediumPath); + cloudStorageService.saveFilesToStorage(file.getMimeType(), file.getFileExtension(), + mediumPath); } } } From 1b2337ea2f76bcd174fa9050afda4e5f9b917df4 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 03:11:52 +0700 Subject: [PATCH 22/41] dev fix thumbnal path --- src/main/java/ru/soune/nocopy/controller/FileController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index fa8edc0..84e8742 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -109,7 +109,9 @@ public class FileController { FileEntity fileEntity = fileRepository.findById(fileId) .orElseThrow(() -> new RuntimeException("File not found")); - File file = cloudStorageService.readFileFromStorageByPath(fileEntity.getFilePath()); + String filePath = type.equals("thumbnail") ? fileEntity.getThumbnailPath(): fileEntity.getFilePath(); + + File file = cloudStorageService.readFileFromStorageByPath(filePath); if (file == null || !file.exists()) { log.error("File not found in storage: {}", fileEntity.getFilePath()); From e6e8461b9b115213d05baef5bec832d85d4da4d7 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 03:27:47 +0700 Subject: [PATCH 23/41] dev test baseurl for test --- .../ru/soune/nocopy/service/search/SearchImageService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java index 32ac438..8474b6a 100644 --- a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java +++ b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java @@ -72,7 +72,8 @@ public class SearchImageService { ); } - String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); +// String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); + String publicUrl = String.format("%s/api/files/public/%s", "http://92.242.61.23:2997", fileEntity.getId()); log.info("Searching reverse for image: {}", publicUrl); From 82827c9a2a11fed45d94ec83234e5c50e24a83a4 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 03:45:23 +0700 Subject: [PATCH 24/41] dev test baseurl for test --- .../ru/soune/nocopy/service/search/SearchImageService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java index 8474b6a..32ac438 100644 --- a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java +++ b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java @@ -72,8 +72,7 @@ public class SearchImageService { ); } -// String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); - String publicUrl = String.format("%s/api/files/public/%s", "http://92.242.61.23:2997", fileEntity.getId()); + String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); log.info("Searching reverse for image: {}", publicUrl); From f680f766cd8bfaaf043c4a5222c55fae79789ef5 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 09:26:03 +0700 Subject: [PATCH 25/41] dev test baseurl for test --- .../nocopy/service/file/impl/FileUploadServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 3cd223f..cdb6b40 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 @@ -433,15 +433,15 @@ public class FileUploadServiceImpl implements FileUploadService { FileStatus status = findSimilar == 0 ? FileStatus.MODERATION: FileStatus.TEMP; + if (status == FileStatus.TEMP) { + fileEntityService.clearTempFiles(session.getUserId()); + } + FileEntity fileEntity = completeFileProcessing(session, status); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getFilePath()); - if (status == FileStatus.TEMP) { - fileEntityService.clearTempFiles(session.getUserId()); - } - if (status != FileStatus.TEMP) { String fileType = session.getFileType(); From c2a649a2520446ba9cac20a73e98755b3980c8ba Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 09:26:57 +0700 Subject: [PATCH 26/41] dev test baseurl for test --- .../ru/soune/nocopy/service/search/SearchImageService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java index 32ac438..8474b6a 100644 --- a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java +++ b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java @@ -72,7 +72,8 @@ public class SearchImageService { ); } - String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); +// String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); + String publicUrl = String.format("%s/api/files/public/%s", "http://92.242.61.23:2997", fileEntity.getId()); log.info("Searching reverse for image: {}", publicUrl); From ea7dd5e5dfe7d03242cf024929303980369e062a Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 10:11:31 +0700 Subject: [PATCH 27/41] dev test baseurl for test --- .../ru/soune/nocopy/service/search/SearchImageService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java index 8474b6a..32ac438 100644 --- a/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java +++ b/src/main/java/ru/soune/nocopy/service/search/SearchImageService.java @@ -72,8 +72,7 @@ public class SearchImageService { ); } -// String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); - String publicUrl = String.format("%s/api/files/public/%s", "http://92.242.61.23:2997", fileEntity.getId()); + String publicUrl = String.format("%s/api/files/public/%s", appBaseUrl, fileEntity.getId()); log.info("Searching reverse for image: {}", publicUrl); From ac7cc54b5efe345487276e5e6737eab35f0e8831 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 10:22:42 +0700 Subject: [PATCH 28/41] dev test baseurl for test --- .../soune/nocopy/service/file/impl/FileUploadServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 cdb6b40..90f08ff 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 @@ -387,8 +387,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(), - session.getUserId()); +// fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType(), +// session.getUserId()); File file = new File(finalFilePath); // File file = cloudStorageService.readFileFromStorageByPath(finalFilePath); From c33ffe516a5ada81bf8b11f4a494c9dc8d93a337 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 10:43:13 +0700 Subject: [PATCH 29/41] dev test baseurl for test --- .../ru/soune/nocopy/service/FileSimilarityService.java | 7 +++---- .../nocopy/service/file/impl/FileUploadServiceImpl.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index 96b6b04..a0cc183 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -133,11 +133,11 @@ public class FileSimilarityService { for (FileEntity file : fileEntityList) { if (file.getProtectedFilePath() == null) continue; - File existingFile = new File(file.getProtectedFilePath()); + File existingFile = cloudStorageService.readFileFromStorageByPath(file.getFilePath()); File newFile = new File(path); if (existingFile.length() == newFile.length()) { - if (calculateFileHash(file.getProtectedFilePath()).equals(hash)) { + if (calculateFileHash(file.getFilePath()).equals(hash)) { return file; } } @@ -201,9 +201,8 @@ public class FileSimilarityService { private String calculateFileHash(String path) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); - File file = cloudStorageService.readFileFromStorageByPath(path); - try (InputStream is = new FileInputStream(file)) { + try (InputStream is = cloudStorageService.readFileFromStorage(path)) { byte[] buffer = new byte[8192]; int read; while ((read = is.read(buffer)) > 0) { 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 90f08ff..cdb6b40 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 @@ -387,8 +387,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(), -// session.getUserId()); + fileSimilarityService.hasDuplicatesByHash(finalFilePath ,session.getFileType(), + session.getUserId()); File file = new File(finalFilePath); // File file = cloudStorageService.readFileFromStorageByPath(finalFilePath); From 1dd6a6b7e26d4b31ec5f44b96321897ce46c246e Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 11:01:15 +0700 Subject: [PATCH 30/41] dev test baseurl for test --- .../nocopy/service/FileSimilarityService.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index a0cc183..7087e99 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -117,7 +117,7 @@ public class FileSimilarityService { } public FileEntity findDuplicateByHash(String path, String mimeType, Long userId) throws Exception { - String hash = calculateFileHash(path); + String hash = calculateFileHash(path, false); User user = userRepository.findById(userId).orElseThrow(); Company company = user.getCompany(); @@ -132,15 +132,15 @@ public class FileSimilarityService { List fileEntityList = fileEntityRepository.findByMimeTypeAndUserIds(mimeType, userIds); for (FileEntity file : fileEntityList) { - if (file.getProtectedFilePath() == null) continue; - File existingFile = cloudStorageService.readFileFromStorageByPath(file.getFilePath()); - File newFile = new File(path); +// if (file.getProtectedFilePath() == null) continue; +// File existingFile = cloudStorageService.readFileFromStorageByPath(file.getFilePath()); +// File newFile = new File(path); - if (existingFile.length() == newFile.length()) { - if (calculateFileHash(file.getFilePath()).equals(hash)) { +// if (existingFile.length() == newFile.length()) { + if (calculateFileHash(file.getFilePath(), true).equals(hash)) { return file; } - } +// } } return null; @@ -199,10 +199,12 @@ public class FileSimilarityService { } - private String calculateFileHash(String path) throws Exception { + private String calculateFileHash(String path, boolean cloud) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); - try (InputStream is = cloudStorageService.readFileFromStorage(path)) { + File file = cloud ? cloudStorageService.readFileFromStorageByPath(path): new File(path); + + try (InputStream is = new FileInputStream(file)) { byte[] buffer = new byte[8192]; int read; while ((read = is.read(buffer)) > 0) { From d0be6580e456665adc0baf4221d4e826728a523a Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 11:50:25 +0700 Subject: [PATCH 31/41] dev test baseurl for test --- .../nocopy/controller/ApiController.java | 18 ++++++++++--- .../nocopy/controller/FileController.java | 25 ++++++++++++++----- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 1877d68..5a0ae0b 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -1,5 +1,7 @@ package ru.soune.nocopy.controller; +import com.google.api.client.util.IOUtils; +import com.google.common.io.ByteStreams; import com.vrt.NoCopyFileService; import com.vrt.fileprotection.FileProtector; import com.vrt.fileprotection.NoCopyCheckResult; @@ -13,12 +15,15 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; import ru.soune.nocopy.dto.MessageCode; @@ -43,6 +48,7 @@ import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.user.moderation.UserVerificationService; import ru.soune.nocopy.util.FileUtil; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; import java.io.File; import java.io.IOException; @@ -508,8 +514,6 @@ public class ApiController { // errorData)); // } - InputStream stream = cloudStorageService.readFileFromStorage(entityResponse.getProtectedFilePath()); - // if (!file.exists()) { // Map errorData = new HashMap<>(); // errorData.put("file", file.exists()); @@ -520,11 +524,19 @@ public class ApiController { // errorData)); // } + StreamingResponseBody responseBody = outputStream -> { + try (InputStream stream = cloudStorageService.readFileFromStorage(entityResponse.getProtectedFilePath())) { + ByteStreams.copy(stream, outputStream); + } catch (NoSuchKeyException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "File not found"); + } + }; + return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") - .body(new InputStreamResource(stream)); + .body(responseBody); } catch (FileEntityNotFoundException e) { Map errorData = new HashMap<>(); errorData.put("fileId", fileId); diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index 84e8742..e41b3d8 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -1,5 +1,7 @@ package ru.soune.nocopy.controller; +import com.google.api.client.util.IOUtils; +import com.google.common.io.ByteStreams; import com.vrt.NoCopyFileService; import com.vrt.fileprotection.FileProtector; import lombok.AllArgsConstructor; @@ -8,6 +10,7 @@ import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.http.*; import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; import ru.soune.nocopy.dto.file.CheckStatus; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.ProtectionStatus; @@ -21,6 +24,7 @@ import ru.soune.nocopy.service.file.ImageResizeService; import ru.soune.nocopy.service.file.ZipService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; import java.io.*; import java.net.URLEncoder; @@ -55,12 +59,10 @@ public class FileController { private CloudStorageService cloudStorageService; @GetMapping("/public/{fileId}") - public ResponseEntity getPublicFile(@PathVariable String fileId) { + public ResponseEntity getPublicFile(@PathVariable String fileId) { try { FileEntity fileEntity = fileRepository.findById(fileId) - .orElseThrow(() -> new FileNotFoundException("Not found: " + fileId)); - - InputStream inputStream = cloudStorageService.readFileFromStorage(fileEntity.getFilePath()); + .orElseThrow(() -> new FileNotFoundException("Not found in DB: " + fileId)); MediaType mediaType = getMediaType(fileEntity); @@ -68,15 +70,26 @@ public class FileController { .filename(fileEntity.getOriginalFileName(), StandardCharsets.UTF_8) .build(); + StreamingResponseBody responseBody = outputStream -> { + try (InputStream inputStream = cloudStorageService.readFileFromStorage(fileEntity.getFilePath())) { + ByteStreams.copy(inputStream, outputStream); + } catch (NoSuchKeyException e) { + log.error("File disappeared from S3 during streaming: {}", fileId, e); + throw new IOException("File not found in storage", e); + } + }; + return ResponseEntity.ok() .contentType(mediaType) .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()) .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") - .body(new InputStreamResource(inputStream)); - + .body(responseBody); } catch (FileNotFoundException e) { log.warn("File not found in DB: {}", fileId); return ResponseEntity.notFound().build(); + } catch (NoSuchKeyException e) { + log.warn("File not found in S3: {}", fileId); + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } catch (Exception e) { log.error("Error reading file: {}", fileId, e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); From dfc9a22bc59de621150b6c142cfa390d9aa208bf Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 18:11:36 +0700 Subject: [PATCH 32/41] dev test baseurl for test --- .../service/file/cloud/CloudStorageService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index d508e41..75ae8b3 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -65,10 +65,22 @@ public class CloudStorageService { .key(filePath) .contentType(contentType) .build(); - + log.info("putObjectRequest: " + putObjectRequest); try { + log.info("sendToCloudFilePath: " + sendToCloudFilePath); + log.info("sendToCloudFilePath: " + sendToCloudFilePath); + log.info("sendToCloudFilePath: " + sendToCloudFilePath); + log.info("sendToCloudFilePath: " + sendToCloudFilePath); + log.info("sendToCloudFilePath: " + sendToCloudFilePath); + byte[] bytes = Files.readAllBytes(Paths.get(sendToCloudFilePath)); + + log.info("bytes: " + bytes.length); + log.info("bytes: " + bytes.length); + log.info("bytes: " + bytes.length); + log.info("bytes: " + bytes.length); + log.info("bytes: " + bytes.length); s3Client.putObject(putObjectRequest, - RequestBody.fromBytes(Files.readAllBytes(Paths.get(sendToCloudFilePath)))); + RequestBody.fromBytes(bytes)); Files.deleteIfExists(Paths.get(sendToCloudFilePath)); } catch (IOException e) { log.error("Failed to read file: {}", filePath, e); From 6c3742913c0b93fa40cbeebafd1c19e9cf692f1d Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 19:09:27 +0700 Subject: [PATCH 33/41] dev test baseurl for test --- .../nocopy/controller/FileController.java | 12 ++-- .../nocopy/service/FileSimilarityService.java | 17 +++--- .../nocopy/service/ImageHashService.java | 49 ++++++++++++---- .../service/file/FileEntityService.java | 2 - .../file/cloud/CloudStorageService.java | 57 ++++++++++++++++++- 5 files changed, 110 insertions(+), 27 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/FileController.java b/src/main/java/ru/soune/nocopy/controller/FileController.java index e41b3d8..56830a0 100644 --- a/src/main/java/ru/soune/nocopy/controller/FileController.java +++ b/src/main/java/ru/soune/nocopy/controller/FileController.java @@ -124,12 +124,12 @@ public class FileController { String filePath = type.equals("thumbnail") ? fileEntity.getThumbnailPath(): fileEntity.getFilePath(); - File file = cloudStorageService.readFileFromStorageByPath(filePath); +// InputStream file = cloudStorageService.readFileFromStorage(filePath); - if (file == null || !file.exists()) { - log.error("File not found in storage: {}", fileEntity.getFilePath()); - return ResponseEntity.notFound().build(); - } +// if (file == null || !file.exists()) { +// log.error("File not found in storage: {}", fileEntity.getFilePath()); +// return ResponseEntity.notFound().build(); +// } if (fileEntity.getProtectionStatus() == ProtectionStatus.NOT_PROTECTED || fileEntity.getProtectionStatus() == ProtectionStatus.PROCESSING) { @@ -142,7 +142,7 @@ public class FileController { String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8) .replace("+", "%20"); - InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); + InputStreamResource resource = new InputStreamResource(cloudStorageService.readFileFromStorage(filePath)); return ResponseEntity.ok() .contentType(new MediaType(fileEntity.getMimeType(), fileEntity.getFileExtension())) diff --git a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java index 7087e99..b6a0ca4 100644 --- a/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java +++ b/src/main/java/ru/soune/nocopy/service/FileSimilarityService.java @@ -202,13 +202,16 @@ public class FileSimilarityService { private String calculateFileHash(String path, boolean cloud) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); - File file = cloud ? cloudStorageService.readFileFromStorageByPath(path): new File(path); - - try (InputStream is = new FileInputStream(file)) { - byte[] buffer = new byte[8192]; - int read; - while ((read = is.read(buffer)) > 0) { - digest.update(buffer, 0, read); + if (cloud) { + byte[] data = cloudStorageService.readFileFromStorageBytes(path); + digest.update(data); + } else { + try (InputStream is = new FileInputStream(path)) { + byte[] buffer = new byte[8192]; + int read; + while ((read = is.read(buffer)) > 0) { + digest.update(buffer, 0, read); + } } } diff --git a/src/main/java/ru/soune/nocopy/service/ImageHashService.java b/src/main/java/ru/soune/nocopy/service/ImageHashService.java index a71be82..44d0b54 100644 --- a/src/main/java/ru/soune/nocopy/service/ImageHashService.java +++ b/src/main/java/ru/soune/nocopy/service/ImageHashService.java @@ -12,6 +12,7 @@ import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; import java.util.Map; @@ -25,22 +26,48 @@ public class ImageHashService { private final CloudStorageService cloudStorageService; - public Map calculateHash(Path imagePath) throws IOException { -// File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); - File file = imagePath.toFile(); - if (file == null) { - file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); - } +// public Map calculateHash(Path imagePath) throws IOException { +//// File file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); +// File file = imagePath.toFile(); +// if (file == null) { +// file = cloudStorageService.readFileFromStorageByPath(imagePath.toString()); +// } +// +// PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); +// +// Long firstPart = pHash.getFirstPart(); +// Long secondPart = pHash.getSecondPart(); +// Map hash = Map.of( +// "hi", firstPart, +// "low", secondPart); +// +// return hash; +// } - PHash pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(file); + public Map calculateHash(Path imagePath) throws IOException { + PHash pHash; + + if (imagePath.toFile().exists()) { + pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(imagePath.toFile()); + } else { + byte[] data = cloudStorageService.readFileFromStorageBytes(imagePath.toString()); + + Path tempFile = Files.createTempFile("perceptual_hash_", ".tmp"); + try { + Files.write(tempFile, data); + pHash = PerceptualHashHelper.INSTANCE.generateDCTPerceptualHash(tempFile.toFile()); + } finally { + Files.deleteIfExists(tempFile); + } + } Long firstPart = pHash.getFirstPart(); Long secondPart = pHash.getSecondPart(); - Map hash = Map.of( - "hi", firstPart, - "low", secondPart); - return hash; + return Map.of( + "hi", firstPart, + "low", secondPart + ); } public void create(FileEntity file, Map stringIntegerMap) { diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index b1d9a06..bc71141 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -19,8 +19,6 @@ import ru.soune.nocopy.exception.FileEntityNotFoundException; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.FileMonitoringRepository; import ru.soune.nocopy.repository.UserRepository; -import ru.soune.nocopy.service.FileSimilarityService; -import ru.soune.nocopy.service.ImageHashService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.IOException; diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index 75ae8b3..0f9ec5d 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -9,12 +9,14 @@ import ru.soune.nocopy.repository.FileEntityRepository; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.ResponseBytes; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import java.io.File; @@ -23,6 +25,7 @@ import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.UUID; @Service @Slf4j @@ -86,6 +89,29 @@ public class CloudStorageService { log.error("Failed to read file: {}", filePath, e); } } +// +// public File readFileFromStorageByPath(String filePath) throws IOException { +// GetObjectRequest objectRequest = GetObjectRequest.builder() +// .bucket(bucket) +// .key("files" + filePath) +// .build(); +// AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); +// +// S3Client s3Client = S3Client.builder() +// .httpClient(ApacheHttpClient.create()) +// .region(Region.of(region)) +// .endpointOverride(URI.create(s3endpoint)) +// .credentialsProvider(StaticCredentialsProvider.create(credentials)) +// .build(); +// +// String tempDir = System.getProperty("java.io.tmpdir"); +// String fileName = filePath.replace("/", "_"); +// File tempFile = new File(tempDir, fileName); +// +// s3Client.getObject(objectRequest, tempFile.toPath()); +// +// return tempFile; +// } public File readFileFromStorageByPath(String filePath) throws IOException { GetObjectRequest objectRequest = GetObjectRequest.builder() @@ -102,14 +128,43 @@ public class CloudStorageService { .build(); String tempDir = System.getProperty("java.io.tmpdir"); - String fileName = filePath.replace("/", "_"); + + String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID() + "_" + + filePath.replace("/", "_"); File tempFile = new File(tempDir, fileName); s3Client.getObject(objectRequest, tempFile.toPath()); + tempFile.deleteOnExit(); + return tempFile; } + public byte[] readFileFromStorageBytes(String filePath) { + AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); + + S3Client s3Client = S3Client.builder() + .httpClient(ApacheHttpClient.create()) + .region(Region.of(region)) + .endpointOverride(URI.create(s3endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .build(); + + GetObjectRequest objectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key("files" + filePath) + .build(); + + try { + ResponseBytes responseBytes = s3Client.getObjectAsBytes(objectRequest); + return responseBytes.asByteArray(); + } catch (Exception e) { + log.error("Failed to read file from S3: {}", filePath, e); + throw new RuntimeException("Failed to read file from S3", e); + } + } + + public InputStream readFileFromStorage(String filePath) { GetObjectRequest objectRequest = GetObjectRequest.builder() .bucket(bucket) From e66ae81d184dd7e2ebd2648e6d072235eaca87b2 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 19:34:43 +0700 Subject: [PATCH 34/41] dev test baseurl for test --- .../java/ru/soune/nocopy/controller/ApiController.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/controller/ApiController.java b/src/main/java/ru/soune/nocopy/controller/ApiController.java index 5a0ae0b..aed2408 100644 --- a/src/main/java/ru/soune/nocopy/controller/ApiController.java +++ b/src/main/java/ru/soune/nocopy/controller/ApiController.java @@ -524,19 +524,13 @@ public class ApiController { // errorData)); // } - StreamingResponseBody responseBody = outputStream -> { - try (InputStream stream = cloudStorageService.readFileFromStorage(entityResponse.getProtectedFilePath())) { - ByteStreams.copy(stream, outputStream); - } catch (NoSuchKeyException e) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "File not found"); - } - }; + byte[] bytes = cloudStorageService.readFileFromStorageBytes(entityResponse.getProtectedFilePath()); return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + entityResponse.getFileName() + "\"") - .body(responseBody); + .body(bytes); } catch (FileEntityNotFoundException e) { Map errorData = new HashMap<>(); errorData.put("fileId", fileId); From 83ed7c5b010f26cb63350c093b519801e8ddeb8d Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 21 Apr 2026 21:11:47 +0700 Subject: [PATCH 35/41] dev test baseurl for test --- .../file/cloud/CloudStorageService.java | 14 +----- .../file/impl/ProtectionFileProviderImpl.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index 0f9ec5d..451aa52 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -68,20 +68,8 @@ public class CloudStorageService { .key(filePath) .contentType(contentType) .build(); - log.info("putObjectRequest: " + putObjectRequest); try { - log.info("sendToCloudFilePath: " + sendToCloudFilePath); - log.info("sendToCloudFilePath: " + sendToCloudFilePath); - log.info("sendToCloudFilePath: " + sendToCloudFilePath); - log.info("sendToCloudFilePath: " + sendToCloudFilePath); - log.info("sendToCloudFilePath: " + sendToCloudFilePath); byte[] bytes = Files.readAllBytes(Paths.get(sendToCloudFilePath)); - - log.info("bytes: " + bytes.length); - log.info("bytes: " + bytes.length); - log.info("bytes: " + bytes.length); - log.info("bytes: " + bytes.length); - log.info("bytes: " + bytes.length); s3Client.putObject(putObjectRequest, RequestBody.fromBytes(bytes)); Files.deleteIfExists(Paths.get(sendToCloudFilePath)); @@ -89,7 +77,7 @@ public class CloudStorageService { log.error("Failed to read file: {}", filePath, e); } } -// + // public File readFileFromStorageByPath(String filePath) throws IOException { // GetObjectRequest objectRequest = GetObjectRequest.builder() // .bucket(bucket) diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 702ceed..f2bf222 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -117,6 +117,49 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { public com.vrt.fileprotection.OperationResult writeAudioFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED"); + log.info("FILEENTITY PROTECTED : " + fileEntity.getMimeType()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getMimeType()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getFileExtension()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getFileExtension()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); + log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getProtectedFilePath()); From 6dec7838cecc470e6b50d8d5e380143f8d2d97a0 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 01:06:19 +0700 Subject: [PATCH 36/41] dev test baseurl for test --- .../service/file/FileEntityService.java | 8 +- .../file/cloud/CloudStorageService.java | 1 - .../file/impl/ProtectionFileProviderImpl.java | 106 +++++++++++------- 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index bc71141..ed580b9 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -22,9 +22,11 @@ import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.IOException; +import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -241,8 +243,12 @@ public class FileEntityService { if (Files.exists(protectedFilePath)) { Files.delete(protectedFilePath); } +// SEND ON DISK + try (FileChannel channel = FileChannel.open(protectedFilePath, StandardOpenOption.WRITE)) { + channel.force(true); + } - Files.write(protectedFilePath, data); +// Files.write(protectedFilePath, data); if (imageResizeService.isImage(extension)) { imageResizeService.generateSizes(fileEntity, data); diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index 451aa52..cbc371d 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -51,7 +51,6 @@ public class CloudStorageService { public void saveFilesToStorage(String mimeType, String extension, String sendToCloudFilePath) { AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); - S3Client s3Client = S3Client.builder() .httpClient(ApacheHttpClient.create()) .region(Region.of(region)) diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index f2bf222..205575c 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -115,51 +115,43 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeAudioFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); + log.info("__________________________________________"); try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED"); - log.info("FILEENTITY PROTECTED : " + fileEntity.getMimeType()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getMimeType()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getFileExtension()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getFileExtension()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); - log.info("FILEENTITY PROTECTED : " + fileEntity.getProtectedFilePath()); + + Path filePath = Paths.get(fileEntity.getProtectedFilePath()); + if (!Files.exists(filePath)) { + log.error("File not found after write: {}", filePath); + return OperationResult.Companion.failure("File not found"); + } + + log.info("File ready for upload: {} (size: {} bytes)", filePath, Files.size(filePath)); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), fileEntity.getProtectedFilePath()); @@ -174,6 +166,26 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeVideoFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); + log.info("++++++++++++++++++++++++++++++++++++"); try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); @@ -190,6 +202,14 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeImageFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); + log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); From d92a9a7d8648cf560bd45732d9254223e1c4543a Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 01:50:18 +0700 Subject: [PATCH 37/41] dev test baseurl for test --- .../file/impl/ProtectionFileProviderImpl.java | 224 +++++++++++++----- 1 file changed, 169 insertions(+), 55 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 205575c..37ef0d0 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -98,6 +98,79 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public @NotNull OperationResult writeSignature(@NotNull byte[] bytes) { try { + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); + log.info("frewerfgwergewrgewrg"); Path directory = SIGNATURE_FILE_PATH.getParent(); if (directory != null && !Files.exists(directory)) { @@ -115,34 +188,103 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeAudioFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); - log.info("__________________________________________"); try { + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); + log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); Path filePath = Paths.get(fileEntity.getProtectedFilePath()); @@ -166,26 +308,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeVideoFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); - log.info("++++++++++++++++++++++++++++++++++++"); try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); @@ -202,14 +324,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @NotNull @Override public com.vrt.fileprotection.OperationResult writeImageFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); - log.info("+_+_+_+_+_+_+_+_+_+_+_+_+"); try { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); From cc43b92f69649633d17535e64f5ac50214d1857d Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 02:06:39 +0700 Subject: [PATCH 38/41] dev test baseurl for test --- .../service/file/FileEntityService.java | 8 +- .../file/impl/AudioLocalSearchImpl.java | 8 +- .../file/impl/ProtectionFileProviderImpl.java | 169 ------------------ 3 files changed, 10 insertions(+), 175 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index ed580b9..ef671fb 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -243,13 +243,11 @@ public class FileEntityService { if (Files.exists(protectedFilePath)) { Files.delete(protectedFilePath); } -// SEND ON DISK + try (FileChannel channel = FileChannel.open(protectedFilePath, StandardOpenOption.WRITE)) { channel.force(true); } -// Files.write(protectedFilePath, data); - if (imageResizeService.isImage(extension)) { imageResizeService.generateSizes(fileEntity, data); } @@ -304,7 +302,7 @@ public class FileEntityService { return protectedPath; } - public void updateSignature(String signature, String fileId) throws IOException { + public FileEntity updateSignature(String signature, String fileId) throws IOException { FileEntity fileEntity = fileEntityRepository.findByFileId(fileId); fileEntity.setSignature(signature); fileEntity.setProtectionStatus(ProtectionStatus.PROTECTED); @@ -312,7 +310,7 @@ public class FileEntityService { fileEntity.setProtectedAt(LocalDateTime.now()); fileEntity.setProtectedFilePath(prepareProtectedPath(fileEntity, fileEntity.getFileExtension()).toString()); - fileEntityRepository.save(fileEntity); + return fileEntityRepository.save(fileEntity); } public String formatFileSize(long size) { diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java index 7d2e137..948e744 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/AudioLocalSearchImpl.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import org.springframework.stereotype.Service; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.service.file.FileEntityService; +import ru.soune.nocopy.service.file.cloud.CloudStorageService; import ru.soune.nocopy.util.FileUtil; import java.io.IOException; @@ -22,6 +23,8 @@ public class AudioLocalSearchImpl implements AudioLocalSearch { private final FileUtil fileUtil; + private final CloudStorageService cloudStorageService; + @Override public @Nullable FileProtector.FileInfo findBySignature(@NotNull String signature) { FileEntity fileEntity = fileEntityService.findBySignature(signature); @@ -34,7 +37,10 @@ public class AudioLocalSearchImpl implements AudioLocalSearch { @Override public void updateSignature(@NotNull String signature, @NotNull FileProtector.FileInfo fileInfo) { try { - fileEntityService.updateSignature(signature, fileInfo.getId()); + FileEntity fileEntity = fileEntityService.updateSignature(signature, fileInfo.getId()); + + cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), + fileEntity.getProtectedFilePath()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 37ef0d0..25c30d3 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -98,79 +98,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public @NotNull OperationResult writeSignature(@NotNull byte[] bytes) { try { - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); - log.info("frewerfgwergewrgewrg"); Path directory = SIGNATURE_FILE_PATH.getParent(); if (directory != null && !Files.exists(directory)) { @@ -189,102 +116,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public com.vrt.fileprotection.OperationResult writeAudioFile(@NotNull String id, @NotNull byte[] data, @Nullable String fileExt) { try { - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); - log.info("FERWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"); FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); Path filePath = Paths.get(fileEntity.getProtectedFilePath()); From b723247b9c763a5f15892196f01a6fef15bd434e Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 14:04:57 +0700 Subject: [PATCH 39/41] dev add new action --- .../file/impl/DocumentLocalSearchImpl.java | 17 ++++++++ .../file/impl/ProtectionFileProviderImpl.java | 39 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/DocumentLocalSearchImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/DocumentLocalSearchImpl.java index b7151d1..e5709f5 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/DocumentLocalSearchImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/DocumentLocalSearchImpl.java @@ -25,6 +25,23 @@ public class DocumentLocalSearchImpl implements DocumentLocalSearch { FileEntity fileEntity = fileEntityRepository.findByIdAndUserId(fileId, Long.valueOf(ownerId)); FileProtector.FileInfo fileInfo = fileUtil.createFileInfo(fileEntity, null); log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); + log.info("fileInfo: {}", fileInfo); return fileInfo; } diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 25c30d3..065dc44 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -171,6 +171,45 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public @NotNull OperationResult writeDocumentFile(@NotNull String id, @NotNull byte[] data) { try { + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); + log.info("SAVE DOCUMENT"); FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, null); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), From da84490198cd4f9b3e0d82a6d228c79c23ed9ed8 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 14:23:35 +0700 Subject: [PATCH 40/41] dev add new action --- .../service/file/FileEntityService.java | 16 ++++++-- .../file/impl/ProtectionFileProviderImpl.java | 40 +------------------ 2 files changed, 13 insertions(+), 43 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index ef671fb..0228914 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -22,6 +22,7 @@ import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; @@ -240,11 +241,18 @@ public class FileEntityService { String extension = determineFileExtension(fileExt, fileEntity); Path protectedFilePath = prepareProtectedPath(fileEntity, extension); - if (Files.exists(protectedFilePath)) { - Files.delete(protectedFilePath); - } + Files.createDirectories(protectedFilePath.getParent()); - try (FileChannel channel = FileChannel.open(protectedFilePath, StandardOpenOption.WRITE)) { + Files.deleteIfExists(protectedFilePath); + + try (FileChannel channel = FileChannel.open(protectedFilePath, + StandardOpenOption.CREATE, + StandardOpenOption.WRITE)) { + + ByteBuffer buffer = ByteBuffer.wrap(data); + while (buffer.hasRemaining()) { + channel.write(buffer); + } channel.force(true); } diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 065dc44..65b4bda 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -119,6 +119,7 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, fileExt); Path filePath = Paths.get(fileEntity.getProtectedFilePath()); + if (!Files.exists(filePath)) { log.error("File not found after write: {}", filePath); return OperationResult.Companion.failure("File not found"); @@ -171,45 +172,6 @@ public class ProtectionFileProviderImpl implements FileProtector.FileProvider { @Override public @NotNull OperationResult writeDocumentFile(@NotNull String id, @NotNull byte[] data) { try { - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); - log.info("SAVE DOCUMENT"); FileEntity fileEntity = fileEntityService.writeProtectedFile(id, data, null); cloudStorageService.saveFilesToStorage(fileEntity.getMimeType(), fileEntity.getFileExtension(), From 4dd6c4a3c0bdd55105c2bc324c33ff4b15d443b4 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 16:02:52 +0700 Subject: [PATCH 41/41] dev merge --- .../file/cloud/CloudStorageService.java | 23 ------------------- .../file/impl/ProtectionFileProviderImpl.java | 3 --- 2 files changed, 26 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java index cbc371d..6aee80e 100644 --- a/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java +++ b/src/main/java/ru/soune/nocopy/service/file/cloud/CloudStorageService.java @@ -77,29 +77,6 @@ public class CloudStorageService { } } -// public File readFileFromStorageByPath(String filePath) throws IOException { -// GetObjectRequest objectRequest = GetObjectRequest.builder() -// .bucket(bucket) -// .key("files" + filePath) -// .build(); -// AwsCredentials credentials = AwsBasicCredentials.create(key, secretKey); -// -// S3Client s3Client = S3Client.builder() -// .httpClient(ApacheHttpClient.create()) -// .region(Region.of(region)) -// .endpointOverride(URI.create(s3endpoint)) -// .credentialsProvider(StaticCredentialsProvider.create(credentials)) -// .build(); -// -// String tempDir = System.getProperty("java.io.tmpdir"); -// String fileName = filePath.replace("/", "_"); -// File tempFile = new File(tempDir, fileName); -// -// s3Client.getObject(objectRequest, tempFile.toPath()); -// -// return tempFile; -// } - public File readFileFromStorageByPath(String filePath) throws IOException { GetObjectRequest objectRequest = GetObjectRequest.builder() .bucket(bucket) diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java index 65b4bda..bd07d25 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/ProtectionFileProviderImpl.java @@ -10,10 +10,7 @@ import org.springframework.stereotype.Component; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.FileUploadSessionRepository; -import ru.soune.nocopy.entity.file.FileEntity; -import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.service.file.FileEntityService; -import ru.soune.nocopy.service.file.FileUploadService; import ru.soune.nocopy.service.file.cloud.CloudStorageService; import java.io.File;