diff --git a/docs/JCS_pub_API.md b/docs/JCS_pub_API.md index fad7309..15824b3 100644 --- a/docs/JCS_pub_API.md +++ b/docs/JCS_pub_API.md @@ -24,7 +24,7 @@
{
     "userID": 1,
-    "name": "bkt1"  //桶名
+    "name": "bkt1"  // 桶名
 }
@@ -47,32 +47,287 @@ - - - ### 1.2 根据名字查询桶 + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/bucket/getByName
Query- name:string // 桶名
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+      "bucket": {
+        "bucketID": 1,  // 桶ID
+        "name": "bkt1"  // 桶名
+      }
+    }
+}
+
### 1.3 查询所有桶 - + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/bucket/listAll
Query
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+      "buckets": [{
+        "bucketID": 1,  // 桶ID
+        "name": "bkt1"  // 桶名
+      }]
+    }
+}
+
### 1.4 删除桶 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/bucket/delete
Query
Body +
{
+    "bucketID":1
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+
## 2 包相关 ### 2.1 创建包 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/package/create
Query
Body +
{
+    "bucketID":1,
+    "name": ""  // 包名
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "package": {
+            "packageID": 32,
+            "name": "t1",
+            "bucketID": 1,
+            "createTime": "2025-06-24T16:31:28.5148754+08:00"
+        }
+    }
+}
+
### 2.2 根据桶名和包名查询包 + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/package/getByFullName
Query +

- bucketName:string // 桶名 + - packageName:string // 包名

+
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "package": {
+            "packageID": 32,
+            "name": "t1",
+            "bucketID": 1,
+            "createTime": "2025-06-24T16:31:28.5148754+08:00"
+        }
+    }
+}
+
### 2.3 获取桶里所有的包 + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/package/listBucketPackages
Query +

- bucketID:int64 // 桶ID

+
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+      "packages":[{
+            "packageID": 32,
+            "name": "t1",
+            "bucketID": 1,
+            "createTime": "2025-06-24T16:31:28.5148754+08:00"
+        }]
+    }
+}
+
### 2.4 删除包 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/package/delete
Query
Body +
{
+    "packageID":1
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+
## 3 对象相关 @@ -96,8 +351,8 @@

被boundary分隔的多个part,第一个part的name必须是info,格式如下:

{
-  "packageID": 1, // PackageID,使用从创建Package接口返回的ID
-  "affinity": 1 // 文件优先上传到哪个存储空间,可以不填。
+  "packageID": 1,  // PackageID,使用从创建Package接口返回的ID
+  "affinity": 1  // 文件优先上传到哪个存储空间,可以不填。
 }

之后的每一个part都是一个文件,name为files,filename为文件路径,需要进行URL编码。 一个例子:

@@ -180,14 +435,14 @@ testdata2 GET application/json - /v1/bucket/download + /v1/object/download Query

- objectID:int64 - - offset:int64,偏移量 - - length:int64,读取长度。不存在则读取整个对象

+ - offset:int64 // 偏移量 + - length:int64 // 读取长度。不存在则读取整个对象

@@ -210,51 +465,1040 @@ testdata2 - ### 3.3 根据路径下载对象 - -### 3.4 根据路径查询对象 - -### 3.5 获取包中所有的对象 - -### 3.6 批量移动对象 - -### 3.7 批量删除对象 - -### 3.8 批量复制对象 - -### 3.9 创建分片上传对象 - -### 3.10 上传分片 - -### 3.11 合并分片 - -## 4 用户存储空间相关 - -### 4.1 创建用户存储空间配置 - -### 4.2 更新用户存储空间配置 - -### 4.3 删除用户存储空间配置 - -### 4.4 获取用户存储空间配置 - -### 4.5 测试用户存储空间配置 - -### 4.6 从用户存储空间上传到一个新的包 - + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/object/downloadByPath
Query +

- path:string + - offset:int64 // 偏移量 + - length:int64 // 读取长度。不存在则读取整个对象

+
Body
响应示例
+

如果请求成功,那么Content-Type将会是application/octet-stream,响应体就是文件数据。 +如果失败,那么Content-Type将会是application/json,响应体格式如下:

+
{
+    "code": "OperationFailed",
+    "message": "xxxxxxxx",
+    "data": null
+}
+
+ +### 3.4 根据路径查询对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/object/listByPath
Query +

- packageID:int64 +- path:string +- isPrefix:bool // 如果为true,则会用path参数进行前缀查询 +- noRecursive:bool // 如果为true,则在进行前缀查询的时候,会用类似查询目录的方式分别返回对象和“目录” +- maxKeys:int // 本次查询最多返回的结果的数量,即commonPrefixes+objects两个数组加起来的总数量 +- continuationToken:string // 从token指定的位置进行本次查询,设置为空则从头开始查询。这个值应该直接使用从上一次查询的响应里的类似名字的字段

+
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "nextContinuationToken": "123456", // 用于下一次分页查询
+        "isTruncated": false, // 如果为true,则代表还有更多结果等待下次查询。
+        "commonPrefixes": [
+            "a/b/",
+            "a/c/"
+        ],
+        "objects": [
+            {
+                "objectID": 617,
+                "packageID": 12,
+                "path": "a/1.txt",
+                "size": "1293",
+                "fileHash": "Full4E69A8B8CD9F42EDE371DA94458BADFB2308AFCA736AA393784A3D81F4746377",
+                "redundancy": {
+                    "type": "none"
+                },
+                "createTime": "2024-11-19T16:02:25+08:00",
+                "updateTime": "2024-11-19T16:02:25+08:00"
+            },
+            {
+                "objectID": 618,
+                "packageID": 12,
+                "path": "a/2.txt",
+                "size": "1293",
+                "fileHash": "Full4E69A8B8CD9F42EDE371DA94458BADFB2308AFCA736AA393784A3D81F4746377",
+                "redundancy": {
+                    "type": "none"
+                },
+                "createTime": "2024-11-19T16:02:25+08:00",
+                "updateTime": "2024-11-19T16:02:25+08:00"
+            }
+        ]
+    }
+}
+
+ +### 3.5 获取包中所有的对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/object/getPackageObjects
Query +

