From 2a9f33068a87e0ca86418fe1c3675fa6af021449 Mon Sep 17 00:00:00 2001 From: vladp Date: Fri, 26 Dec 2025 16:23:17 +0700 Subject: [PATCH] add logic with hard delete --- .../nocopy/handler/FileEntityHandler.java | 34 ++++++++++++++----- .../service/file/FileEntityService.java | 22 ++++++++---- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 6af6673..968a3b7 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -7,8 +7,12 @@ import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.file.*; import ru.soune.nocopy.entity.AuthToken; +import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.entity.file.FileStatus; +import ru.soune.nocopy.exception.FileEntityNotFoundException; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.repository.AuthTokenRepository; +import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.service.file.FileEntityService; import java.util.Arrays; @@ -18,11 +22,14 @@ import java.util.List; @Component @RequiredArgsConstructor public class FileEntityHandler implements RequestHandler { - private final FileEntityService fileEntityService; + private final AuthTokenRepository authTokenRepository; + private final ObjectMapper objectMapper; + private final FileEntityRepository fileEntityRepository; + @Override public BaseResponse handle(BaseRequest request) { try { @@ -236,7 +243,9 @@ public class FileEntityHandler implements RequestHandler { private BaseResponse handleDeleteFile(BaseRequest request, FileEntityRequest fileRequest) { try { Long userId = getUserIdFromToken(fileRequest.getToken()); - FileEntityResponse fileInfo = fileEntityService.getById(fileRequest.getFileId(), request.getVersion()); + String fileId = fileRequest.getFileId(); + FileEntityResponse fileInfo = fileEntityService.getById(fileId, request.getVersion()); + DeleteFileResponse response; if (!fileInfo.getUserId().equals(userId)) { return new BaseResponse(request.getMsgId(), @@ -245,18 +254,27 @@ public class FileEntityHandler implements RequestHandler { null); } - fileEntityService.markAsDeleted(fileRequest.getFileId()); + FileEntity fileEntity = fileEntityRepository.findById(fileId) + .orElseThrow(() -> new FileEntityNotFoundException(fileId)); - DeleteFileResponse response = DeleteFileResponse.builder() - .fileId(fileRequest.getFileId()) - .message("File marked as deleted") - .build(); + if (fileEntity.getStatus().equals(FileStatus.DELETED)) { + fileEntityService.deleteFromDisk(fileEntity); + response = DeleteFileResponse.builder() + .fileId(fileRequest.getFileId()) + .message("File deleted from disk") + .build(); + } else { + fileEntityService.markAsDeleted(fileEntity); + response = DeleteFileResponse.builder() + .fileId(fileRequest.getFileId()) + .message("File marked as deleted") + .build(); + } return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), "File marked as deleted", response); - } catch (NotFoundAuthToken e) { return new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(), 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 d21c63c..617eeda 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -17,6 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.List; import java.util.stream.Collectors; @@ -167,15 +168,24 @@ public class FileEntityService { } @Transactional - public void markAsDeleted(String fileId) { - FileEntity fileEntity = fileEntityRepository.findById(fileId) - .orElseThrow(() -> new FileEntityNotFoundException(fileId)); - + public void markAsDeleted(FileEntity fileEntity) { fileEntity.setStatus(FileStatus.DELETED); fileEntity.setUpdatedAt(LocalDateTime.now()); - fileEntityRepository.save(fileEntity); - log.info("FileEntity marked as deleted: {}", fileId); + fileEntityRepository.save(fileEntity); + } + + @Transactional + public boolean deleteFromDisk(FileEntity fileEntity) throws IOException { + Path path = Paths.get(fileEntity.getFilePath()); + + if (!Files.exists(path)) { + return true; + } + + Files.delete(path); + + return true; } @Transactional(readOnly = true)