From 5de7e828c2da6143fe01b0578a3b0c4581d21666 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Wed, 22 Apr 2026 17:10:25 +0700 Subject: [PATCH] dev merge --- .../nocopy/dto/file/FileEntityRequest.java | 5 ++ .../nocopy/handler/FileEntityHandler.java | 54 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java index 68df125..da4f420 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import ru.soune.nocopy.entity.file.FileStatus; +import java.util.List; + @Data @Builder @AllArgsConstructor @@ -18,6 +20,9 @@ public class FileEntityRequest { @JsonProperty("file_id") private String fileId; + @JsonProperty("file_ids") + private List fileIds; + @JsonProperty("full_delete") private Integer fullDelete; diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 5c04a99..b2bebb0 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -25,6 +25,10 @@ import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileStatsService; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -79,6 +83,8 @@ public class FileEntityHandler implements RequestHandler { return handleDeleteFile(request, fileRequest); case "change_file_status": return handleChangeStatus(request, fileRequest); + case "delete_files": + return handleDeleteFiles(request, fileRequest); case "moderate_file": return handleModerateFile(request, fileRequest); case "submit_appeal": @@ -684,6 +690,54 @@ public class FileEntityHandler implements RequestHandler { request.getVersion())); } + private BaseResponse handleDeleteFiles(BaseRequest request, FileEntityRequest fileRequest) { + List fileIds = fileRequest.getFileIds(); + List deletedIds = new ArrayList<>(); + List failedIds = new ArrayList<>(); + + for (String fileId : fileIds) { + try { + FileEntity fileEntity = fileEntityRepository.findById(fileId) + .orElseThrow(() -> new FileEntityNotFoundException(fileId)); + + deleteFileIfExists(fileEntity.getFilePath()); + deleteFileIfExists(fileEntity.getProtectedFilePath()); + deleteFileIfExists(fileEntity.getThumbnailPath()); + deleteFileIfExists(fileEntity.getMediumPath()); + + deletedIds.add(fileId); + log.info("Files deleted for entity: {}", fileId); + + } catch (Exception e) { + failedIds.add(fileId); + log.error("Failed to delete files for entity: {}", fileId, e); + } + } + + if (!deletedIds.isEmpty()) { + fileEntityRepository.deleteAllById(deletedIds); + log.info("Deleted {} entities from database", deletedIds.size()); + } + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), failedIds); + } + + private void deleteFileIfExists(String filePath) { + if (filePath != null && !filePath.isEmpty()) { + try { + Path path = Paths.get(filePath); + boolean deleted = Files.deleteIfExists(path); + if (deleted) { + log.debug("Deleted file: {}", filePath); + } + } catch (IOException e) { + log.warn("Failed to delete file: {}", filePath, e); + throw new RuntimeException("Failed to delete file: " + filePath, e); + } + } + } + private BaseResponse handleDeleteFile(BaseRequest request, FileEntityRequest fileRequest) { try { Long userId = authService.useUserAuthToken(fileRequest.getToken());