Merge remote-tracking branch 'origin/feature/REQ-3540' into feature/REQ-3540

This commit is contained in:
xudawei 2025-03-12 09:47:37 +08:00
commit 260eb55a17
63 changed files with 1588 additions and 247 deletions

View File

@ -11,9 +11,9 @@ import lombok.Setter;
@Getter
public class DirectoryAttributes {
/**
* 是否为模版文件夹
*/
private boolean isTemplateDir;
/**
* 是否为模版文件夹
*/
private boolean isTemplateDir;
}
}

View File

@ -0,0 +1,7 @@
package cn.axzo.nanopart.doc.api.domain;
/**
* @author yanglin
*/
public class ExtendScopeId {
}

View File

@ -22,4 +22,4 @@ public class FileAttributes {
*/
private String ossFileKey;
}
}

View File

@ -45,4 +45,4 @@ public class IndexNodeAttributes {
return JSON.parseObject(JSON.toJSONString(this), IndexNodeAttributes.class);
}
}
}

View File

@ -1,24 +0,0 @@
package cn.axzo.nanopart.doc.api.domain;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeContext;
/**
* @author yanglin
*/
public interface IndexNodeQueryContext {
default IndexNodeContext context() {
return IndexNodeContext.SYSTEM;
}
default FileScope scope() {
return FileScope.NONE;
}
default Long scopeId() {
return 0L;
}
}

View File

@ -0,0 +1,38 @@
package cn.axzo.nanopart.doc.api.domain;
import cn.axzo.nanopart.doc.api.enums.IndexNodeContext;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
/**
* @author yanglin
*/
public interface IndexNodeScope {
default IndexNodeContext context() {
return IndexNodeContext.SYSTEM;
}
default NodeScope scope() {
return NodeScope.NONE;
}
default Long scopeId() {
return 0L;
}
IndexNodeScope FILE_TEMPLATE_SCOPE = new IndexNodeScope() {
@Override
public IndexNodeContext context() {
return IndexNodeContext.FILE_TEMPLATE;
}
};
IndexNodeScope TEMPLATE_DATABASE_SCOPE = new IndexNodeScope() {
@Override
public IndexNodeContext context() {
return IndexNodeContext.TEMPLATE_DATABASE;
}
};
}

View File

