From f136ac1f0a467903d5da57e7df32b8f078974a3a Mon Sep 17 00:00:00 2001 From: vladp Date: Thu, 8 Jan 2026 03:22:32 +0700 Subject: [PATCH] add methods and lib for protection files --- build.gradle | 7 + libs/testlib-0.1.2.jar | Bin 0 -> 76757 bytes .../configuration/ApplicationConfig.java | 17 ++ .../configuration/file/NoCopyInitializer.java | 19 +++ .../soune/nocopy/entity/file/FileEntity.java | 15 ++ .../nocopy/entity/file/ProtectionStatus.java | 8 + .../repository/FileEntityRepository.java | 3 + .../file/FileProcessingOrchestrator.java | 73 +++++++++ .../file/NoCopyProcessingListener.java | 26 +++ .../service/file/ProtectionFileProvider.java | 149 ++++++++++++++++++ 10 files changed, 317 insertions(+) create mode 100644 libs/testlib-0.1.2.jar create mode 100644 src/main/java/ru/soune/nocopy/configuration/file/NoCopyInitializer.java create mode 100644 src/main/java/ru/soune/nocopy/entity/file/ProtectionStatus.java create mode 100644 src/main/java/ru/soune/nocopy/service/file/FileProcessingOrchestrator.java create mode 100644 src/main/java/ru/soune/nocopy/service/file/NoCopyProcessingListener.java create mode 100644 src/main/java/ru/soune/nocopy/service/file/ProtectionFileProvider.java diff --git a/build.gradle b/build.gradle index d42173a..788db2c 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,9 @@ configurations { repositories { mavenCentral() + flatDir { + dirs 'libs' + } } dependencies { @@ -45,6 +48,10 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.mockito:mockito-core:5.3.1' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0' + + implementation name: 'testlib-0.1.2' } tasks.named('test') { diff --git a/libs/testlib-0.1.2.jar b/libs/testlib-0.1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..28fcd06f7c3b760b14243026a503cd56a8e5a00c GIT binary patch literal 76757 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]RpSi%tk;S&@dt$V58CA5 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 initialQueue = Collections.emptyList(); + + return new NoCopyFileService(initialQueue, fileProvider, processingListener); + } } diff --git a/src/main/java/ru/soune/nocopy/configuration/file/NoCopyInitializer.java b/src/main/java/ru/soune/nocopy/configuration/file/NoCopyInitializer.java new file mode 100644 index 0000000..39eef84 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/configuration/file/NoCopyInitializer.java @@ -0,0 +1,19 @@ +package ru.soune.nocopy.configuration.file; + +import lombok.AllArgsConstructor; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import ru.soune.nocopy.service.file.FileProcessingOrchestrator; + +@Component +@AllArgsConstructor +public class NoCopyInitializer { + + private final FileProcessingOrchestrator orchestrator; + + @EventListener(ApplicationReadyEvent.class) + public void initializeOnStartup() { + orchestrator.initializeProcessingQueue(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java b/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java index ffdd985..eb68451 100644 --- a/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java +++ b/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java @@ -60,11 +60,26 @@ public class FileEntity { @Column(name = "updated_at") private LocalDateTime updatedAt; + @Column(name = "protected_file_path") + private String protectedFilePath; + + @Column(name = "protection_status") + @Enumerated(EnumType.STRING) + private ProtectionStatus protectionStatus; + + @Column(name = "protected_at") + private LocalDateTime protectedAt; + @PrePersist public void prePersist() { if (this.status == null) { this.status = FileStatus.ACTIVE; } + + if (this.protectionStatus == null) { + this.protectionStatus = ProtectionStatus.NOT_PROTECTED; + } + if (this.createdAt == null) { this.createdAt = LocalDateTime.now(); } diff --git a/src/main/java/ru/soune/nocopy/entity/file/ProtectionStatus.java b/src/main/java/ru/soune/nocopy/entity/file/ProtectionStatus.java new file mode 100644 index 0000000..4ffa30c --- /dev/null +++ b/src/main/java/ru/soune/nocopy/entity/file/ProtectionStatus.java @@ -0,0 +1,8 @@ +package ru.soune.nocopy.entity.file; + +public enum ProtectionStatus { + NOT_PROTECTED, + PROCESSING, + PROTECTED, + FAILED +} diff --git a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java index 3ee41cb..d2788d8 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; +import ru.soune.nocopy.entity.file.ProtectionStatus; import java.util.List; import java.util.Optional; @@ -21,6 +22,8 @@ public interface FileEntityRepository extends JpaRepository Optional findByUploadSessionId(String uploadSessionId); + List findByProtectionStatus(ProtectionStatus protectionStatus); + boolean existsByFilePath(String filePath); @Query("SELECT SUM(f.fileSize) FROM FileEntity f WHERE f.userId = :userId AND f.status = 'ACTIVE'") diff --git a/src/main/java/ru/soune/nocopy/service/file/FileProcessingOrchestrator.java b/src/main/java/ru/soune/nocopy/service/file/FileProcessingOrchestrator.java new file mode 100644 index 0000000..6fe56cf --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/file/FileProcessingOrchestrator.java @@ -0,0 +1,73 @@ +package ru.soune.nocopy.service.file; + +import com.vrt.NoCopyFileService; +import com.vrt.fileprocessor.FileProcessor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.entity.file.ProtectionStatus; +import ru.soune.nocopy.repository.FileEntityRepository; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class FileProcessingOrchestrator { + private final NoCopyFileService noCopyFileService; + + private final FileEntityRepository fileRepository; + + public void initializeProcessingQueue() { + List filesToProtect = fileRepository.findByProtectionStatus(ProtectionStatus.NOT_PROTECTED); + + for (FileEntity fileEntity : filesToProtect) { + try { + FileProcessor.FileInfo fileInfo = createFileInfo(fileEntity); + + noCopyFileService.addFile(fileInfo); + + log.info("Add to query: {}", fileEntity.getOriginalFileName()); + } catch (Exception e) { + log.error("Fail add to query: {}", fileEntity.getId(), e); + } + } + } + + @Scheduled(fixedDelay = 120000) + public void checkNewFilesForProtection() { + List newFiles = fileRepository.findByProtectionStatus(ProtectionStatus.NOT_PROTECTED); + + for (FileEntity fileEntity : newFiles) { + FileProcessor.FileInfo fileInfo = createFileInfo(fileEntity); + noCopyFileService.addFile(fileInfo); + + fileEntity.setProtectionStatus(ProtectionStatus.PROCESSING); + fileRepository.save(fileEntity); + } + } + + private FileProcessor.FileInfo createFileInfo(FileEntity fileEntity) { + FileProcessor.Type type = determineFileType(fileEntity.getMimeType()); + + return new FileProcessor.FileInfo(type, fileEntity.getId()); + } + + private FileProcessor.Type determineFileType(String mimeType) { + if (mimeType == null) { + return FileProcessor.Type.IMAGE; + } + + if (mimeType.startsWith("image")) { + return FileProcessor.Type.IMAGE; + } else if (mimeType.startsWith("video")) { + return FileProcessor.Type.VIDEO; + } else if (mimeType.startsWith("audio")) { + return FileProcessor.Type.AUDIO; + } else { + return FileProcessor.Type.IMAGE; + } + } +} diff --git a/src/main/java/ru/soune/nocopy/service/file/NoCopyProcessingListener.java b/src/main/java/ru/soune/nocopy/service/file/NoCopyProcessingListener.java new file mode 100644 index 0000000..244d26f --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/file/NoCopyProcessingListener.java @@ -0,0 +1,26 @@ +package ru.soune.nocopy.service.file; + +import com.vrt.fileprocessor.FileProcessor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +//Менять статус защиты +@Slf4j +@Component +public class NoCopyProcessingListener implements FileProcessor.ProcessingListener { + + @Override + public void onStartProcessing(FileProcessor.FileInfo fileInfo) { + } + + @Override + public void onProcessingFailed(FileProcessor.FileInfo fileInfo) { + } + + @Override + public void onSavingFailed(FileProcessor.FileInfo fileInfo) { + } + + @Override + public void onFinish(FileProcessor.FileInfo fileInfo) { + } +} diff --git a/src/main/java/ru/soune/nocopy/service/file/ProtectionFileProvider.java b/src/main/java/ru/soune/nocopy/service/file/ProtectionFileProvider.java new file mode 100644 index 0000000..33aea6c --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/file/ProtectionFileProvider.java @@ -0,0 +1,149 @@ +package ru.soune.nocopy.service.file; + +import com.vrt.fileprocessor.FileProcessor; +import kotlin.Result; +import kotlin.Unit; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.entity.file.ProtectionStatus; +import ru.soune.nocopy.repository.FileEntityRepository; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +//Сохранение и запись защищенных файлов +@Slf4j +@Component +@RequiredArgsConstructor +public class ProtectionFileProvider implements FileProcessor.FileProvider { + + private final FileEntityRepository fileRepository; + +// @Override + public Result writeAudioFile(String id, byte[] data, String fileExt) { + try { + writeProtectedFile(id, data, fileExt); + return new Result<>(); + } catch (Exception e) { + log.error("Failed to create protected file: {}", id, e); + return new Result<>(); + } + } + + // @Override + public Result writeImageFile(String id, byte[] data, String fileExt) { + try { + writeProtectedFile(id, data, fileExt); + return new Result<>(); + } catch (Exception e) { + log.error("Failed to create protected file: {}", id, e); + return new Result<>(); + } + } + + // @Override + public Result writeVideoFile(String id, byte[] data, String fileExt) { + try { + writeProtectedFile(id, data, fileExt); + return new Result<>(); + } catch (Exception e) { + log.error("Failed to create protected file: {}", id, e); + return new Result<>(); + } + } + + @Override + public File getImageFile(String id) { + return getFileById(id); + } + + @Override + public File getVideoFile(String id) { + return getFileById(id); + } + + @Override + public File getAudioFile(String id) { + return getFileById(id); + } + + + private void writeProtectedFile(String id, byte[] data, String fileExt) throws IOException { + FileEntity fileEntity = fileRepository.findById(id) + .orElseThrow(() -> new RuntimeException("File not found: " + id)); + + String extension = determineFileExtension(fileExt, fileEntity); + Path protectedFilePath = prepareProtectedPath(fileEntity, extension); + + if (Files.exists(protectedFilePath)) { + Files.delete(protectedFilePath); + } + + Files.write(protectedFilePath, data); + + fileEntity.setProtectedFilePath(protectedFilePath.toString()); + fileEntity.setProtectionStatus(ProtectionStatus.PROTECTED); + fileEntity.setProtectedAt(LocalDateTime.now()); + fileEntity.setUpdatedAt(LocalDateTime.now()); + fileEntity.setFileExtension(extension); + + fileRepository.save(fileEntity); + } + + + private File getFileById(String id) { + try { + FileEntity fileEntity = fileRepository.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; + } + } + + private String determineFileExtension(String fileExt, FileEntity fileEntity) { + if (fileExt != null && !fileExt.trim().isEmpty()) { + return fileExt; + } else { + return fileEntity.getFileExtension(); + } + } + + private Path prepareProtectedPath(FileEntity fileEntity, String extension) throws IOException { + Path originalPath = Paths.get(fileEntity.getFilePath()); + + String pathStr = originalPath.toString(); + pathStr = pathStr.replaceFirst("/uploads/", "/protected/"); + + Path protectedPath = Paths.get(pathStr); + String fileName = protectedPath.getFileName().toString(); + + if (extension != null) { + String nameWithoutExt = fileName; + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex > 0) { + nameWithoutExt = fileName.substring(0, lastDotIndex); + } + fileName = nameWithoutExt + "." + extension; + + protectedPath = protectedPath.getParent().resolve(fileName); + } + + Files.createDirectories(protectedPath.getParent()); + + return protectedPath; + } +}