From 6e58d578213bfeecbed8aab5a8a02d74e4a186ce Mon Sep 17 00:00:00 2001 From: sdw086 Date: Mon, 23 Mar 2026 14:25:48 +0900 Subject: [PATCH] =?UTF-8?q?[API]=20=ED=8C=8C=EC=9D=BC=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/modules/file/FileController.java | 22 +++++-- .../api/modules/file/dto/FileDeleteDto.java | 11 ++++ .../api/modules/file/form/FileDeleteForm.java | 19 ++++++ .../api/modules/file/mapper/FileMapper.java | 6 ++ .../api/modules/file/service/FileService.java | 28 +++++++++ src/main/resources/mapper/file/FileMapper.xml | 60 +++++++++++++++++++ 6 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/alist/api/modules/file/dto/FileDeleteDto.java create mode 100644 src/main/java/com/alist/api/modules/file/form/FileDeleteForm.java diff --git a/src/main/java/com/alist/api/modules/file/FileController.java b/src/main/java/com/alist/api/modules/file/FileController.java index 8176d77..6337152 100644 --- a/src/main/java/com/alist/api/modules/file/FileController.java +++ b/src/main/java/com/alist/api/modules/file/FileController.java @@ -1,10 +1,7 @@ package com.alist.api.modules.file; import com.alist.api.modules.file.dto.*; -import com.alist.api.modules.file.form.FileUploadForm; -import com.alist.api.modules.file.form.TusHookForm; -import com.alist.api.modules.file.form.UploadCancelForm; -import com.alist.api.modules.file.form.UploadStatusForm; +import com.alist.api.modules.file.form.*; import com.alist.api.common.response.ApiResponse; import com.alist.api.common.response.ApiResponseCode; import com.alist.api.modules.file.service.FileService; @@ -265,4 +262,21 @@ public class FileController { .toString()) .body(resource); } + + @Operation( + summary = "파일 삭제 처리", + description = "fileUuid 기준으로 완료된 파일(STATUS = 3)을 논리 삭제 처리합니다. 실제 파일은 삭제하지 않고 DEL_YN = 'Y'만 반영합니다." + ) + @PostMapping("/delete") + public ResponseEntity> fileDelete( + @Valid @RequestBody FileDeleteForm fileDeleteForm + ) { + boolean deleted = fileService.updateFileDelete(fileDeleteForm.fileDeleteDto()); + + if (!deleted) { + return ApiResponse.entity("", ApiResponseCode.CODE_2005, "파일 삭제"); + } + + return ApiResponse.entity("", ApiResponseCode.CODE_200); + } } diff --git a/src/main/java/com/alist/api/modules/file/dto/FileDeleteDto.java b/src/main/java/com/alist/api/modules/file/dto/FileDeleteDto.java new file mode 100644 index 0000000..59a9700 --- /dev/null +++ b/src/main/java/com/alist/api/modules/file/dto/FileDeleteDto.java @@ -0,0 +1,11 @@ +package com.alist.api.modules.file.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FileDeleteDto { + private Integer userTokenIdx; + private String fileUuid; +} diff --git a/src/main/java/com/alist/api/modules/file/form/FileDeleteForm.java b/src/main/java/com/alist/api/modules/file/form/FileDeleteForm.java new file mode 100644 index 0000000..f5398b9 --- /dev/null +++ b/src/main/java/com/alist/api/modules/file/form/FileDeleteForm.java @@ -0,0 +1,19 @@ +package com.alist.api.modules.file.form; + +import com.alist.api.modules.file.dto.FileDeleteDto; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FileDeleteForm { + @NotBlank + private String fileUuid; + + public FileDeleteDto fileDeleteDto() { + FileDeleteDto fileDeleteDto = new FileDeleteDto(); + fileDeleteDto.setFileUuid(fileUuid == null ? null : fileUuid.trim()); + return fileDeleteDto; + } +} diff --git a/src/main/java/com/alist/api/modules/file/mapper/FileMapper.java b/src/main/java/com/alist/api/modules/file/mapper/FileMapper.java index 20533cd..0e2a2d3 100644 --- a/src/main/java/com/alist/api/modules/file/mapper/FileMapper.java +++ b/src/main/java/com/alist/api/modules/file/mapper/FileMapper.java @@ -42,4 +42,10 @@ public interface FileMapper { FileDownloadDto selectFileDetailByFileUuid(FileDownloadDto fileDownloadDto); void insertFileDownloadEventLog(FileDownloadDto fileDetailInfo); + + int selectFileDeleteTargetCount(FileDeleteDto fileDeleteDto); + + int updateFileDetailDeleteByFileUuid(FileDeleteDto fileDeleteDto); + + int updateFileMasterDeleteByFileUuid(FileDeleteDto fileDeleteDto); } diff --git a/src/main/java/com/alist/api/modules/file/service/FileService.java b/src/main/java/com/alist/api/modules/file/service/FileService.java index f3c1d79..404ff7c 100644 --- a/src/main/java/com/alist/api/modules/file/service/FileService.java +++ b/src/main/java/com/alist/api/modules/file/service/FileService.java @@ -667,4 +667,32 @@ public class FileService { return resolved; } + + @Transactional + public boolean updateFileDelete(FileDeleteDto fileDeleteDto) { + if (fileDeleteDto == null || fileDeleteDto.getFileUuid() == null || fileDeleteDto.getFileUuid().isBlank()) { + return false; + } + + Integer userTokenIdx = getLoginUserTokenIdx(); + if (userTokenIdx == null) { + return false; + } + + fileDeleteDto.setUserTokenIdx(userTokenIdx); + fileDeleteDto.setFileUuid(fileDeleteDto.getFileUuid().trim()); + + int allowed = fileMapper.selectFileDeleteTargetCount(fileDeleteDto); + if (allowed <= 0) { + return false; + } + + int detailUpdated = fileMapper.updateFileDetailDeleteByFileUuid(fileDeleteDto); + if (detailUpdated <= 0) { + return false; + } + + fileMapper.updateFileMasterDeleteByFileUuid(fileDeleteDto); + return true; + } } diff --git a/src/main/resources/mapper/file/FileMapper.xml b/src/main/resources/mapper/file/FileMapper.xml index 6bec73d..c7ce617 100644 --- a/src/main/resources/mapper/file/FileMapper.xml +++ b/src/main/resources/mapper/file/FileMapper.xml @@ -299,4 +299,64 @@ AND DEL_YN = 'N' AND STATUS = 3 + + + + + /*FileMapper.updateFileDetailDeleteByFileUuid*/ + UPDATE ALISTLMS.FILE_DETAIL LFD + INNER JOIN ALISTLMS.FILE_MASTER LFM + ON LFM.FILE_MASTER_IDX = LFD.FILE_MASTER_IDX + AND LFM.DEL_YN = 'N' + INNER JOIN ALISTLMS.test_user_token LTUT + ON LTUT.user_idx = LFM.USER_IDX + SET LFD.DEL_YN = 'Y' + , LFD.UPDATE_DATE = NOW() + WHERE LFD.FILE_UUID = #{fileUuid} + AND LTUT.user_token_idx = #{userTokenIdx} + AND LFD.DEL_YN = 'N' + AND LFD.STATUS = 3 + AND LFM.STATUS = 3 + + + + /*FileMapper.updateFileMasterDeleteByFileUuid*/ + UPDATE ALISTLMS.FILE_MASTER LFM + INNER JOIN ( + SELECT LFD.FILE_MASTER_IDX + FROM ALISTLMS.FILE_DETAIL LFD + WHERE LFD.FILE_UUID = #{fileUuid} + AND LFD.DEL_YN = 'Y' + LIMIT 1 + ) TARGET + ON TARGET.FILE_MASTER_IDX = LFM.FILE_MASTER_IDX + INNER JOIN ALISTLMS.test_user_token LTUT + ON LTUT.user_idx = LFM.USER_IDX + SET LFM.DEL_YN = 'Y' + , LFM.UPDATE_DATE = NOW() + WHERE LTUT.user_token_idx = #{userTokenIdx} + AND LFM.DEL_YN = 'N' + AND LFM.STATUS = 3 + AND NOT EXISTS ( + SELECT 1 + FROM ALISTLMS.FILE_DETAIL CHK + WHERE CHK.FILE_MASTER_IDX = LFM.FILE_MASTER_IDX + AND CHK.DEL_YN = 'N' + ) + + \ No newline at end of file