[파일 업로드] tusHook 작업
- 리줌 키로 다른 파일 올릴때 막기
This commit is contained in:
@@ -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<ApiResponse<String>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +114,17 @@
|
||||
AND DEL_YN = 'N'
|
||||
AND STATUS IN (0,1,2)
|
||||
</update>
|
||||
|
||||
<update id="updateFileDetailCanceledByFileUuidAndUserTokenIdx">
|
||||
/*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)
|
||||
</update>
|
||||
|
||||
<select id="selectFileMasterCountByFileMasterKeyAndDelYnAndStatus" resultType="int">
|
||||
/*FileMapper.selectFileMasterCountByFileMasterKeyAndDelYnAndStatus*/
|
||||
@@ -126,6 +136,7 @@
|
||||
AND LFM.STATUS = 1
|
||||
AND LTUT.user_token_idx = #{userTokenIdx}
|
||||
</select>
|
||||
|
||||
<select id="selectFileDetailCountByFileUuidUserToKenIdx" resultType="java.lang.Integer">
|
||||
/*FileMapper.selectFileDetailCountByFileUuidUserToKenIdx*/
|
||||
SELECT COUNT(*)
|
||||
@@ -143,6 +154,7 @@
|
||||
OR LOWER(LFD.CONTENT_TYPE) = LOWER(#{contentType})
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectFileUploadMetaByFileUuid" resultType="com.alist.api.common.modules.file.dto.FileUploadMetaDto">
|
||||
/*FileMapper.selectFileUploadMetaByFileUuid*/
|
||||
SELECT FILE_UUID, ORIGIN_NAME, SIZE_BYTES, CONTENT_TYPE, TUS_UPLOAD_ID, STATUS
|
||||
@@ -151,4 +163,27 @@
|
||||
AND DEL_YN = 'N'
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<select id="selectFileDetailCountByFileUuidAndUserToKenIdx" resultType="java.lang.Integer">
|
||||
/*FileMapper.selectCancelableUploadCountByFileUuidAndUserTokenIdx*/
|
||||
SELECT COUNT(*)
|
||||
FROM ALISTLMS.FILE_DETAIL LFD
|
||||
INNER JOIN ALISTLMS.test_user_token LTUT ON LTUT.user_idx = LFD.CREATE_MEMBER
|
||||
WHERE LFD.DEL_YN = 'N'
|
||||
AND LFD.FILE_UUID = #{fileUuid}
|
||||
AND LTUT.user_token_idx = #{userTokenIdx}
|
||||
AND LFD.STATUS IN (0,1,2)
|
||||
</select>
|
||||
<select id="selectUploadProgressByFileUuid" resultType="com.alist.api.common.modules.file.dto.UploadCancelDto">
|
||||
SELECT LFD.FILE_UUID
|
||||
, COALESCE(LFD.UPLOADED_BYTES, 0) AS UPLOADED_BYTES
|
||||
, COALESCE(LFD.SIZE_BYTES, 0) AS SIZE_BYTES
|
||||
FROM ALISTLMS.FILE_DETAIL LFD
|
||||
INNER JOIN ALISTLMS.test_user_token LTUT
|
||||
ON LTUT.user_idx = LFD.CREATE_MEMBER
|
||||
WHERE LFD.FILE_UUID = #{fileUuid}
|
||||
AND LTUT.user_token_idx = #{userTokenIdx}
|
||||
AND LFD.DEL_YN = 'N'
|
||||
LIMIT 1
|
||||
</select>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user