- packageID:int64

+
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "objects": [
+            {
+                "objectID": 617,
+                "packageID": 12,
+                "path": "a/1.txt",
+                "size": "1293",
+                "fileHash": "Full4E69A8B8CD9F42EDE371DA94458BADFB2308AFCA736AA393784A3D81F4746377",
+                "redundancy": {
+                    "type": "none"
+                },
+                "createTime": "2024-11-19T16:02:25+08:00",
+                "updateTime": "2024-11-19T16:02:25+08:00"
+            },
+            {
+                "objectID": 618,
+                "packageID": 12,
+                "path": "a/2.txt",
+                "size": "1293",
+                "fileHash": "Full4E69A8B8CD9F42EDE371DA94458BADFB2308AFCA736AA393784A3D81F4746377",
+                "redundancy": {
+                    "type": "none"
+                },
+                "createTime": "2024-11-19T16:02:25+08:00",
+                "updateTime": "2024-11-19T16:02:25+08:00"
+            }
+        ]
+    }
+}
+
+ +### 3.6 批量移动对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/object/move
Query
Body +
{
+    "movings":[
+        {
+            "objectID":4, // 原对象ID
+            "packageID":3, // 移动后的PackageID
+            "path":"trace2.txt" // 移动后的Path
+        }
+    ]
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+      "successes": [ // 移动成功的对象ID
+        4
+      ]
+    }
+}
+
+ +### 3.7 批量删除对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/object/delete
Query
Body +
{
+    "objectIDs":[
+      4
+    ]
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+

即使文件不存在也会返回OK

+
+ +### 3.8 批量复制对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/object/clone
Query
Body +
{
+    "clonings": [
+        {
+            "objectID": 4,  // 原对象ID
+            "newPath": "trace3.txt",  // 新对象的路径
+            "newPackageID": 3  // 新对象的包ID
+        }
+    ]
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+      "objects":[{
+                "objectID": 5,
+                "packageID": 3,
+                "path": "trace3.txt",
+                "size": "1293",
+                "fileHash": "Full4E69A8B8CD9F42EDE371DA94458BADFB2308AFCA736AA393784A3D81F4746377",
+                "redundancy": {
+                    "type": "none"
+                },
+                "createTime": "2024-11-19T16:02:25+08:00",
+                "updateTime": "2024-11-19T16:02:25+08:00"
+       }]
+    }
+}
+
+ +### 3.9 创建分片上传对象 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/object/newMultipartUpload
Query
Body +
{
+    "packageID": 3,
+    "path": "multi"  // 对象的path
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "object": {
+            "objectID": 1039,
+            "packageID": 3,
+            "path": "obj.txt",
+            "size": "0",
+            "fileHash": "Full0000000000000000000000000000000000000000000000000000000000000000",
+            "redundancy": {
+                "type": "multipartUpload"
+            },
+            "createTime": "2025-03-04T16:03:18+08:00",
+            "updateTime": "2025-03-11T15:20:44.5182982+08:00"
+        }
+    }
+}
+

