REQ-3540: 完善接口声明

This commit is contained in:
yanglin 2025-03-12 16:19:43 +08:00
parent dd88e4d889
commit 7ec2d28e92
36 changed files with 359 additions and 186 deletions

View File

@ -0,0 +1,26 @@
package cn.axzo.nanopart.doc.api.domain;
import java.math.BigDecimal;
import cn.axzo.nanopart.doc.api.enums.FileTemplateState;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class FileTemplateNodeInfo {
/**
* 文件模版状态. UNPUBLISH: 未上架, PUBLISHED: 已上架
*/
private FileTemplateState state;
/**
* 费用
*/
private BigDecimal fee;
}

View File

@ -1,5 +1,5 @@
package cn.axzo.nanopart.doc.api.index;
package cn.axzo.nanopart.doc.api.domain;
import java.util.List;
@ -87,4 +87,10 @@ public class IndexNodeInfo {
* 是否可以添加更多的子节点
*/
private boolean addMoreChildren;
/**
* 模版市场节点相关的信息
*/
private FileTemplateNodeInfo fileTemplateNodeInfo;
}

View File

@ -6,9 +6,15 @@ package cn.axzo.nanopart.doc.api.enums;
*/
public enum CooperationAccessOption {
NONE,
// 项目内所有企业可见
ALL_ORGS_IN_PROJECT,
// 指定参建单位可见
ORGS_BY_COOPERATE_TYPES
;
public boolean isNone() {
return this == NONE;
}
}

View File

@ -6,6 +6,6 @@ package cn.axzo.nanopart.doc.api.enums;
*/
public enum FileTemplateState {
DRAFT, PUBLISHED, DELETED
UNPUBLISH, PUBLISHED, DELETED
}

View File

@ -15,7 +15,7 @@ import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateGetFileInfoRequ
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.domain.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.IndexNodePageSearchRequest;

View File

