From 6733aafd794cb78e3f320510dc74453e72994a33 Mon Sep 17 00:00:00 2001 From: sdw086 Date: Mon, 9 Mar 2026 15:29:26 +0900 Subject: [PATCH] =?UTF-8?q?[=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C]=20tusHook=20=EC=9E=91=EC=97=85=20-=20=EB=A6=AC?= =?UTF-8?q?=EC=A4=8C=20=ED=82=A4=EB=A1=9C=20=EB=8B=A4=EB=A5=B8=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=98=AC=EB=A6=B4=EB=95=8C=20=EB=A7=89=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/file/FileController.java | 28 ++++++++++++++ .../modules/file/dto/UploadCancelDto.java | 14 +++++++ .../modules/file/form/UploadCancelForm.java | 12 ++++++ .../modules/file/mapper/FileMapper.java | 6 +++ .../modules/file/service/FileService.java | 25 +++++++++++++ .../mapper/common/file/FileMapper.xml | 37 ++++++++++++++++++- 6 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alist/api/common/modules/file/dto/UploadCancelDto.java create mode 100644 src/main/java/com/alist/api/common/modules/file/form/UploadCancelForm.java diff --git a/src/main/java/com/alist/api/common/modules/file/FileController.java b/src/main/java/com/alist/api/common/modules/file/FileController.java index ef58b78..d36e2f7 100644 --- a/src/main/java/com/alist/api/common/modules/file/FileController.java +++ b/src/main/java/com/alist/api/common/modules/file/FileController.java @@ -1,10 +1,12 @@ package com.alist.api.common.modules.file; import com.alist.api.common.modules.file.dto.FileUploadDto; +import com.alist.api.common.modules.file.dto.UploadCancelDto; import com.alist.api.common.modules.file.dto.UploadStatusDto; import com.alist.api.common.modules.file.dto.UploadTokenDto; import com.alist.api.common.modules.file.form.FileUploadForm; import com.alist.api.common.modules.file.form.TusHookForm; +import com.alist.api.common.modules.file.form.UploadCancelForm; import com.alist.api.common.modules.file.form.UploadStatusForm; import com.alist.api.common.response.ApiResponse; import com.alist.api.common.response.ApiResponseCode; @@ -112,4 +114,30 @@ public class FileController { return ApiResponse.entity("", ApiResponseCode.CODE_200); } + + @PostMapping("/uploadCancel") + public ResponseEntity> uploadCancel( + @Valid @RequestBody UploadCancelForm uploadCancelForm, + HttpServletRequest request + ) { + HttpSession session = request.getSession(false); + Integer userTokenIdx = (session == null) ? null : (Integer) session.getAttribute("userTokenIdx"); + + if (userTokenIdx == null) { + return ApiResponse.entity("", ApiResponseCode.CODE_401); + } + + UploadCancelDto uploadCancelDto = new UploadCancelDto(); + + uploadCancelDto.setFileUuid(uploadCancelForm.getFileUuid().trim()); + uploadCancelDto.setUserTokenIdx(userTokenIdx); + + boolean canceled = fileService.updateUploadCancel(uploadCancelDto); + + if (!canceled) { + return ApiResponse.entity("", ApiResponseCode.CODE_403); + } + + return ApiResponse.entity("", ApiResponseCode.CODE_200); + } } diff --git a/src/main/java/com/alist/api/common/modules/file/dto/UploadCancelDto.java b/src/main/java/com/alist/api/common/modules/file/dto/UploadCancelDto.java new file mode 100644 index 0000000..d9dbb9e --- /dev/null +++ b/src/main/java/com/alist/api/common/modules/file/dto/UploadCancelDto.java @@ -0,0 +1,14 @@ +package com.alist.api.common.modules.file.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UploadCancelDto { + private Integer userTokenIdx; + private String fileUuid; + + private Long uploadedBytes; + private Long sizeBytes; +} diff --git a/src/main/java/com/alist/api/common/modules/file/form/UploadCancelForm.java b/src/main/java/com/alist/api/common/modules/file/form/UploadCancelForm.java new file mode 100644 index 0000000..f1a473f --- /dev/null +++ b/src/main/java/com/alist/api/common/modules/file/form/UploadCancelForm.java @@ -0,0 +1,12 @@ +package com.alist.api.common.modules.file.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UploadCancelForm { + @NotBlank + private String fileUuid; +} diff --git a/src/main/java/com/alist/api/common/modules/file/mapper/FileMapper.java b/src/main/java/com/alist/api/common/modules/file/mapper/FileMapper.java index 3cd678d..b4fc774 100644 --- a/src/main/java/com/alist/api/common/modules/file/mapper/FileMapper.java +++ b/src/main/java/com/alist/api/common/modules/file/mapper/FileMapper.java @@ -26,4 +26,10 @@ public interface FileMapper { void updateTusUploadIdIfNull(FileUploadMetaDto fileUploadMetaDto); void updateFileDetailCanceledByFileUuid(String fileUuid); + + int selectFileDetailCountByFileUuidAndUserToKenIdx(UploadCancelDto uploadCancelDto); + + int updateFileDetailCanceledByFileUuidAndUserTokenIdx(UploadCancelDto uploadCancelDto); + + UploadCancelDto selectUploadProgressByFileUuid(UploadCancelDto uploadCancelDto); } diff --git a/src/main/java/com/alist/api/common/modules/file/service/FileService.java b/src/main/java/com/alist/api/common/modules/file/service/FileService.java index 6bceda9..76b9020 100644 --- a/src/main/java/com/alist/api/common/modules/file/service/FileService.java +++ b/src/main/java/com/alist/api/common/modules/file/service/FileService.java @@ -421,4 +421,29 @@ public class FileService { } return false; } + + @Transactional + public boolean updateUploadCancel(UploadCancelDto uploadCancelDto) { + if (uploadCancelDto.getFileUuid() == null || uploadCancelDto.getFileUuid().isBlank() || uploadCancelDto.getUserTokenIdx() == null) { + return false; + } + + int allowed = fileMapper.selectFileDetailCountByFileUuidAndUserToKenIdx(uploadCancelDto); + if (allowed <= 0) { + return false; + } + + UploadCancelDto progress = fileMapper.selectUploadProgressByFileUuid(uploadCancelDto); + long uploaded = (progress != null && progress.getUploadedBytes() != null) ? progress.getUploadedBytes() : 0L; + long total = (progress != null && progress.getSizeBytes() != null) ? progress.getSizeBytes() : 0L; + + int updated = fileMapper.updateFileDetailCanceledByFileUuidAndUserTokenIdx(uploadCancelDto); + if (updated <= 0) { + return false; + } + + fileMapper.updateFileMasterAggregateByFileUuid(uploadCancelDto.getFileUuid()); + saveCanceledStatusRedis(uploadCancelDto.getFileUuid(), uploaded, total); // 필요하면 기존 bytes 조회해서 넣어도 됨 + return true; + } } diff --git a/src/main/resources/mapper/common/file/FileMapper.xml b/src/main/resources/mapper/common/file/FileMapper.xml index f780d33..37fd26a 100644 --- a/src/main/resources/mapper/common/file/FileMapper.xml +++ b/src/main/resources/mapper/common/file/FileMapper.xml @@ -114,7 +114,17 @@ AND DEL_YN = 'N' AND STATUS IN (0,1,2) - + + /*FileMapper.updateFileDetailCanceledByFileUuidAndUserTokenIdx*/ + UPDATE ALISTLMS.FILE_DETAIL LFD + INNER JOIN ALISTLMS.test_user_token LTUT ON LTUT.user_idx = LFD.CREATE_MEMBER + SET LFD.STATUS = 5, + LFD.UPDATE_DATE = NOW() + WHERE LFD.DEL_YN = 'N' + AND LFD.FILE_UUID = #{fileUuid} + AND LTUT.user_token_idx = #{userTokenIdx} + AND LFD.STATUS IN (0,1,2) + + + + + + \ No newline at end of file