创建出来的对象能在查询接口里找到

+
+ +### 3.10 上传分片 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTmultipart/form-data; boundary=xxxxxxx/v1/object/uploadPart
Query
Body +

与上传对象接口类似,需要包含info和file两个part,info的格式为:

+
{
+  "objectID": 1, // 使用从创建分片上传对象接口得到的ObjectID
+  "index": 1 // 分片编号,用于最终合并文件时使用。index相同时会覆盖旧数据。
+}
+

file则为文件数据

+
响应示例
+
{
+    "code": "OK",
+    "message": ""
+}
+
+ +### 3.11 合并分片 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/object/completeMultipartUpload
Query
Body +
{
+    "objectID": 1039,  // 需要进行合并的对象的ID
+    "indexes": [2,3,1]  // 分片编号。可以重复出现相同的分片,合并时将按照参数指定的顺序组合分片。未使用的分片将被丢弃
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "object": {
+            "objectID": 1039,
+            "packageID": 3,
+            "path": "obj.txt",
+            "size": "30",
+            "fileHash": "FullB7660EB37969EDC68202258A1838B89493B4C77EA006B1640768D20CEF7A7CD2",
+            "redundancy": {
+                "type": "none"
+            },
+            "createTime": "2025-03-04T16:03:18+08:00",
+            "updateTime": "2025-03-11T15:42:03+08:00"
+        }
+    }
+}
+
+ +## 4 用户存储空间相关 + +### 4.1 创建用户存储空间配置 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/create
Query
Body +
{
+    "name": "test1",
+    "storage": { // 存储系统类型
+        "type": "OBS",
+        "region": "",
+        "endpoint": "",
+        "bucket": "",
+        "projectID": ""
+    },
+    "credential": { // 访问存储系统所需的权限信息
+        "type": "OBS",
+        "accessKeyId": "",
+        "secretAccessKey": ""
+    },
+    "shardStore": { // 分片存储的配置,为null则不开启分片存储
+        "maxSize":1024
+    },
+    "features": [], // 存储系统特性功能的配置
+    "workingDir": "" // 包括分片存储在内的各种组件存放数据的根目录
+}
+

- storage、credential的内容是根据type字段来决定的,你可以在gitlink.org.cn/cloudream/jcs-pub/coordinator/types包中找到更多类型定义。 +- features为存储系统特性功能配置,具体有哪些可同样参考上面那个包。注:不是所有存储系统都支持所有特性。

