diff --git a/src/main/java/im/zhaojun/zfile/home/controller/FileOperatorController.java b/src/main/java/im/zhaojun/zfile/home/controller/FileOperatorController.java index b13cd98..5113deb 100644 --- a/src/main/java/im/zhaojun/zfile/home/controller/FileOperatorController.java +++ b/src/main/java/im/zhaojun/zfile/home/controller/FileOperatorController.java @@ -1,10 +1,11 @@ package im.zhaojun.zfile.home.controller; +import cn.hutool.core.collection.CollUtil; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSort; import im.zhaojun.zfile.common.context.StorageSourceContext; -import im.zhaojun.zfile.home.model.request.operator.DeleteFileRequest; -import im.zhaojun.zfile.home.model.request.operator.DeleteFolderRequest; +import im.zhaojun.zfile.home.model.enums.FileTypeEnum; +import im.zhaojun.zfile.home.model.request.operator.BatchDeleteRequest; import im.zhaojun.zfile.home.model.request.operator.NewFolderRequest; import im.zhaojun.zfile.home.model.request.operator.RenameFileRequest; import im.zhaojun.zfile.home.model.request.operator.RenameFolderRequest; @@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; /** * 文件操作相关接口, 如新建文件夹, 上传文件, 删除文件, 移动文件等. @@ -52,29 +54,33 @@ public class FileOperatorController { @ApiOperationSupport(order = 2) - @ApiOperation(value = "删除文件") - @PostMapping("/delete/file") - public AjaxJson deleteFile(@Valid @RequestBody DeleteFileRequest deleteFileRequest) { - AbstractBaseFileService fileService = storageSourceContext.getByKey(deleteFileRequest.getStorageKey()); - boolean flag = fileService.deleteFile(deleteFileRequest.getPath(), deleteFileRequest.getName()); - if (flag) { - return AjaxJson.getSuccess("删除成功"); - } else { - return AjaxJson.getError("删除失败"); + @ApiOperation(value = "批量删除文件/文件夹") + @PostMapping("/delete/batch") + public AjaxJson deleteFile(@Valid @RequestBody BatchDeleteRequest batchDeleteRequest) { + AbstractBaseFileService fileService = storageSourceContext.getByKey(batchDeleteRequest.getStorageKey()); + List deleteItems = batchDeleteRequest.getDeleteItems(); + + int deleteSuccessCount = 0, deleteFailCount = 0, totalCount = CollUtil.size(deleteItems); + + for (BatchDeleteRequest.DeleteItem deleteItem : deleteItems) { + boolean flag = false; + if (deleteItem.getType() == FileTypeEnum.FILE) { + flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName()); + } else if (deleteItem.getType() == FileTypeEnum.FOLDER) { + flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName()); + } + + if (flag) { + deleteSuccessCount++; + } else { + deleteFailCount++; + } } - } - - - @ApiOperationSupport(order = 3) - @ApiOperation(value = "删除文件夹") - @PostMapping("/delete/folder") - public AjaxJson deleteFolder(@Valid @RequestBody DeleteFolderRequest deleteFolderRequest) { - AbstractBaseFileService fileService = storageSourceContext.getByKey(deleteFolderRequest.getStorageKey()); - boolean flag = fileService.deleteFolder(deleteFolderRequest.getPath(), deleteFolderRequest.getName()); - if (flag) { - return AjaxJson.getSuccess("删除成功"); + + if (totalCount > 1) { + return AjaxJson.getSuccess("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个."); } else { - return AjaxJson.getError("删除失败"); + return totalCount == deleteSuccessCount ? AjaxJson.getSuccess("删除成功") : AjaxJson.getError("删除失败"); } } diff --git a/src/main/java/im/zhaojun/zfile/home/controller/ShortLinkController.java b/src/main/java/im/zhaojun/zfile/home/controller/ShortLinkController.java index 7c6dec8..a0b723b 100644 --- a/src/main/java/im/zhaojun/zfile/home/controller/ShortLinkController.java +++ b/src/main/java/im/zhaojun/zfile/home/controller/ShortLinkController.java @@ -14,19 +14,27 @@ import im.zhaojun.zfile.common.exception.IllegalDownloadLinkException; import im.zhaojun.zfile.common.util.AjaxJson; import im.zhaojun.zfile.common.util.StringUtils; import im.zhaojun.zfile.home.model.dto.SystemConfigDTO; +import im.zhaojun.zfile.home.model.request.BatchGenerateLinkRequest; +import im.zhaojun.zfile.home.model.result.BatchGenerateLinkResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import javax.annotation.Resource; +import javax.validation.Valid; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * 短链接口 @@ -36,6 +44,7 @@ import java.io.IOException; @Api(tags = "直短链模块") @ApiSort(5) @Controller +@Slf4j public class ShortLinkController { @Resource @@ -47,8 +56,7 @@ public class ShortLinkController { @Resource private StorageSourceService storageSourceService; - - @GetMapping("/api/short-link") + @PostMapping("/api/short-link/batch/generate") @ResponseBody @ApiOperationSupport(order = 1) @ApiOperation(value = "生成短链", notes = "对指定存储源的某文件路径生成短链") @@ -61,7 +69,9 @@ public class ShortLinkController { @DynamicParameter(name = "code", value = "业务状态码,0 为正常,其他值均为异常,异常情况下见响应消息", example = "0"), @DynamicParameter(name = "data", value = "短链地址", example = "https://zfile.vip/s/btz4tu") }) - public AjaxJson generatorShortLink(String storageKey, String path) { + public AjaxJson> generatorShortLink(@RequestBody @Valid BatchGenerateLinkRequest batchGenerateLinkRequest) { + List result = new ArrayList<>(); + // 获取站点域名 SystemConfigDTO systemConfig = systemConfigService.getSystemConfig(); @@ -73,9 +83,12 @@ public class ShortLinkController { } String domain = systemConfig.getDomain(); - - // 拼接直链地址. + String storageKey = batchGenerateLinkRequest.getStorageKey(); + for (String path : batchGenerateLinkRequest.getPaths()) { + // 拼接全路径地址. String fullPath = StringUtils.concat(path); + + // 生成短链 ShortLink shortLink = shortLinkService.findByStorageKeyAndUrl(storageKey, fullPath); // 如果没有短链,则生成短链 if (shortLink == null) { @@ -84,7 +97,11 @@ public class ShortLinkController { } String shortUrl = StringUtils.removeDuplicateSlashes(domain + "/s/" + shortLink.getShortKey()); - return AjaxJson.getSuccessData(shortUrl); + String pathLink = StringUtils.generatorPathLink(storageKey, fullPath); + + result.add(new BatchGenerateLinkResponse(shortUrl, pathLink)); + } + return AjaxJson.getSuccessData(result); } diff --git a/src/main/java/im/zhaojun/zfile/home/model/request/BatchGenerateLinkRequest.java b/src/main/java/im/zhaojun/zfile/home/model/request/BatchGenerateLinkRequest.java new file mode 100644 index 0000000..ada929b --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/home/model/request/BatchGenerateLinkRequest.java @@ -0,0 +1,24 @@ +package im.zhaojun.zfile.home.model.request; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 批量生成直链请求类 + * @author zhaojun + */ +@Data +@ApiModel(description = "批量生成直链请求类") +public class BatchGenerateLinkRequest { + + @NotBlank(message = "存储源 key 不能为空") + private String storageKey; + + @NotEmpty(message = "生成的文件路径不能为空") + private List paths; + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/home/model/request/operator/BatchDeleteRequest.java b/src/main/java/im/zhaojun/zfile/home/model/request/operator/BatchDeleteRequest.java new file mode 100644 index 0000000..95b7bce --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/home/model/request/operator/BatchDeleteRequest.java @@ -0,0 +1,39 @@ +package im.zhaojun.zfile.home.model.request.operator; + +import im.zhaojun.zfile.home.model.enums.FileTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 删除文件夹请求参数 + * + * @author zhaojun + */ +@Data +@ApiModel(description = "删除文件夹请求类") +public class BatchDeleteRequest { + + @ApiModelProperty(value = "存储源 key", required = true, example = "local") + @NotBlank(message = "存储源 key 不能为空") + private String storageKey; + + @ApiModelProperty(value = "删除的文件详情") + @NotEmpty(message = "要删除的文件/文件夹不能为空") + private List deleteItems; + + @Data + public static class DeleteItem { + + private String name; + + private String path; + + private FileTypeEnum type; + } + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFileRequest.java b/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFileRequest.java deleted file mode 100644 index 1c0cfd6..0000000 --- a/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFileRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package im.zhaojun.zfile.home.model.request.operator; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 删除文件请求参数 - * - * @author zhaojun - */ -@Data -@ApiModel(description = "删除文件请求类") -public class DeleteFileRequest { - - @ApiModelProperty(value = "存储源 key", required = true, example = "local") - @NotBlank(message = "存储源 key 不能为空") - private String storageKey; - - @ApiModelProperty(value = "请求路径", example = "/", notes = "表示在哪个文件夹下删除文件") - @NotBlank(message = "请求路径不能为空") - private String path; - - @ApiModelProperty(value = "删除的文件夹名称", example = "movie") - @NotBlank(message = "删除的文件名称不能为空") - private String name; - -} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFolderRequest.java b/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFolderRequest.java deleted file mode 100644 index 479b7bf..0000000 --- a/src/main/java/im/zhaojun/zfile/home/model/request/operator/DeleteFolderRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package im.zhaojun.zfile.home.model.request.operator; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 删除文件夹请求参数 - * - * @author zhaojun - */ -@Data -@ApiModel(description = "删除文件夹请求类") -public class DeleteFolderRequest { - - @ApiModelProperty(value = "存储源 key", required = true, example = "local") - @NotBlank(message = "存储源 key 不能为空") - private String storageKey; - - @ApiModelProperty(value = "请求路径", example = "/", notes = "表示在哪个文件夹下删除文件夹") - @NotBlank(message = "请求路径不能为空") - private String path; - - @ApiModelProperty(value = "删除的文件夹名称", example = "movie") - @NotBlank(message = "删除的文件夹名称不能为空") - private String name; - -} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/home/model/result/BatchGenerateLinkResponse.java b/src/main/java/im/zhaojun/zfile/home/model/result/BatchGenerateLinkResponse.java new file mode 100644 index 0000000..d75c726 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/home/model/result/BatchGenerateLinkResponse.java @@ -0,0 +1,19 @@ +package im.zhaojun.zfile.home.model.result; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author zhaojun + */ +@Data +@ApiModel(description = "批量生成直链结果类") +@AllArgsConstructor +public class BatchGenerateLinkResponse { + + private String shortLink; + + private String pathLink; + +} \ No newline at end of file