@ -48,7 +48,7 @@ public class FileTemplateGetFileInfoResponse {
private BigDecimal vipFee;
/**
* 状态. DRAFT: 草稿, PUBLISHED: 已发布
* 状态. UNPUBLISH: 未发布, PUBLISHED: 已发布
*/
private FileTemplateState state;

View File

@ -5,9 +5,10 @@ import java.util.Set;
import javax.validation.constraints.NotBlank;
import com.alibaba.fastjson.JSON;
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;
@ -25,7 +26,7 @@ public class IndexNodePageSearchRequest extends PageRequest {
private String name;
/**
* 搜索类型, 不指定就搜索所有类型, DIRECTORY: 目录, FILE: 文件
* 搜索类型, 不指定就搜索所有类型, DATABASE: 空间, DIRECTORY: 目录, FILE: 文件
*/
private Set<IndexNodeType> nodeTypes;

View File

@ -9,7 +9,7 @@ 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.domain.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.IndexNodePageSearchRequest;

View File

@ -0,0 +1,44 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.constraints.NotBlank;
import cn.axzo.nanopart.doc.api.domain.IndexNodeScope;
import cn.axzo.nanopart.doc.api.domain.NodeCreate;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
/**
* @author yanglin
*/
@Setter
@Getter
abstract class NodeCreateTemplateDatabase implements NodeCreate {
/**
* 父节点code
*/
private String parentCode;
/**
* 节点名称(文件夹/文件)不能为空
*/
@NotBlank(message = "节点名称不能为空")
private String name;
@Override
public IndexNodeScope nodeScope() {
return IndexNodeScope.TEMPLATE_DATABASE_SCOPE;
}
@Override
public String name() {
return StringUtils.isBlank(name) ? "" : name;
}
@Override
public String parentCode() {
return StringUtils.isBlank(parentCode) ? "" : parentCode;
}
}

View File

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

View File

@ -3,7 +3,6 @@ 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;
@ -14,13 +13,7 @@ import lombok.Setter;
*/
@Setter
@Getter
public class TemplateDatabaseCreateDirRequest {
/**
* 名称
*/
@NotBlank(message = "name不能为空")
private String name;
public class TemplateDatabaseCreateDirRequest extends NodeCreateTemplateDatabase {
/**
* 编码

View File

@ -1,10 +1,10 @@
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 cn.axzo.nanopart.doc.api.util.DefaultIcons;
import lombok.Getter;
import lombok.Setter;
@ -13,18 +13,7 @@ import lombok.Setter;
*/
@Setter
@Getter
public class TemplateDatabaseCreateFileRequest {
/**
* 父节点code
*/
private String parentCode;
/**
* 节点名称(文件夹/文件)不能为空
*/
@NotBlank(message = "节点名称不能为空")
private String name;
public class TemplateDatabaseCreateFileRequest extends NodeCreateTemplateDatabase {
/**
* 文件格式. EXCEL, WORD, PDF
@ -32,4 +21,9 @@ public class TemplateDatabaseCreateFileRequest {
@NotNull(message = "文件格式不能为空")
private FileFormat format;
@Override
public String icon() {
return DefaultIcons.defaultFileIcon(format);
}
}

View File

@ -2,7 +2,6 @@
package cn.axzo.nanopart.doc.api.templatedb.reqeust;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import cn.axzo.nanopart.doc.api.domain.OssFile;
@ -14,18 +13,7 @@ import lombok.Setter;
*/
@Setter
@Getter
public class TemplateDatabaseUploadFileRequest {
/**
* 父节点code
*/
private String parentCode;
/**
* 节点名称(文件夹/文件)不能为空
*/
@NotBlank(message = "节点名称不能为空")
private String name;
public class TemplateDatabaseUploadFileRequest extends NodeCreateTemplateDatabase{
/**
* 上传的文件信息

View File

@ -12,8 +12,8 @@ import lombok.NoArgsConstructor;
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@AllArgsConstructor
//@NoArgsConstructor
public class WpsRenameResponse {

View File

@ -20,6 +20,7 @@ public class DocProps {
private String emptyWordOssFileKey;
private String emptyExcelFileKey;
private int maxChildrenSize = 200;
private int indexNodeMaxChildrenSize = 200;
private int indexNodeMaxDepth = 10;
}

View File

@ -16,10 +16,12 @@ 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;
import lombok.extern.slf4j.Slf4j;
/**
* @author yanglin
*/
@Slf4j
@Repository
public class IndexNodeDao extends ServiceImpl<IndexNodeMapper, IndexNode> {
@ -109,4 +111,11 @@ public class IndexNodeDao extends ServiceImpl<IndexNodeMapper, IndexNode> {
.eq(IndexNode::getScopeCode, nodeScope.scopeCode()).eq(IndexNode::getParentCode, "");
}
public void updateFileSize(String code, long size) {
lambdaUpdate() //
.eq(IndexNode::getCode, code) //
.set(IndexNode::getSize, size) //
.update();
}
}

View File

@ -3,6 +3,7 @@ package cn.axzo.nanopart.doc.entity;
import java.util.Date;
import cn.axzo.nanopart.doc.api.enums.CooperationAccessOption;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
@ -62,6 +63,11 @@ public class FileDatabase extends BaseEntity<FileDatabase> {
*/
private Long ouId;
/**
* 协作模式, NONE: , ALL_ORGS_IN_PROJECT: 项目内所有企业可见, ORGS_BY_COOPERATE_TYPES: 指定参建单位可见
*/
private CooperationAccessOption coopAccessOption;
/**
* 状态. ACTIVATING: 开通中, ACTIVATED: 已开通, EXPIRED: 已到期
*/

View File

@ -1,6 +1,7 @@
package cn.axzo.nanopart.doc.entity;
import cn.axzo.nanopart.doc.entity.domain.Path;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
@ -118,6 +119,10 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeValue, Index
return attributes;
}
public Path path() {
return new Path(path);
}
public boolean isFile() {
return nodeType == IndexNodeType.FILE;
}
@ -166,4 +171,4 @@ public class IndexNode extends BaseEntity<IndexNode> implements NodeValue, Index
public String parentCode() {
return parentCode;
}
}
}

View File

@ -1,15 +1,15 @@
package cn.axzo.nanopart.doc.entity;
import cn.axzo.nanopart.doc.api.enums.DatabaseScope;
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;
import cn.axzo.pudge.core.persistence.BaseEntity;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import cn.axzo.nanopart.doc.api.domain.DatabaseAccessConfig;
import cn.axzo.nanopart.doc.api.domain.DatabaseFeeConfig;
import cn.axzo.nanopart.doc.api.enums.DatabaseScope;
import cn.axzo.pudge.core.persistence.BaseEntity;
import lombok.Getter;
import lombok.Setter;

View File

@ -0,0 +1,40 @@
package cn.axzo.nanopart.doc.entity.domain;
import com.google.common.base.Splitter;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Path {
private static final Splitter SPLITTER = Splitter.on("/").omitEmptyStrings().trimResults();
private final String path;
public static Path empty() {
return new Path("/");
}
public Path append(String path) {
String p = path;
if (!p.endsWith("/"))
p = "/";
p = this.path + p + "/";
return new Path(p);
}
public int depth() {
return SPLITTER.splitToList(path).size();
}
@Override
public String toString() {
return path;
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.doc.file.filedb;
import lombok.RequiredArgsConstructor;
@ -9,4 +10,4 @@ import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class FileDatabaseManager {
}
}

View File

@ -14,7 +14,7 @@ import cn.axzo.nanopart.doc.api.filetemplate.request.FileTemplateGetFileInfoRequ
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.domain.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.IndexNodePageSearchRequest;

View File

@ -48,7 +48,7 @@ public class FileTemplateManager {
private String createFileTemplate(IndexNode fileNode) {
FileTemplate fileTemplate = new FileTemplate();
fileTemplate.setCode(fileNode.getCode());
fileTemplate.setState(FileTemplateState.DRAFT);
fileTemplate.setState(FileTemplateState.UNPUBLISH);
fileTemplateDao.save(fileTemplate);
return fileNode.getCode();
}

View File

@ -55,20 +55,28 @@ public class IndexManager {
/**
* 不能在事务中使用
*/
public OssFile uploadEmptyFile(NodeCreate node, FileFormat format) {
public OssFile uploadEmptyFile(NodeCreate create, FileFormat format) {
BizAssertions.assertTrue(format.creatable(), "无法创建: {}", format.readableName());
BizAssertions.assertFalse(TransactionSynchronizationManager.isActualTransactionActive(), "不能在事务中使用");
indexSupport.ensureChildNameNotUsed(node);
indexSupport.ensureChildNameNotUsed(create);
String emptyOssFileKey = format == FileFormat.WORD //
? docProps.getEmptyWordOssFileKey() //
: docProps.getEmptyExcelFileKey();
return OssFile.create(format, 0, ossClient.copy(emptyOssFileKey, format, node.name()));
return OssFile.create(format, 0, ossClient.copy(emptyOssFileKey, format, create.name()));
}
@BizTransactional
public IndexNode uploadFile(NodeCreate node, OssFile ossFile) {
indexSupport.ensureChildNameNotUsed(node);
return createFile(node, ossFile);
IndexNode fileNode = createFile(node, ossFile);
updateFileSize(fileNode.getCode(), ossFile.getSize());
return fileNode;
}
public void updateFileSize(String code, int size) {
IndexNode fileNode = indexNodeDao.getNodeOrThrow(code);
BizAssertions.assertTrue(fileNode.isFile(), "不是文件节点, 无法更新文件大小");
indexNodeDao.updateFileSize(code, size);
}
public IndexNode createFile(NodeCreate node, OssFile ossFile) {

View File

@ -31,4 +31,4 @@ public class IndexQueryService {
return null;
}
}
}

View File

@ -18,6 +18,7 @@ import cn.axzo.nanopart.doc.config.DocProps;
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.entity.domain.Path;
import cn.axzo.nanopart.doc.file.index.domain.NameUsedException;
import lombok.RequiredArgsConstructor;
@ -36,10 +37,13 @@ class IndexSupport {
String code = UUIDUtil.uuidString();
if (nodeType == IndexNodeType.DATABASE)
BizAssertions.assertBlank(create.parentCode(), "创建空间时不能指定父节点");
BizAssertions.assertFalse(indexNodeDao.countValidChild(create) < docProps.getMaxChildrenSize(), "子节点数量超过限制");
BizAssertions.assertTrue(indexNodeDao.countValidChild(create) <= docProps.getIndexNodeMaxChildrenSize(),
"子节点数量超过限制{}, 无法再创建新节点", docProps.getIndexNodeMaxChildrenSize());
IndexNode parent = null;
if (StringUtils.isNotBlank(create.parentCode())) {
parent = indexNodeDao.getNodeOrThrow(create.parentCode());
BizAssertions.assertTrue(parent.path().depth() < docProps.getIndexNodeMaxDepth(), //
"节点深度超过限制{}, 无法再创建新节点", docProps.getIndexNodeMaxDepth());
BizAssertions.assertEquals(parent.getContext(), create.nodeScope().context(), //
"创建子节点时父子context不匹配: {}", create.parentCode());
BizAssertions.assertEquals(parent.getScope(), create.nodeScope(), //
@ -65,10 +69,8 @@ class IndexSupport {
child.setNodeType(nodeType);
child.setSize(0);
indexNodeDao.save(child);
String path = parent == null //
? String.format("/%s/", child.getId()) //
: String.format("%s%s/", parent.getPath(), child.getId());
indexNodeDao.updatePath(child.getCode(), path);
Path basePath = parent == null ? Path.empty() : parent.path();
indexNodeDao.updatePath(child.getCode(), basePath.append(String.valueOf(child.getId())).toString());
return indexNodeDao.getNodeOrThrow(child.getCode());
}

View File

@ -8,7 +8,7 @@ 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.api.domain.IndexNodeInfo;
import cn.axzo.nanopart.doc.entity.IndexNode;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

View File

@ -12,4 +12,4 @@ public class NameUsedException extends ServiceException {
super(msg);
}
}
}

View File

@ -28,16 +28,17 @@ public class OssFileDeleteHandler implements EventHandler, InitializingBean {
public void onEvent(Event event, EventConsumer.Context context) {
log.info("receive delete oss file message: {}", event);
DeleteOssFileMessage message = event.normalizedData(DeleteOssFileMessage.class);
try {
ossClient.delete(message.getOssFileKey());
} catch (Exception e) {
try {
ossClient.delete(message.getOssFileKey());
}
catch (Exception e) {
log.error("删除oss file失败", e);
}
}
}
}
@Override
public void afterPropertiesSet() {
eventConsumer.registerHandler(FileInternalEvent.OSS_FILE_DELETE.getEventCode(), this);
}
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.doc.file.mq.message;
import java.io.Serializable;
@ -15,19 +16,19 @@ import lombok.Setter;
@Getter
public abstract class MqMessage implements Serializable {
/**
* 消息唯一id
*/
private String messageId = UUID.randomUUID().toString();
/**
* 消息唯一id
*/
private String messageId = UUID.randomUUID().toString();
/**
* 消息发送时间
*/
private Date messageSendTime = new Date();
/**
* 消息发送时间
*/
private Date messageSendTime = new Date();
/**
* 消息发送时间, 字符串格式
*/
private String messageSendTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messageSendTime);
/**
* 消息发送时间, 字符串格式
*/
private String messageSendTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messageSendTime);
}
}

View File

@ -12,11 +12,11 @@ import lombok.Setter;
@Getter
public class RenameIndexNodeOssFileMessage extends MqMessage {
private String indexNodeCode;
private String indexNodeCode;
@Override
public String toString() {
return JSON.toJSONString(this);
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,9 +3,10 @@ package cn.axzo.nanopart.doc.file.templatedb;
import java.util.List;
import cn.axzo.nanopart.doc.entity.IndexNode;
import org.springframework.web.bind.annotation.RestController;
import cn.axzo.nanopart.doc.api.index.IndexNodeInfo;
import cn.axzo.nanopart.doc.api.domain.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.IndexNodePageSearchRequest;
@ -38,7 +39,8 @@ public class TemplateDatabaseApiController implements TemplateDatabaseApi {
@Override
public CommonResponse<String> createDatabase(TemplateDatabaseCreateDatabaseRequest request) {
return null;
log.info("create database request:{}", request);
return CommonResponse.success(templateDatabaseManager.createDatabase(request));
}
@Override
@ -48,27 +50,33 @@ public class TemplateDatabaseApiController implements TemplateDatabaseApi {
@Override
public CommonResponse<String> createFile(TemplateDatabaseCreateFileRequest request) {
return null;
return CommonResponse.success(templateDatabaseManager.createFile(request));
}
@Override
public CommonResponse<String> uploadFile(TemplateDatabaseUploadFileRequest request) {
return null;
return CommonResponse.success(templateDatabaseManager.updateFile(request));
}
@Override
public CommonResponse<Void> rename(RenameNodeRequest request) {
return null;
log.info("rename request:{}", request);
indexManager.rename(request.getCode(), request.getNewName());
return CommonResponse.success();
}
@Override
public CommonResponse<String> copy(CopyNodeRequest request) {
return null;
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) {
return null;
log.info("move request:{}", request);
IndexNode indexNode = indexManager.move(request.getCode(), request.getDestParentCode());
return CommonResponse.success(indexNode.getCode());
}
@Override

View File

@ -1,9 +1,18 @@
package cn.axzo.nanopart.doc.file.templatedb;
import org.springframework.stereotype.Component;
import cn.axzo.nanopart.doc.api.domain.OssFile;
import cn.axzo.nanopart.doc.api.enums.DatabaseScope;
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.TemplateDatabaseUploadFileRequest;
import cn.axzo.nanopart.doc.api.util.BizAssertions;
import cn.axzo.nanopart.doc.dao.TemplateDatabaseDao;
import cn.axzo.nanopart.doc.entity.IndexNode;
import cn.axzo.nanopart.doc.entity.TemplateDatabase;
import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.axzo.nanopart.doc.utils.BizTransactional;
import lombok.RequiredArgsConstructor;
@ -15,12 +24,32 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class TemplateDatabaseManager {
private final IndexManager indexManager;
private final TemplateDatabaseDao templateDatabaseDao;
private final IndexManager indexManager;
private final TemplateDatabaseDao templateDatabaseDao;
@BizTransactional
public String createDir(TemplateDatabaseCreateDirRequest request) {
return null;
}
@BizTransactional
public String createDatabase(TemplateDatabaseCreateDatabaseRequest request) {
if (request.getScope() == DatabaseScope.PROJECT_DATABASE)
BizAssertions.assertFalse(request.getAccessOption().isNone(), "项目数据库必须指定协作模式");
IndexNode indexNode = indexManager.createDatabase(request);
TemplateDatabase db = new TemplateDatabase();
db.setCode(indexNode.getCode());
db.setScope(request.getScope());
templateDatabaseDao.save(db);
return indexNode.getCode();
}
}
public String createDir(TemplateDatabaseCreateDirRequest request) {
return indexManager.createDir(request).getCode();
}
public String createFile(TemplateDatabaseCreateFileRequest request) {
OssFile ossFile = indexManager.uploadEmptyFile(request, request.getFormat());
return indexManager.createFile(request, ossFile).getCode();
}
public String updateFile(TemplateDatabaseUploadFileRequest request) {
return indexManager.uploadFile(request, request.getOssFile()).getCode();
}
}

View File

@ -29,4 +29,4 @@ public class OssClient {
// TODO(yl): finish this
}
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.doc.wps;
import cn.axzo.framework.domain.web.result.ApiResult;
@ -28,56 +29,56 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
public class WpsBaseController implements WpsBaseApi {
/**
* 获取文件信息
* <p> 公有云wps回调接口
*
*/
@Override
public ApiResult<WpsFetchFileResponse> fetchFile(@Validated @RequestBody WpsFetchFileRequest request) {
/**
* 获取文件信息
* <p> 公有云wps回调接口
*
*/
@Override
public ApiResult<WpsFetchFileResponse> fetchFile(@Validated @RequestBody WpsFetchFileRequest request) {
return ApiResult.ok();
}
return ApiResult.ok();
}
/**
* 获取文件下载地址
* 说明在线协同系统需要下载文件原件以提供协同服务该接口需要返回指定文件 ID 所对应的下载地址
*
*/
@Override
public ApiResult<WpsFetchDownloadResponse> fetchDownload(@Validated @RequestBody WpsFetchDownloadRequest request) {
return ApiResult.ok();
}
/**
* 获取文件下载地址
* 说明在线协同系统需要下载文件原件以提供协同服务该接口需要返回指定文件 ID 所对应的下载地址
*
*/
@Override
public ApiResult<WpsFetchDownloadResponse> fetchDownload(@Validated @RequestBody WpsFetchDownloadRequest request) {
return ApiResult.ok();
}
/**
* 文档用户权限
* 说明任何需要用户鉴权的行为都会触发该接口的调用并且 WebOffice 会根据指定的权限位来限定特定的操作
* download 指定该用户是否具有下载文档权限 此接口用于标识用户具备哪些操作权限具体的功能支持还需您的服务实现相关回调
*
*/
@Override
public ApiResult<WpsPermissionResponse> permission(@Validated @RequestBody WpsPermissionRequest request) {
return ApiResult.ok();
}
/**
* 文档用户权限
* 说明任何需要用户鉴权的行为都会触发该接口的调用并且 WebOffice 会根据指定的权限位来限定特定的操作
* download 指定该用户是否具有下载文档权限 此接口用于标识用户具备哪些操作权限具体的功能支持还需您的服务实现相关回调
*
*/
@Override
public ApiResult<WpsPermissionResponse> permission(@Validated @RequestBody WpsPermissionRequest request) {
return ApiResult.ok();
}
/**
* 用户信息
* 该组接口用于获取协同场景下的用户信息如查看历史改动在线协同用户头像等
*
*/
@Override
public ApiResult<WpsUsersResponse> users(@Validated @RequestBody WpsUsersRequest request) {
return ApiResult.ok();
}
/**
* 用户信息
* 该组接口用于获取协同场景下的用户信息如查看历史改动在线协同用户头像等
*
*/
@Override
public ApiResult<WpsUsersResponse> users(@Validated @RequestBody WpsUsersRequest request) {
return ApiResult.ok();
}
/**
* 文档重命名
* 说明该接口用于在 WebOffice 侧重命名文档
*
*/
@Override
public ApiResult<WpsRenameResponse> rename(@Validated @RequestBody WpsRenameRequest request) {
return ApiResult.ok();
}
/**
* 文档重命名
* 说明该接口用于在 WebOffice 侧重命名文档
*
*/
@Override
public ApiResult<WpsRenameResponse> rename(@Validated @RequestBody WpsRenameRequest request) {
return ApiResult.ok();
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.doc.wps;
import cn.axzo.framework.domain.web.result.ApiResult;
@ -27,37 +28,39 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
public class WpsEditController implements WpsEditApi {
/**
* 文档编辑
* 1 准备上传阶段
* 说明三阶段保存的第一步主要用于 WebOffice 与接入方进行参数协商目前主要协商摘要算法
*
*/
@Override
public ApiResult<WpsEditUploadPrepareResponse> uploadPrepare(@Validated @RequestBody WpsEditUploadPrepareRequest request) {
return ApiResult.ok();
}
/**
* 文档编辑
* 1 准备上传阶段
* 说明三阶段保存的第一步主要用于 WebOffice 与接入方进行参数协商目前主要协商摘要算法
*
*/
@Override
public ApiResult<WpsEditUploadPrepareResponse> uploadPrepare(
@Validated @RequestBody WpsEditUploadPrepareRequest request) {
return ApiResult.ok();
}
/**
* 文档编辑
* 2 获取上传地址
* 说明三阶段保存第二步主要用于获取上传地址WebOffice 将上传保存后的文档到该地址
* 此外回调中也会带上本次保存的一些额外信息如文档大小手动/自动保存等
*/
@Override
public ApiResult<WpsEditUploadAddressResponse> uploadAddress(@Validated @RequestBody WpsEditUploadAddressRequest request) {
return ApiResult.ok();
}
/**
* 文档编辑
* 3 上传完成后回调通知上传结果
* 说明WebOffice 在将新版本文件上传到指定地址后将会回调通知接入方
*/
@Override
public ApiResult<WpsEditUploadCompleteResponse> uploadComplete(@Validated @RequestBody WpsEditUploadCompleteRequest request) {
return ApiResult.ok();
}
/**
* 文档编辑
* 2 获取上传地址
* 说明三阶段保存第二步主要用于获取上传地址WebOffice 将上传保存后的文档到该地址
* 此外回调中也会带上本次保存的一些额外信息如文档大小手动/自动保存等
*/
@Override
public ApiResult<WpsEditUploadAddressResponse> uploadAddress(
@Validated @RequestBody WpsEditUploadAddressRequest request) {
return ApiResult.ok();
}
/**
* 文档编辑
* 3 上传完成后回调通知上传结果
* 说明WebOffice 在将新版本文件上传到指定地址后将会回调通知接入方
*/
@Override
public ApiResult<WpsEditUploadCompleteResponse> uploadComplete(
@Validated @RequestBody WpsEditUploadCompleteRequest request) {
return ApiResult.ok();
}
}