+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "userSpace": {
+            "userSpaceID": 1,
+            "name": "test1",
+            "storage": {
+                "type": "OBS",
+                "region": "",
+                "endpoint": "",
+                "bucket": "",
+                "projectID": ""
+            },
+            "credential": {
+                "type": "OBS",
+                "accessKeyId": "",
+                "secretAccessKey": ""
+            },
+            "shardStore": {
+                "maxSize": 1024
+            },
+            "features": [],
+            "workingDir": "",
+            "revision": 1
+        }
+    }
+}
+
+ +### 4.2 更新用户存储空间配置 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/update
Query
Body +
{
+    "userSpaceID": 1,
+    "name": "test1", // 新名称
+    "credential": { // 新权限信息
+        "type": "OBS",
+        "accessKeyId": "",
+        "secretAccessKey": ""
+    }
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "userSpace": {
+            "userSpaceID": 1,
+            "name": "test1",
+            "storage": {
+                "type": "OBS",
+                "region": "",
+                "endpoint": "",
+                "bucket": "",
+                "projectID": ""
+            },
+            "credential": {
+                "type": "OBS",
+                "accessKeyId": "",
+                "secretAccessKey": ""
+            },
+            "shardStore": {
+                "maxSize": 1024
+            },
+            "features": [],
+            "workingDir": "",
+            "revision": 1
+        }
+    }
+}
+
+ +### 4.3 删除用户存储空间配置 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/delete
Query
Body +
{
+    "userSpaceID": 1
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+

如果不存在也会返回OK

+
+ +### 4.4 获取用户存储空间配置 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/userSpace/get
Query- userSpaceID: int64
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "userSpace": {
+            "userSpaceID": 1,
+            "name": "test1",
+            "storage": {
+                "type": "OBS",
+                "region": "",
+                "endpoint": "",
+                "bucket": "",
+                "projectID": ""
+            },
+            "credential": {
+                "type": "OBS",
+                "accessKeyId": "",
+                "secretAccessKey": ""
+            },
+            "shardStore": {
+                "maxSize": 1024
+            },
+            "features": [],
+            "workingDir": "",
+            "revision": 1
+        }
+    }
+}
+
+ +### 4.5 测试用户存储空间配置 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/test
Query
Body +
{
+    "storage": {
+        "type": "OBS",
+        "region": "",
+        "endpoint": "",
+        "bucket": "",
+        "projectID": ""
+    },
+    "credential": {
+        "type": "OBS",
+        "accessKeyId": "",
+        "secretAccessKey": ""
+    },
+    "workingDir": ""
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+

返回OK代表配置有效,能够连接到存储系统

+
+ +### 4.6 从用户存储空间上传到一个新的包 + + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/createPackage
Query
Body +
{
+    "userSpaceID": 1,
+    "path": "",  // 用户存储空间中的路径。可以是文件夹也可以是文件。注:不会加上WorkingDir
+    "bucketID": 1,  // 新创建的包的bucketID
+    "name": "",  // 新创建的包的名称
+    "spaceAffinity": 0  // 上传的文件优先选择的存储空间。为0则不指定
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "package": {
+            "packageID": 32,
+            "name": "t1",
+            "bucketID": 1,
+            "createTime": "2025-06-24T16:31:28.5148754+08:00"
+        }
+    }
+}
+
+ ### 4.7 下载一个包到用户存储空间 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/userSpace/downloadPackage
Query
Body +
{
+    "userSpaceID": 1,
+    "packageID": 1,
+    "rootPath": "", // 存放下载文件的根路径
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+
## 5 用户存储空间同步相关 ### 5.1 创建同步任务 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/spaceSyncer/createTask
Query
Body +
{
+    "trigger": { // 同步任务触发条件
+        "type": "Interval",
+        "interval": 30
+    },
+    "mode": { // 同步模式
+        "type": "Diff",
+        "includeSize": false,
+        "includeModTime": true
+    },
+    "filters": [ // 过滤规则
+        {
+            "type": "Size",
+            "minSize": 10,
+            "maxSize": 20000
+        }
+    ],
+    "options": { // 选项
+        "noEmptyDirectories": false
+    }, 
+    "srcUserSpaceID": 1, // 源存储空间ID
+    "srcPath": "space1/cli", // 源存储空间中的路径
+    "destUserSpaceIDs": [ // 目的存储空间ID
+        2
+    ],
+    "destPathes": [ // 目的存储空间路径
+        "space2/svr"
+    ]
+}
+

- trigger、mod、filters的内容是根据type来变化的,可以查看gitlink.org.cn/cloudream/jcs-pub/client/types包来了解更多

+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "task": {
+            "taskID": 1,
+            "trigger": {
+                "type": "Interval",
+                "interval": 30
+            },
+            "mode": {
+                "type": "Diff",
+                "includeSize": false,
+                "includeModTime": true
+            },
+            "filters": [
+                {
+                    "type": "Size",
+                    "minSize": 10,
+                    "maxSize": 20000
+                }
+            ],
+            "options": {
+                "noEmptyDirectories": false
+            },
+            "srcUserSpaceID": 1,
+            "srcPath": "space1/cli",
+            "destUserSpaceIDs": [
+                2
+            ],
+            "destPathes": [
+                "space2/svr"
+            ]
+        }
+    }
+}
+
+ ### 5.2 获取同步任务 + + + + + + + + + + + + + + + + + + + + + + + +
请求
GETapplication/json/v1/spaceSyncer/getTask
Query- taskID: int64
Body
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": {
+        "task": {
+            "taskID": 1,
+            "trigger": {
+                "type": "Interval",
+                "interval": 30
+            },
+            "mode": {
+                "type": "Diff",
+                "includeSize": false,
+                "includeModTime": true
+            },
+            "filters": [
+                {
+                    "type": "Size",
+                    "minSize": 10,
+                    "maxSize": 20000
+                }
+            ],
+            "options": {
+                "noEmptyDirectories": false
+            },
+            "srcUserSpaceID": 1,
+            "srcPath": "space1/cli",
+            "destUserSpaceIDs": [
+                2
+            ],
+            "destPathes": [
+                "space2/svr"
+            ]
+        }
+    }
+}
+
+ ### 5.3 取消同步任务 + + + + + + + + + + + + + + + + + + + + + + + +
请求
POSTapplication/json/v1/spaceSyncer/cancelTask
Query
Body +
{
+    "taskID": 1
+}
+
响应示例
+
{
+    "code": "OK",
+    "message": "",
+    "data": null
+}
+