@ -4,7 +4,7 @@ package cn.axzo.nanopart.doc.api.domain;
/**
* @author yanglin
*/
public interface NodeCreate extends IndexNodeQueryContext {
public interface NodeCreate extends IndexNodeScope {
default String parentCode() {
return "";

View File

@ -0,0 +1,14 @@
package cn.axzo.nanopart.doc.api.enums;
/**
* @author yanglin
*/
public enum FileDatabaseType {
NONE,
// 平台资料库
CREATED_BY_SYSTEM,
// 专属资料库
CREATED_BY_USER_FOR_ENT
}

View File

@ -1,16 +0,0 @@
package cn.axzo.nanopart.doc.api.enums;
/**
* @author yanglin
*/
public enum FileScope {
//
NONE,
// 企业数据库
ENT_DATABASE,
// 项目数据库
PROJECT_DATABASE,
// 个人数据库
PERSONAL_DATABASE
}

View File

@ -8,9 +8,11 @@ public enum IndexNodeState {
// 有效的
VALID,
// 已删除
DELETED,
// 复制中, 对外不可见
COPYING
// 放到回收站
MOVED_TO_TRASH,
// 复制中
COPING,
// 创建中
CREATING
}
}

View File

@ -0,0 +1,32 @@
package cn.axzo.nanopart.doc.api.enums;
/**
* @author yanglin
*/
public enum NodeScope {
//
NONE,
// 企业数据库
ENT_DATABASE,
// 项目数据库
PROJECT_DATABASE,
// 个人数据库: 为单位建的
PERSONAL_FOR_ENT;
public FileDatabaseType toFileDatabaseType() {
switch (this) {
case ENT_DATABASE:
case PROJECT_DATABASE:
return FileDatabaseType.CREATED_BY_SYSTEM;
case PERSONAL_FOR_ENT:
return FileDatabaseType.CREATED_BY_USER_FOR_ENT;
default:
return FileDatabaseType.NONE;
}
}
public boolean isNone() {
return this == NONE;
}
}

View File

@ -0,0 +1,54 @@
package cn.axzo.nanopart.doc.api.filedb;
import javax.validation.Valid;
import cn.axzo.nanopart.doc.api.filedb.response.FileDatabaseInfoResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseActiveRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseAddWorkspaceRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseExpandCapacityRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseRemoveRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseSearchRequest;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
/**
* @author yanglin
*/
@FeignClient(name = "nanopart", url = "${axzo.service.nanopart:http://nanopart:8080}")
public interface FileDatabaseApi {
/**
* 添加添加租户
*/
@PostMapping("/api/templateDatabase/createDatabase")
CommonResponse<Void> addWorkspace(@RequestBody @Valid FileDatabaseAddWorkspaceRequest request);
/**
* 开通
*/
@PostMapping("/api/templateDatabase/active")
CommonResponse<Void> addWorkspace(@RequestBody @Valid FileDatabaseActiveRequest request);
/**
* 扩容
*/
@PostMapping("/api/templateDatabase/expandCapacity")
CommonResponse<Void> expandCapacity(@RequestBody @Valid FileDatabaseExpandCapacityRequest request);
/**
* 移除
*/
@PostMapping("/api/templateDatabase/remove")
CommonResponse<Void> remove(@RequestBody @Valid FileDatabaseRemoveRequest request);
/**
* 搜索
*/
@PostMapping("/api/templateDatabase/search")
CommonResponse<Page<FileDatabaseInfoResponse>> search(@RequestBody @Valid FileDatabaseSearchRequest request);
}

View File

@ -0,0 +1,32 @@
package cn.axzo.nanopart.doc.api.filedb.request;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter @Getter
public class FileDatabaseActiveRequest {
/**
* 资料库id
*/
@NotNull(message = "id不能为空")
private Long id;
/**
* 容量, 单位GB
*/
@NotNull(message = "allowedCapacity不能为空")
@Min(1)
private Integer allowedCapacity;
/**
* 过期时间, unix时间戳
*/
@NotNull(message = "expiredDateMs不能为空")
private Long expiredDateMs;
}

View File

@ -0,0 +1,27 @@
package cn.axzo.nanopart.doc.api.filedb.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter @Getter
public class FileDatabaseAddWorkspaceRequest {
/**
* 租户id
*/
@NotNull(message = "workspaceId不能为空")
private Long workspaceId;
/**
* 资料库code
*/
@NotBlank(message = "templateDatabaseCode不能为空")
private String templateDatabaseCode;
}

View File

@ -0,0 +1,12 @@
package cn.axzo.nanopart.doc.api.filedb.request;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class FileDatabaseExpandCapacityRequest extends FileDatabaseActiveRequest {
}

View File

@ -0,0 +1,19 @@
package cn.axzo.nanopart.doc.api.filedb.request;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
/**
* @author yanglin
*/
@Setter @Getter
public class FileDatabaseRemoveRequest {
/**
* 资料库id
*/
@NotNull(message = "id不能为空")
private Long id;
}

View File

@ -0,0 +1,34 @@
package cn.axzo.nanopart.doc.api.filedb.request;
import cn.axzo.nanopart.doc.api.enums.FileDatabaseState;
import cn.axzo.nanopart.doc.api.enums.FileDatabaseType;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter @Getter
public class FileDatabaseSearchRequest {
/**
* 租户名称
*/
private String workspaceName;
/**
* 资料库状态. ACTIVATING: 开通中, ACTIVATED: 已开通, EXPIRED: 已到期
*/
private FileDatabaseState state;
/**
* 资料库类型. CREATED_BY_SYSTEM: 平台资料库, CREATED_BY_USER_FOR_ENT: 专属资料库
*/
private FileDatabaseType type;
/**
* 资料库名称
*/
private String databaseName;
}

View File

@ -0,0 +1,53 @@
package cn.axzo.nanopart.doc.api.filedb.response;
import cn.axzo.nanopart.doc.api.enums.FileDatabaseState;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter @Getter
public class FileDatabaseInfoResponse {
/**
* 资料库id
*/
private Long id;
/**
* 租户id
*/
private Long workspaceId;
/**
* 租户名称
*/
private String workspaceName;
/**
* 状态. ACTIVATING: 开通中, ACTIVATED: 已开通, EXPIRED: 已到期
*/
private FileDatabaseState state;
/**
* 资料库名称
*/
private String fileDatabaseName;
/**
* 过期时间, unix时间戳
*/
private Long expireDateMs;
/**
* 购买容量, 单位GB
*/
private Integer allowedCapacity;
/**
* 已使用的容量, 单位GB
*/
private Integer usedCapacity;
}

View File

@ -1,6 +1,8 @@
package cn.axzo.nanopart.doc.api.filetemplate;
import java.util.List;
import javax.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
@ -10,10 +12,18 @@ import org.springframework.web.bind.annotation.RequestBody;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateDirRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateFileRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateGetFileInfoRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplatePublishRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUpdateFileInfoRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUploadFileRequest;
import cn.axzo.nanopart.doc.api.filetemplate.response.FileTemplateGetFileInfoResponse;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.api.index.request.CopyNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.DeleteNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.GetNodeChildrenRequest;
import cn.axzo.nanopart.doc.api.index.request.IndexNodePageSearchRequest;
import cn.axzo.nanopart.doc.api.index.request.MoveNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.RenameNodeRequest;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
/**
* @author yanglin
@ -35,6 +45,51 @@ public interface FileTemplateApi {
@PostMapping("/api/fileTemplate/createFile")
CommonResponse<String> createFile(@RequestBody @Valid FileTemplateCreateFileRequest request);
/**
* 文件模版: 上传文件
* @return 节点code
*/
@PostMapping("/api/fileTemplate/uploadFile")
CommonResponse<String> uploadFile(@RequestBody @Valid FileTemplateUploadFileRequest request);
/**
* 文件模版: 重新命名
*/
@PostMapping("/api/fileTemplate/rename")
CommonResponse<Void> rename(@RequestBody @Valid RenameNodeRequest request);
/**
* 文件模版: 克隆
* @return 根节点的code
*/
@PostMapping("/api/fileTemplate/copy")
CommonResponse<String> copy(@RequestBody @Valid CopyNodeRequest request);
/**
* 文件模版: 移动
* @return 根节点的code
*/
@PostMapping("/api/fileTemplate/move")
CommonResponse<String> move(@RequestBody @Valid MoveNodeRequest request);
/**
* 文件模版: 删除子树
*/
@PostMapping("/api/fileTemplate/delete")
CommonResponse<Void> delete(@RequestBody @Valid DeleteNodeRequest request);
/**
* 文件模版: 获取子节点
*/
@PostMapping("/api/fileTemplate/getChildren")
CommonResponse<List<IndexNodeInfo>> getChildren(@RequestBody @Valid GetNodeChildrenRequest request);
/**
* 文件模版: 搜索
*/
@PostMapping("/api/fileTemplate/search")
CommonResponse<Page<IndexNodeInfo>> search(@RequestBody @Valid IndexNodePageSearchRequest request);
/**
* 文件模版: 获取文件信息
*/
@ -43,16 +98,9 @@ public interface FileTemplateApi {
@RequestBody @Valid FileTemplateGetFileInfoRequest request);
/**
* 文件模版: 上架到文档市场
* 文件模版: 更新文档信息, 传需要传的字段, 不传的字段不会更新
*/
@PostMapping("/api/fileTemplate/publish")
CommonResponse<Void> publish(@RequestBody @Valid FileTemplatePublishRequest request);
/**
* 文件模版: 上传文件
* @return 节点code
*/
@PostMapping("/api/fileTemplate/uploadFile")
CommonResponse<String> uploadFile(@RequestBody @Valid FileTemplateUploadFileRequest request);
@PostMapping("/api/fileTemplate/updateFileInfo")
CommonResponse<Void> updateFileInfo(@RequestBody @Valid FileTemplateUpdateFileInfoRequest request);
}

View File

@ -2,6 +2,7 @@
package cn.axzo.nanopart.doc.api.filetemplate.request;
import cn.axzo.nanopart.doc.api.util.DefaultIcons;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
@ -17,4 +18,8 @@ public class FileTemplateCreateDirRequest extends NodeCreateFileTemplate {
return DefaultIcons.DIR;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -5,6 +5,7 @@ import javax.validation.constraints.NotNull;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import cn.axzo.nanopart.doc.api.util.DefaultIcons;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
@ -26,4 +27,8 @@ public class FileTemplateCreateFileRequest extends NodeCreateFileTemplate {
return DefaultIcons.defaultFileIcon(format);
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,6 +3,7 @@ package cn.axzo.nanopart.doc.api.filetemplate.request;
import javax.validation.constraints.NotBlank;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
@ -18,4 +19,8 @@ public class FileTemplateGetFileInfoRequest {
@NotBlank(message = "文件模板code不能为空")
private String code;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -4,9 +4,11 @@ package cn.axzo.nanopart.doc.api.filetemplate.request;
import java.math.BigDecimal;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.alibaba.fastjson.JSON;
import cn.axzo.nanopart.doc.api.enums.FileFeeType;
import cn.axzo.nanopart.doc.api.enums.FileTemplateState;
import cn.axzo.nanopart.doc.api.enums.FileVipFeeType;
import cn.axzo.nanopart.doc.api.util.YesOrNo;
import lombok.Getter;
@ -17,7 +19,7 @@ import lombok.Setter;
*/
@Setter
@Getter
public class FileTemplatePublishRequest {
public class FileTemplateUpdateFileInfoRequest {
/**
* 文件节点编码
@ -25,34 +27,38 @@ public class FileTemplatePublishRequest {
@NotBlank(message = "code不能为空")
private String code;
/**
* 状态. DRAFT: 草稿, PUBLISHED: 已发布, DELETED: 已删除
*/
private FileTemplateState state;
/**
* 是否需要付费. YES: , NO:
*/
@NotNull(message = "needFee不能为空")
private YesOrNo needFee;
/**
* 收费模版, ONE_TIME_FEE_PER_PERSON: 用户买断, ONE_TIME_FEE_PER_PROJECT: 按项目买断
*/
@NotNull(message = "feeType不能为空")
private FileFeeType feeType;
/**
* 金额
*/
@NotNull(message = "fee不能为空")
private BigDecimal fee;
/**
* 会员收费方式. VIP_FREE: 会员免费, VIP_DISCOUNT: 会员折扣
*/
@NotNull(message = "vipFeeType不能为空")
private FileVipFeeType vipFeeType;
/**
* 会员费用
*/
@NotNull(message = "vipFee不能为空")
private BigDecimal vipFee;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -2,10 +2,9 @@
package cn.axzo.nanopart.doc.api.filetemplate.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import cn.axzo.nanopart.doc.api.util.DefaultIcons;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
@ -14,23 +13,17 @@ import lombok.Setter;
*/
@Setter
@Getter
public class FileTemplateUploadFileRequest extends NodeCreateFileTemplate {
public class FileTemplateUploadFileRequest extends FileTemplateCreateFileRequest {
/**
* 文件base64
* ossFileKey
*/
@NotBlank(message = "文件base64不能为空")
private String fileBase64;
/**
* 文件格式. EXCEL, WORD, PDF
*/
@NotNull(message = "文件格式不能为空")
private FileFormat format;
@NotBlank(message = "ossFileKey不能为空")
private String ossFileKey;
@Override
public String icon() {
return DefaultIcons.defaultFileIcon(format);
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,8 +3,10 @@ package cn.axzo.nanopart.doc.api.filetemplate.request;
import javax.validation.constraints.NotBlank;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.IndexNodeContext;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import lombok.Getter;
import lombok.Setter;
@ -43,7 +45,17 @@ abstract class NodeCreateFileTemplate implements NodeCreate {
@Override
public final IndexNodeContext context() {
return IndexNodeContext.FILE_TEMPLATE;
return IndexNodeScope.FILE_TEMPLATE_SCOPE.context();
}
@Override
public NodeScope scope() {
return IndexNodeScope.FILE_TEMPLATE_SCOPE.scope();
}
@Override
public Long scopeId() {
return IndexNodeScope.FILE_TEMPLATE_SCOPE.scopeId();
}
@Override

View File

@ -1,10 +1,9 @@
package cn.axzo.nanopart.doc.api.domain;
package cn.axzo.nanopart.doc.api.index;
import cn.axzo.nanopart.doc.api.enums.CooperationAccessOption;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import lombok.Getter;
import lombok.Setter;
@ -43,7 +42,7 @@ public class IndexNodeInfo {
/**
* 作用范围. NONE: , ENT_DATABASE: 企业数据库, PROJECT_DATABASE: 项目数据库, PERSONAL_DATABASE: 个人数据库
*/
private FileScope scope;
private NodeScope scope;
/**
* 作用范围id. 单位数据库存ouId, 项目数据库存workspaceId, 个人数据库存personId
@ -66,13 +65,8 @@ public class IndexNodeInfo {
private String icon;
/**
* 状态. VALID: 有效的, DELETED: 已删除
* 状态. VALID: 有效的
*/
private IndexNodeState state;
/**
* 协作企业可见范围. ALL_ORGS_IN_PROJECT: 项目内所有企业可见, ORGS_BY_COOPERATE_TYPES: 指定参建单位可见
*/
private CooperationAccessOption cooperationAccessOption;
}

View File

@ -0,0 +1,32 @@
package cn.axzo.nanopart.doc.api.index.request;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class CopyNodeRequest {
/**
* 需要拷贝的结点
*/
@NotBlank(message = "code不能为空")
private String code;
/**
* 目标父节点
*/
@NotBlank(message = "destParentCode不能为空")
private String destParentCode;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,27 @@
package cn.axzo.nanopart.doc.api.index.request;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class DeleteNodeRequest {
/**
* 需要删除的()结点
*/
@NotBlank(message = "code不能为空")
private String code;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,24 @@
package cn.axzo.nanopart.doc.api.index.request;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class GetNodeChildrenRequest {
/**
* 父节点code
*/
private String parentCode;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,36 @@
package cn.axzo.nanopart.doc.api.index.request;
import java.util.Set;
import javax.validation.constraints.NotBlank;
import cn.axzo.basics.common.page.PageRequest;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class IndexNodePageSearchRequest extends PageRequest {
/**
* 名称
*/
@NotBlank(message = "名称不能为空")
private String name;
/**
* 搜索类型, 不指定就搜索所有类型, DIRECTORY: 目录, FILE: 文件
*/
private Set<IndexNodeType> nodeTypes;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,32 @@
package cn.axzo.nanopart.doc.api.index.request;
import javax.validation.constraints.NotBlank;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class MoveNodeRequest {
/**
* 需要拷贝的结点
*/
@NotBlank(message = "code不能为空")
private String code;
/**
* 目标父节点
*/
@NotBlank(message = "destParentCode不能为空")
private String destParentCode;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,33 @@
package cn.axzo.nanopart.doc.api.index.request;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class RenameNodeRequest {
/**
* 节点编码
*/
@NotBlank(message = "节点编码不能为空")
private String code;
/**
* 新名称
*/
@NotBlank(message = "新名称不能为空")
private String newName;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,115 @@
package cn.axzo.nanopart.doc.api.templatedb;
import java.util.List;
import javax.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.api.index.request.CopyNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.DeleteNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.GetNodeChildrenRequest;
import cn.axzo.nanopart.doc.api.index.request.IndexNodePageSearchRequest;
import cn.axzo.nanopart.doc.api.index.request.MoveNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.RenameNodeRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateDatabaseRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateDirRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateFileRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseGetDatabaseOrDirInfoRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseUpdateDatabaseOrDirInfoRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseUploadFileRequest;
import cn.axzo.nanopart.doc.api.templatedb.response.TemplateDatabaseGetDatabaseOrDirInfoResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
/**
* @author yanglin
*/
@FeignClient(name = "nanopart", url = "${axzo.service.nanopart:http://nanopart:8080}")
public interface TemplateDatabaseApi {
/**
* 项企资料库: 创建资料库
* @return 节点code
*/
@PostMapping("/api/templateDatabase/createDatabase")
CommonResponse<String> createDatabase(@RequestBody @Valid TemplateDatabaseCreateDatabaseRequest request);
/**
* 项企资料库: 创建新文件夹/空间
* @return 节点code
*/
@PostMapping("/api/templateDatabase/createDir")
CommonResponse<String> createDir(@RequestBody @Valid TemplateDatabaseCreateDirRequest request);
/**
* 项企资料库: 创建新文件
* @return 节点code
*/
@PostMapping("/api/templateDatabase/createFile")
CommonResponse<String> createFile(@RequestBody @Valid TemplateDatabaseCreateFileRequest request);
/**
* 项企资料库: 上传文件
* @return 节点code
*/
@PostMapping("/api/templateDatabase/uploadFile")
CommonResponse<String> uploadFile(@RequestBody @Valid TemplateDatabaseUploadFileRequest request);
/**
* 项企资料库: 重新命名
*/
@PostMapping("/api/templateDatabase/rename")
CommonResponse<Void> rename(@RequestBody @Valid RenameNodeRequest request);
/**
* 项企资料库: 克隆
* @return 根节点的code
*/
@PostMapping("/api/templateDatabase/copy")
CommonResponse<String> copy(@RequestBody @Valid CopyNodeRequest request);
/**
* 项企资料库: 移动
* @return 根节点的code
*/
@PostMapping("/api/templateDatabase/move")
CommonResponse<String> move(@RequestBody @Valid MoveNodeRequest request);
/**
* 项企资料库: 删除子树
*/
@PostMapping("/api/templateDatabase/delete")
CommonResponse<Void> delete(@RequestBody @Valid DeleteNodeRequest request);
/**
* 项企资料库: 获取子节点
*/
@PostMapping("/api/templateDatabase/getChildren")
CommonResponse<List<IndexNodeInfo>> getChildren(@RequestBody @Valid GetNodeChildrenRequest request);
/**
* 项企资料库: 搜索
*/
@PostMapping("/api/templateDatabase/search")
CommonResponse<Page<IndexNodeInfo>> search(@RequestBody @Valid IndexNodePageSearchRequest request);
/**
* 项企资料库: 获取资料库或文件夹信息
*/
@PostMapping("/api/templateDatabase/getDatabaseOrDirInfo")
CommonResponse<TemplateDatabaseGetDatabaseOrDirInfoResponse> getDatabaseOrDirInfo(
@RequestBody @Valid TemplateDatabaseGetDatabaseOrDirInfoRequest request);
/**
* 项企资料库: 更新资料库或文件夹信息
*/
@PostMapping("/api/templateDatabase/updateDatabaseOrDirInfo")
CommonResponse<Void> updateDatabaseOrDirInfo(
@RequestBody @Valid TemplateDatabaseUpdateDatabaseOrDirInfoRequest request);
}

View File

@ -0,0 +1,27 @@
package cn.axzo.nanopart.doc.api.templatedb.domain;
/**
* @author yanglin
*/
public class DatabaseOrDirInfo {
/**
* 名称
*/
private String name;
/**
* 编码
*/
private String bizCode;
/**
* 描述信息
*/
private String description;
/**
* 图标
*/
private String icon;
}

View File

@ -0,0 +1,30 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.constraints.NotBlank;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.CooperationAccessOption;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseCreateDatabaseRequest extends TemplateDatabaseCreateDirRequest implements NodeCreate {
/**
* 归属. ENT_DATABASE: 企业数据库, PROJECT_DATABASE: 项目数据库
*/
@NotBlank(message = "scope不能为空")
private NodeScope scope;
/**
* 协作模版. ALL_ORGS_IN_PROJECT: 项目内所有企业可见, ORGS_BY_COOPERATE_TYPES: 指定参建单位可见
*/
private CooperationAccessOption accessOption;
}

View File

@ -0,0 +1,54 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.constraints.NotBlank;
import cn.axzo.nanopart.doc.api.enums.CooperationAccessOption;
import org.apache.commons.lang3.StringUtils;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseCreateDirRequest {
/**
* 名称
*/
@NotBlank(message = "name不能为空")
private String name;
/**
* 编码
*/
@NotBlank(message = "bizCode不能为空")
private String bizCode;
/**
* 描述信息
*/
private String description;
/**
* 图标
*/
@NotBlank(message = "icon不能为空")
private String icon;
public String icon() {
return StringUtils.isBlank(icon) ? "" : icon;
}
public String bizCode() {
return StringUtils.isBlank(bizCode) ? "" : bizCode;
}
public String description() {
return StringUtils.isBlank(description) ? "" : description;
}
}

View File

@ -0,0 +1,35 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseCreateFileRequest {
/**
* 父节点code
*/
private String parentCode;
/**
* 节点名称(文件夹/文件)不能为空
*/
@NotBlank(message = "节点名称不能为空")
private String name;
/**
* 文件格式. EXCEL, WORD, PDF
*/
@NotNull(message = "文件格式不能为空")
private FileFormat format;
}

View File

@ -0,0 +1,22 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseGetDatabaseOrDirInfoRequest {
/**
* 编码
*/
@NotBlank(message = "code不能为空")
private String code;
}

View File

@ -0,0 +1,40 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import cn.axzo.nanopart.doc.api.domain.DatabaseAccessConfig;
import cn.axzo.nanopart.doc.api.domain.DatabaseFeeConfig;
import cn.axzo.nanopart.doc.api.templatedb.domain.DatabaseOrDirInfo;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseUpdateDatabaseOrDirInfoRequest {
/**
* 节点编码
*/
@NotBlank(message = "code不能为空")
private String code;
/**
* 基础信息, 传了就更新
*/
private DatabaseOrDirInfo databaseOrDirInfo;
/**
* 如果是空间的话, 空间的费用配置, 传了就更新
*/
private DatabaseFeeConfig feeConfig;
/**
* 如果是空间的话, 空间的安全管理配置, 传了就更新
*/
private DatabaseAccessConfig accessConfig;
}

View File

@ -0,0 +1,22 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseUploadFileRequest extends TemplateDatabaseCreateFileRequest {
/**
* ossFileKey
*/
@NotBlank(message = "ossFileKey不能为空")
private String ossFileKey;
}

View File

@ -0,0 +1,43 @@
package cn.axzo.nanopart.doc.api.templatedb.response;
import cn.axzo.nanopart.doc.api.domain.DatabaseAccessConfig;
import cn.axzo.nanopart.doc.api.domain.DatabaseFeeConfig;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.templatedb.domain.DatabaseOrDirInfo;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class TemplateDatabaseGetDatabaseOrDirInfoResponse {
/**
* 节点类型. DATABASE: 空间(数据库), DIRECTORY: 目录, FILE: 文件
*/
private IndexNodeType nodeType;
/**
* 范围, 可以直接显示的名称
*/
private String readableScope;
/**
* 基础信息
*/
private DatabaseOrDirInfo databaseOrDirInfo;
/**
* 如果是空间的话, 空间的费用配置
*/
private DatabaseFeeConfig feeConfig;
/**
* 如果是空间的话, 空间的安全管理配置
*/
private DatabaseAccessConfig accessConfig;
}

View File

@ -1,6 +1,8 @@
package cn.axzo.nanopart.doc.dao;
import java.util.Collection;
import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -15,7 +17,7 @@ import cn.axzo.nanopart.doc.mapper.FileTemplateMapper;
@Repository
public class FileTemplateDao extends ServiceImpl<FileTemplateMapper, FileTemplate> {
public FileTemplate findOrThrow(String code) {
public FileTemplate getOrThrow(String code) {
FileTemplate template = findOrNull(code);
BizAssertions.assertNotNull(template, "文件模板不存在: {}", code);
return template;
@ -27,4 +29,9 @@ public class FileTemplateDao extends ServiceImpl<FileTemplateMapper, FileTemplat
.one();
}
public void deleteByCodes(Collection<String> codes) {
if (codes == null)
return;
lambdaUpdate().in(FileTemplate::getCode, codes).remove();
}
}

View File

@ -1,13 +1,18 @@
package cn.axzo.nanopart.doc.dao;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.axzo.nanopart.doc.api.domain.IndexNodeQueryContext;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.api.util.BizAssertions;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.mapper.IndexNodeMapper;
@ -50,13 +55,8 @@ public class IndexNodeDao extends ServiceImpl<IndexNodeMapper, IndexNode> {
.update();
}
public IndexNode findChildByName(IndexNodeQueryContext nodeContext, String parentCode, String name) {
return lambdaQuery() //
.nested(StringUtils.isBlank(parentCode), nested -> { //
nested.eq(IndexNode::getContext, nodeContext.context()) //
.eq(IndexNode::getScope, nodeContext.scope()) //
.eq(IndexNode::getScopeId, nodeContext.scopeId()).eq(IndexNode::getParentCode, "");
}) //
public IndexNode findChildByName(IndexNodeScope nodeScope, String parentCode, String name) {
return parentOrScopeQuery(nodeScope, parentCode) //
.eq(IndexNode::getParentCode, parentCode) //
.eq(IndexNode::getName, name) //
.last("limit 1") //
@ -77,4 +77,35 @@ public class IndexNodeDao extends ServiceImpl<IndexNodeMapper, IndexNode> {
.update();
}
}
public List<IndexNode> collectSubtree(String code) {
return lambdaQuery() //
.likeRight(IndexNode::getPath, code) //
.list();
}
public void deleteSubtree(String code) {
lambdaUpdate() //
.likeRight(IndexNode::getPath, code) //
.update();
}
public List<IndexNode> collectChildren(IndexNodeScope nodeScope, String parentCode, IndexNodeState... states) {
return parentOrScopeQuery(nodeScope, parentCode) //
.in(states.length > 0, IndexNode::getState, Arrays.asList(states)) //
.list();
}
private LambdaQueryChainWrapper<IndexNode> parentOrScopeQuery(IndexNodeScope nodeScope, String parentCode) {
if (StringUtils.isBlank(parentCode))
return scopeQuery(nodeScope);
return lambdaQuery().eq(IndexNode::getParentCode, parentCode);
}
private LambdaQueryChainWrapper<IndexNode> scopeQuery(IndexNodeScope nodeScope) {
return lambdaQuery() //
.eq(IndexNode::getContext, nodeScope.context()) //
.eq(IndexNode::getScope, nodeScope.scope()) //
.eq(IndexNode::getScopeId, nodeScope.scopeId()).eq(IndexNode::getParentCode, "");
}
}

View File

@ -2,6 +2,7 @@
package cn.axzo.nanopart.doc.entity;
import cn.axzo.pudge.core.persistence.BaseEntity;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
@ -19,4 +20,8 @@ public class DocLock extends BaseEntity<DocLock> {
*/
private String key;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,10 +3,13 @@ package cn.axzo.nanopart.doc.entity;
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.axzo.nanopart.doc.api.domain.ExtendScopeId;
import cn.axzo.nanopart.doc.api.enums.FileDatabaseState;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.FileDatabaseType;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import cn.axzo.nanopart.doc.api.util.YesOrNo;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import lombok.Getter;
@ -35,16 +38,26 @@ public class FileDatabase extends BaseEntity<FileDatabase> {
*/
private String templateDatabaseCode;
/**
* 资料库类型. CREATED_BY_SYSTEM: 平台资料库, CREATED_BY_USER_FOR_ENT: 专属资料库
*/
private FileDatabaseType type;
/**
* 作用范围. NONE: , ENT_DATABASE: 企业数据库, PROJECT_DATABASE: 项目数据库, PERSONAL_DATABASE: 个人数据库
*/
private FileScope scope;
private NodeScope scope;
/**
* 作用范围id. 单位数据库存ouId, 项目数据库存workspaceId, 个人数据库存personId
*/
private Long scopeId;
/**
* 存更多的scope相关的信息
*/
private ExtendScopeId extendScopeId;
/**
* 状态. ACTIVATING: 开通中, ACTIVATED: 已开通, EXPIRED: 已到期
*/
@ -70,4 +83,8 @@ public class FileDatabase extends BaseEntity<FileDatabase> {
*/
private Integer usedCapacity;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,6 +3,7 @@ package cn.axzo.nanopart.doc.entity;
import java.math.BigDecimal;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.axzo.nanopart.doc.api.enums.FileFeeType;
@ -55,4 +56,9 @@ public class FileTemplate extends BaseEntity<FileTemplate> {
* 会员费用
*/
private BigDecimal vipFee;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -1,16 +1,18 @@
package cn.axzo.nanopart.doc.entity;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import cn.axzo.maokai.api.vo.response.tree.NodeValue;
import cn.axzo.nanopart.doc.api.domain.IndexNodeAttributes;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeContext;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import cn.axzo.nanopart.doc.api.util.UUIDUtil;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import lombok.Getter;
@ -22,7 +24,7 @@ import lombok.Setter;
@Setter
@Getter
@TableName(value = "doc_index_node", autoResultMap = true)
public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate, NodeValue {
public static final String ROOT_CODE = "";
@ -30,6 +32,11 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
return UUIDUtil.uuidString();
}
/**
* 爷节点id
*/
private Long parentId;
/**
* 父节点code
*/
@ -63,7 +70,7 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
/**
* 作用范围. NONE: , ENT_DATABASE: 企业数据库, PROJECT_DATABASE: 项目数据库, PERSONAL_DATABASE: 个人数据库
*/
private FileScope scope;
private NodeScope scope;
/**
* 作用范围id. 单位数据库存ouId, 项目数据库存workspaceId, 个人数据库存personId
@ -107,6 +114,10 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
return attributes;
}
public boolean isFile() {
return nodeType == IndexNodeType.FILE;
}
@Override
public String parentCode() {
return parentCode;
@ -143,7 +154,7 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
}
@Override
public FileScope scope() {
public NodeScope scope() {
return scope;
}
@ -152,4 +163,23 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeCreate {
return scopeId;
}
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
@Override
public Long id() {
return id;
}
@Override
public Long parentId() {
return parentId;
}
@Override
public boolean isValueRoot() {
return parentId == 0;
}
}

View File

@ -1,9 +1,10 @@
package cn.axzo.nanopart.doc.entity;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.NodeScope;
import cn.axzo.nanopart.doc.api.domain.DatabaseAccessConfig;
import cn.axzo.nanopart.doc.api.domain.DatabaseFeeConfig;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
@ -28,7 +29,7 @@ public class TemplateDatabase extends BaseEntity<TemplateDatabase> {
/**
* 作用范围. NONE: , ENT_DATABASE: 企业数据库, PROJECT_DATABASE: 项目数据库, PERSONAL_DATABASE: 个人数据库
*/
private FileScope scope;
private NodeScope scope;
/**
* 费用配置
@ -42,4 +43,8 @@ public class TemplateDatabase extends BaseEntity<TemplateDatabase> {
@TableField(typeHandler = FastjsonTypeHandler.class)
private DatabaseAccessConfig accessConfig;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,18 @@
package cn.axzo.nanopart.doc.file;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@Component
@RequiredArgsConstructor
public class FileBroadcaster {
public void fireRenameOssFileEvent(String indexNodeCode) {
// TODO(yl): finish this
}
}

View File

@ -0,0 +1,52 @@
package cn.axzo.nanopart.doc.file.filedb;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseActiveRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseAddWorkspaceRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseExpandCapacityRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseRemoveRequest;
import cn.axzo.nanopart.doc.api.filedb.request.FileDatabaseSearchRequest;
import cn.axzo.nanopart.doc.api.filedb.response.FileDatabaseInfoResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
import org.springframework.web.bind.annotation.RestController;
import cn.axzo.nanopart.doc.api.filedb.FileDatabaseApi;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* @author yanglin
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class FileDatabaseApiController implements FileDatabaseApi {
private final FileDatabaseManager fileDatabaseManager;
@Override
public CommonResponse<Void> addWorkspace(FileDatabaseAddWorkspaceRequest request) {
return null;
}
@Override
public CommonResponse<Void> addWorkspace(FileDatabaseActiveRequest request) {
return null;
}
@Override
public CommonResponse<Void> expandCapacity(FileDatabaseExpandCapacityRequest request) {
return null;
}
@Override
public CommonResponse<Void> remove(FileDatabaseRemoveRequest request) {
return null;
}
@Override
public CommonResponse<Page<FileDatabaseInfoResponse>> search(FileDatabaseSearchRequest request) {
return null;
}
}

View File

@ -0,0 +1,12 @@
package cn.axzo.nanopart.doc.file.filedb;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author yanglin
*/
@Component
@RequiredArgsConstructor
public class FileDatabaseManager {
}

View File

@ -1,18 +1,33 @@
package cn.axzo.nanopart.doc.file.filetemplate;
import java.util.List;
import org.springframework.web.bind.annotation.RestController;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.filetemplate.FileTemplateApi;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateDirRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateFileRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateGetFileInfoRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplatePublishRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUpdateFileInfoRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUploadFileRequest;
import cn.axzo.nanopart.doc.api.filetemplate.response.FileTemplateGetFileInfoResponse;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.api.index.request.CopyNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.DeleteNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.GetNodeChildrenRequest;
import cn.axzo.nanopart.doc.api.index.request.IndexNodePageSearchRequest;
import cn.axzo.nanopart.doc.api.index.request.MoveNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.RenameNodeRequest;
import cn.axzo.nanopart.doc.entity.FileTemplate;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.axzo.nanopart.doc.file.index.IndexQueryService;
import cn.axzo.nanopart.doc.file.index.domain.IndexNodes;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -25,6 +40,8 @@ import lombok.extern.slf4j.Slf4j;
public class FileTemplateApiController implements FileTemplateApi {
private final FileTemplateManager fileTemplateManager;
private final IndexManager indexManager;;
private final IndexQueryService indexQueryService;
@Override
public CommonResponse<String> createDir(FileTemplateCreateDirRequest request) {
@ -38,6 +55,56 @@ public class FileTemplateApiController implements FileTemplateApi {
return CommonResponse.success(fileTemplateManager.createFile(request));
}
@Override
public CommonResponse<String> uploadFile(FileTemplateUploadFileRequest request) {
log.info("upload file request:{}", request);
return CommonResponse.success(fileTemplateManager.uploadFile(request));
}
@Override
public CommonResponse<Void> rename(RenameNodeRequest request) {
log.info("rename request:{}", request);
indexManager.rename(request.getCode(), request.getNewName());
return CommonResponse.success();
}
@Override
public CommonResponse<String> copy(CopyNodeRequest request) {
log.info("copy request:{}", request);
IndexNode indexNode = indexManager.copy(request.getCode(), request.getDestParentCode());
return CommonResponse.success(indexNode.getCode());
}
@Override
public CommonResponse<String> move(MoveNodeRequest request) {
log.info("move request:{}", request);
IndexNode indexNode = indexManager.move(request.getCode(), request.getDestParentCode());
return CommonResponse.success(indexNode.getCode());
}
@Override
public CommonResponse<Void> delete(DeleteNodeRequest request) {
log.info("delete request:{}", request);
fileTemplateManager.delete(request);
return CommonResponse.success();
}
@Override
public CommonResponse<List<IndexNodeInfo>> getChildren(GetNodeChildrenRequest request) {
log.info("getChildren request:{}", request);
List<IndexNode> children = indexQueryService.getChildren(IndexNodeScope.FILE_TEMPLATE_SCOPE,
request.getParentCode());
return CommonResponse.success(IndexNodes.wrap(children).toIndexNodeInfos());
}
@Override
public CommonResponse<Page<IndexNodeInfo>> search(IndexNodePageSearchRequest request) {
log.info("search request:{}", request);
Page<IndexNode> page = indexQueryService.search(IndexNodeScope.FILE_TEMPLATE_SCOPE, request);
return CommonResponse.success(Page.toPage(page.getPageNum(), page.getPageSize(), page.getTotalElements(),
IndexNodes.wrap(page.getList()).toIndexNodeInfos()));
}
@Override
public CommonResponse<FileTemplateGetFileInfoResponse> getFileInfo(FileTemplateGetFileInfoRequest request) {
FileTemplate fileTemplate = fileTemplateManager.findOrNull(request.getCode());
@ -47,15 +114,10 @@ public class FileTemplateApiController implements FileTemplateApi {
}
@Override
public CommonResponse<Void> publish(FileTemplatePublishRequest request) {
log.info("publish request:{}", request);
fileTemplateManager.publish(request);
public CommonResponse<Void> updateFileInfo(FileTemplateUpdateFileInfoRequest request) {
log.info("updateFileInfo request:{}", request);
fileTemplateManager.updateFileInfo(request);
return CommonResponse.success();
}
@Override
public CommonResponse<String> uploadFile(FileTemplateUploadFileRequest request) {
log.info("upload file request:{}", request);
return CommonResponse.success(fileTemplateManager.uploadFile(request));
}
}

View File

@ -5,15 +5,19 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import cn.axzo.nanopart.doc.api.enums.FileTemplateState;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateDirRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateCreateFileRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplatePublishRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUpdateFileInfoRequest;
import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateUploadFileRequest;
import cn.axzo.nanopart.doc.api.index.request.DeleteNodeRequest;
import cn.axzo.nanopart.doc.dao.FileTemplateDao;
import cn.axzo.nanopart.doc.entity.FileTemplate;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.axzo.nanopart.doc.file.index.OssFile;
import cn.axzo.nanopart.doc.file.index.domain.IndexNodes;
import cn.axzo.nanopart.doc.file.index.domain.OssFile;
import cn.axzo.nanopart.doc.utils.BizTransactional;
import lombok.RequiredArgsConstructor;
/**
@ -36,9 +40,9 @@ public class FileTemplateManager {
return transactionTemplate.execute(unused -> createFileTemplate(indexManager.createFile(request, ossFile)));
}
@BizTransactional
public String uploadFile(FileTemplateUploadFileRequest request) {
OssFile ossFile = indexManager.uploadFile(request, request.getFormat(), request.getFileBase64());
return transactionTemplate.execute(unused -> createFileTemplate(indexManager.createFile(request, ossFile)));
return createFileTemplate(indexManager.uploadFile(request, request.getFormat(), request.getOssFileKey()));
}
private String createFileTemplate(IndexNode fileNode) {
@ -49,20 +53,26 @@ public class FileTemplateManager {
return fileNode.getCode();
}
@BizTransactional
public void delete(DeleteNodeRequest request) {
IndexNodes nodes = IndexNodes.wrap(indexManager.delete(request.getCode()));
fileTemplateDao.deleteByCodes(nodes.collectCodes(IndexNodeType.FILE));
}
public FileTemplate findOrNull(String code) {
return fileTemplateDao.findOrNull(code);
}
public void publish(FileTemplatePublishRequest request) {
FileTemplate fileTemplate = fileTemplateDao.findOrThrow(request.getCode());
public void updateFileInfo(FileTemplateUpdateFileInfoRequest request) {
FileTemplate fileTemplate = fileTemplateDao.getOrThrow(request.getCode());
fileTemplateDao.lambdaUpdate() //
.eq(FileTemplate::getId, fileTemplate.getId()) //
.set(FileTemplate::getNeedFee, request.getNeedFee()) //
.set(FileTemplate::getFeeType, request.getFeeType()) //
.set(FileTemplate::getFee, request.getFee()) //
.set(FileTemplate::getVipFeeType, request.getVipFeeType()) //
.set(FileTemplate::getVipFee, request.getVipFee()) //
.set(FileTemplate::getState, FileTemplateState.PUBLISHED) //
.set(request.getNeedFee() != null, FileTemplate::getNeedFee, request.getNeedFee()) //
.set(request.getFeeType() != null, FileTemplate::getFeeType, request.getFeeType()) //
.set(request.getFee() != null, FileTemplate::getFee, request.getFee()) //
.set(request.getVipFeeType() != null, FileTemplate::getVipFeeType, request.getVipFeeType()) //
.set(request.getVipFee() != null, FileTemplate::getVipFee, request.getVipFee()) //
.set(request.getState() != null, FileTemplate::getState, request.getState()) //
.update();
}
}
}

View File

@ -8,19 +8,23 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.util.BizAssertions;
import cn.axzo.nanopart.doc.config.DocProps;
import cn.axzo.nanopart.doc.dao.IndexNodeDao;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.file.FileBroadcaster;
import cn.axzo.nanopart.doc.file.index.domain.NameUsedException;
import cn.axzo.nanopart.doc.file.index.domain.OssFile;
import cn.axzo.nanopart.doc.integration.OssClient;
import cn.axzo.nanopart.doc.utils.BizTransactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* @author yanglin
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class IndexManager {
@ -29,19 +33,20 @@ public class IndexManager {
private final IndexNodeDao indexNodeDao;
private final OssClient ossClient;
private final DocProps docProps;
private final FileBroadcaster fileBroadcaster;
@BizTransactional
public IndexNode createDatabase(NodeCreate node) {
indexSupport.lockParentAndReleaseOnCommit(node);
indexSupport.ensureChildNameNotUsed(node);
return indexSupport.createNode(node, IndexNodeType.DATABASE, IndexNodeState.VALID);
return indexSupport.createNode(node, IndexNodeType.DATABASE);
}
@BizTransactional
public IndexNode createDir(NodeCreate node) {
indexSupport.lockParentAndReleaseOnCommit(node);
indexSupport.ensureChildNameNotUsed(node);
return indexSupport.createNode(node, IndexNodeType.DIRECTORY, IndexNodeState.VALID);
return indexSupport.createNode(node, IndexNodeType.DIRECTORY);
}
/**
@ -55,17 +60,15 @@ public class IndexManager {
? docProps.getEmptyWordOssFileKey() //
: docProps.getEmptyExcelFileKey();
String code = IndexNode.newCode();
return new OssFile(format, code, ossClient.copy(emptyOssFileKey, code, format));
return new OssFile(format, code, ossClient.copy(emptyOssFileKey, format, node.name()));
}
/**
* 不能在事务中使用
*/
public OssFile uploadFile(NodeCreate node, FileFormat format, String fileBase64) {
BizAssertions.assertFalse(TransactionSynchronizationManager.isActualTransactionActive(), "不能在事务中使用");
@BizTransactional
public IndexNode uploadFile(NodeCreate node, FileFormat format, String ossFileKey) {
indexSupport.ensureChildNameNotUsed(node);
String code = IndexNode.newCode();
return new OssFile(format, code, ossClient.upload(fileBase64, code, format));
OssFile ossFile = new OssFile(format, code, ossFileKey);
return createFile(node, ossFile);
}
@BizTransactional
@ -75,10 +78,10 @@ public class IndexManager {
indexSupport.ensureChildNameNotUsed(node);
}
catch (NameUsedException e) {
ossClient.safeDelete(ossFile.ossFileKey());
ossClient.asyncDelete(ossFile.ossFileKey());
throw e;
}
IndexNode fileNode = indexSupport.createNode(ossFile.code(), node, IndexNodeType.FILE, IndexNodeState.VALID);
IndexNode fileNode = indexSupport.createNode(ossFile.code(), node, IndexNodeType.FILE);
fileNode.getOrCreateAttributes().getOrCreateFileAttributes().setOssFileKey(ossFile.ossFileKey());
fileNode.getOrCreateAttributes().getOrCreateFileAttributes().setFileFormat(ossFile.format());
indexNodeDao.updateAttributes(fileNode);
@ -89,16 +92,27 @@ public class IndexManager {
public void rename(String code, String newName) {
IndexNode indexNode = indexNodeDao.getNodeOrThrow(code);
indexSupport.lockParentAndReleaseOnCommit(indexNode);
if (indexNode.name().equals(newName))
return;
indexSupport.ensureChildNameNotUsed(indexNode, indexNode.getParentCode(), newName);
indexNodeDao.rename(code, newName);
if (indexNode.isFile())
fileBroadcaster.fireRenameOssFileEvent(code);
}
public IndexNode copy(String copyCode, String destParentCode) {
return null;
}
@BizTransactional
public List<IndexNode> delete(String code) {
List<IndexNode> subtree = indexNodeDao.collectSubtree(code);
indexNodeDao.deleteSubtree(code);
return subtree;
}
public IndexNode copy(String node, String destParentCode) {
return null;
}
}
public IndexNode move(String node, String destParentCode) {
return null;
}
}

View File

@ -0,0 +1,34 @@
package cn.axzo.nanopart.doc.file.index;
import java.util.List;
import org.springframework.stereotype.Service;
import cn.axzo.nanopart.doc.api.index.request.IndexNodePageSearchRequest;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.dao.IndexNodeDao;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.azxo.framework.common.model.Page;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@Service
@RequiredArgsConstructor
public class IndexQueryService {
private final IndexNodeDao indexNodeDao;
public List<IndexNode> getChildren(IndexNodeScope nodeScope, String parentCode, IndexNodeState... states) {
return indexNodeDao.collectChildren(nodeScope, parentCode, states);
}
public Page<IndexNode> search(IndexNodeScope nodeScope, IndexNodePageSearchRequest search) {
//todo valid state
return null;
}
}

View File

@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import cn.axzo.nanopart.doc.api.domain.IndexNodeQueryContext;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.IndexNodeState;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
@ -16,6 +16,7 @@ import cn.axzo.nanopart.doc.api.util.UUIDUtil;
import cn.axzo.nanopart.doc.dao.DocLockDao;
import cn.axzo.nanopart.doc.dao.IndexNodeDao;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.file.index.domain.NameUsedException;
import lombok.RequiredArgsConstructor;
/**
@ -28,11 +29,12 @@ class IndexSupport {
private final IndexNodeDao indexNodeDao;
private final DocLockDao docLockDao;
IndexNode createNode(NodeCreate node, IndexNodeType nodeType, IndexNodeState state) {
return createNode(UUIDUtil.uuidString(), node, nodeType, state);
IndexNode createNode(NodeCreate node, IndexNodeType nodeType) {
return createNode(UUIDUtil.uuidString(), node, nodeType);
}
IndexNode createNode(String code, NodeCreate node, IndexNodeType nodeType, IndexNodeState state) {
IndexNode createNode(String code, NodeCreate node, IndexNodeType nodeType) {
// TODO(yl): 检查子节点数量
IndexNode parent = null;
if (StringUtils.isNotBlank(node.parentCode())) {
parent = indexNodeDao.getNodeOrThrow(node.parentCode());
@ -43,6 +45,7 @@ class IndexSupport {
node.parentCode());
}
IndexNode child = new IndexNode();
child.setParentId(parent == null ? 0L : parent.getParentId());
child.setParentCode(parent == null ? IndexNode.ROOT_CODE : parent.getCode());
child.setCode(code);
child.setName(node.name());
@ -67,8 +70,8 @@ class IndexSupport {
ensureChildNameNotUsed(nodeCreate, nodeCreate.parentCode(), nodeCreate.name());
}
void ensureChildNameNotUsed(IndexNodeQueryContext nodeContext, String parentCode, String childName) {
IndexNode child = indexNodeDao.findChildByName(nodeContext, parentCode, childName);
void ensureChildNameNotUsed(IndexNodeScope nodeScope, String parentCode, String childName) {
IndexNode child = indexNodeDao.findChildByName(nodeScope, parentCode, childName);
if (child != null)
throw new NameUsedException("名称已被使用");
}
@ -77,20 +80,18 @@ class IndexSupport {
lockParentAndReleaseOnCommit(node, node.parentCode());
}
void lockParentAndReleaseOnCommit(IndexNodeQueryContext nodeContext, String parentCode) {
void lockParentAndReleaseOnCommit(IndexNodeScope nodeScope, String parentCode) {
BizAssertions.assertTrue(TransactionSynchronizationManager.isActualTransactionActive(), "必须和事务搭配使用");
// 如果父节点存在就锁父节点
if (StringUtils.isNotBlank(parentCode)) {
indexNodeDao.getNodeForUpdateOrThrow(parentCode);
return;
}
// 如果父节点不存在就锁scope
docLockDao.lockAndReleaseOnCommit(idbuilder() //
.append("INDEX_NODE") //
.append(nodeContext.context()) //
.append(nodeContext.scope()) //
.append(nodeContext.scopeId()) //
.append(nodeScope.context()) //
.append(nodeScope.scope()) //
.append(nodeScope.scopeId()) //
.build());
}
}
}

View File

@ -1,66 +0,0 @@
package cn.axzo.nanopart.doc.file.index;
import cn.axzo.nanopart.doc.api.domain.IndexNodeAttributes;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import cn.axzo.nanopart.doc.api.enums.FileScope;
import cn.axzo.nanopart.doc.api.enums.IndexNodeContext;
import cn.axzo.nanopart.doc.entity.IndexNode;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@RequiredArgsConstructor
public class NodeCreateCopy implements NodeCreate {
private final IndexNode copyNode;
private final String destParentCode;
private final String name;
@Override
public String parentCode() {
return destParentCode;
}
@Override
public String bizCode() {
return copyNode.getBizCode();
}
@Override
public String name() {
return name;
}
@Override
public String description() {
return copyNode.getDescription();
}
@Override
public String icon() {
return copyNode.icon();
}
@Override
public IndexNodeAttributes attributes() {
return copyNode.getOrCreateAttributes().copy();
}
@Override
public IndexNodeContext context() {
return copyNode.getContext();
}
@Override
public FileScope scope() {
return copyNode.getScope();
}
@Override
public Long scopeId() {
return copyNode.getScopeId();
}
}

View File

@ -0,0 +1,40 @@
package cn.axzo.nanopart.doc.file.index.domain;
import static java.util.stream.Collectors.toList;
import java.util.Collections;
import java.util.List;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.nanopart.doc.api.enums.IndexNodeType;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.entity.IndexNode;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class IndexNodes {
private final List<IndexNode> indexNodes;
public static IndexNodes wrap(List<IndexNode> indexNodes) {
return new IndexNodes(indexNodes);
}
public List<String> collectCodes(IndexNodeType nodeType) {
return indexNodes.stream() //
.filter(node -> node.getNodeType() == nodeType) //
.map(IndexNode::getCode) //
.collect(toList());
}
public List<IndexNodeInfo> toIndexNodeInfos() {
if (indexNodes == null)
return Collections.emptyList();
return BeanMapper.copyList(indexNodes, IndexNodeInfo.class);
}
}

View File

@ -1,4 +1,5 @@
package cn.axzo.nanopart.doc.file.index;
package cn.axzo.nanopart.doc.file.index.domain;
import cn.axzo.basics.common.exception.ServiceException;
@ -7,8 +8,8 @@ import cn.axzo.basics.common.exception.ServiceException;
*/
public class NameUsedException extends ServiceException {
public NameUsedException(String msg) {
super(msg);
}
public NameUsedException(String msg) {
super(msg);
}
}

View File

@ -1,4 +1,5 @@
package cn.axzo.nanopart.doc.file.index;
package cn.axzo.nanopart.doc.file.index.domain;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import lombok.Getter;
@ -13,8 +14,8 @@ import lombok.experimental.Accessors;
@RequiredArgsConstructor
public class OssFile {
private final FileFormat format;
private final String code;
private final String ossFileKey;
private final FileFormat format;
private final String code;
private final String ossFileKey;
}
}

View File

@ -0,0 +1,101 @@
package cn.axzo.nanopart.doc.file.templatedb;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.api.index.request.CopyNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.DeleteNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.GetNodeChildrenRequest;
import cn.axzo.nanopart.doc.api.index.request.IndexNodePageSearchRequest;
import cn.axzo.nanopart.doc.api.index.request.MoveNodeRequest;
import cn.axzo.nanopart.doc.api.index.request.RenameNodeRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateDatabaseRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateFileRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseGetDatabaseOrDirInfoRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseUpdateDatabaseOrDirInfoRequest;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseUploadFileRequest;
import cn.axzo.nanopart.doc.api.templatedb.response.TemplateDatabaseGetDatabaseOrDirInfoResponse;
import cn.azxo.framework.common.model.Page;
import org.springframework.web.bind.annotation.RestController;
import cn.axzo.nanopart.doc.api.templatedb.TemplateDatabaseApi;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateDirRequest;
import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.azxo.framework.common.model.CommonResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
/**
* @author yanglin
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class TemplateDatabaseApiController implements TemplateDatabaseApi {
private final TemplateDatabaseManager templateDatabaseManager;
private final IndexManager indexManager;
@Override
public CommonResponse<String> createDatabase(TemplateDatabaseCreateDatabaseRequest request) {
return null;
}
@Override
public CommonResponse<String> createDir(TemplateDatabaseCreateDirRequest request) {
return CommonResponse.success(templateDatabaseManager.createDir(request));
}
@Override
public CommonResponse<String> createFile(TemplateDatabaseCreateFileRequest request) {
return null;
}
@Override
public CommonResponse<String> uploadFile(TemplateDatabaseUploadFileRequest request) {
return null;
}
@Override
public CommonResponse<Void> rename(RenameNodeRequest request) {
return null;
}
@Override
public CommonResponse<String> copy(CopyNodeRequest request) {
return null;
}
@Override
public CommonResponse<String> move(MoveNodeRequest request) {
return null;
}
@Override
public CommonResponse<Void> delete(DeleteNodeRequest request) {
return null;
}
@Override
public CommonResponse<List<IndexNodeInfo>> getChildren(GetNodeChildrenRequest request) {
return null;
}
@Override
public CommonResponse<Page<IndexNodeInfo>> search(IndexNodePageSearchRequest request) {
return null;
}
@Override
public CommonResponse<TemplateDatabaseGetDatabaseOrDirInfoResponse> getDatabaseOrDirInfo(
TemplateDatabaseGetDatabaseOrDirInfoRequest request) {
return null;
}
@Override
public CommonResponse<Void> updateDatabaseOrDirInfo(TemplateDatabaseUpdateDatabaseOrDirInfoRequest request) {
return null;
}
}

View File

@ -0,0 +1,26 @@
package cn.axzo.nanopart.doc.file.templatedb;
import org.springframework.stereotype.Component;
import cn.axzo.nanopart.doc.api.templatedb.reqeust.TemplateDatabaseCreateDirRequest;
import cn.axzo.nanopart.doc.dao.TemplateDatabaseDao;
import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.axzo.nanopart.doc.utils.BizTransactional;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@Component
@RequiredArgsConstructor
public class TemplateDatabaseManager {
private final IndexManager indexManager;
private final TemplateDatabaseDao templateDatabaseDao;
@BizTransactional
public String createDir(TemplateDatabaseCreateDirRequest request) {
return null;
}
}

View File

@ -1,9 +1,12 @@
package cn.axzo.nanopart.doc.integration;
import java.util.Set;
import org.springframework.stereotype.Component;
import cn.axzo.nanopart.doc.api.enums.FileFormat;
import cn.axzo.nanopart.doc.config.DocProps;
import lombok.RequiredArgsConstructor;
/**
@ -13,17 +16,24 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class OssClient {
public String copy(String srcOssFileKey, String destFileName, FileFormat format) {
private final DocProps docProps;
public String copy(String srcOssFileKey, FileFormat format, String fileName) {
// TODO(yl): finish this
throw new UnsupportedOperationException();
}
public String upload(String fileBase64, String fileName, FileFormat format) {
public void asyncDelete(String ossFileKey) {
// TODO(yl): finish this
throw new UnsupportedOperationException();
}
public void safeDelete(String ossFileKey) {
public void asyncDelete(Set<String> ossFileKeys) {
// TODO(yl): finish this
}
public void rename(String ossFileKey, String newName) {
// TODO(yl): finish this
throw new UnsupportedOperationException();
}
}