feat(storage): 统一二进制对象存储与公开错误
新增 Aliyun OSS 与 S3 协议、通道内重试和按优先级跨通道切换,保留 server-main 兼容与环境 OSS 内存通道。 将请求及结果中的 Base64、Data URI、Buffer、multipart 和内联二进制统一对象化,生产路径不再写入本机静态目录,历史本地资源仅保留只读兼容。 引入 PublicErrorV1 并统一 API、异步查询、兼容协议和失败回调的安全错误输出,同时补充迁移、管理端、指标、OpenAPI 与本地模拟验收。 验证:go test ./... -count=1;go vet ./...;pnpm lint;pnpm test;pnpm build;pnpm openapi;tests/ci/migrations-test.sh。
This commit is contained in:
+122
-12
@@ -481,19 +481,41 @@ definitions:
|
||||
type: object
|
||||
httpapi.ErrorPayload:
|
||||
properties:
|
||||
action:
|
||||
example: retry_after
|
||||
type: string
|
||||
category:
|
||||
example: rate_limit
|
||||
type: string
|
||||
code:
|
||||
example: rate_limit
|
||||
type: string
|
||||
httpStatus:
|
||||
example: 429
|
||||
type: integer
|
||||
message:
|
||||
example: invalid json body
|
||||
type: string
|
||||
param: {}
|
||||
requestId:
|
||||
type: string
|
||||
retryAfterSeconds:
|
||||
example: 2
|
||||
type: integer
|
||||
retryable:
|
||||
example: true
|
||||
type: boolean
|
||||
status:
|
||||
example: 400
|
||||
type: integer
|
||||
taskId:
|
||||
type: string
|
||||
type:
|
||||
example: invalid_request_error
|
||||
type: string
|
||||
version:
|
||||
example: v1
|
||||
type: string
|
||||
type: object
|
||||
httpapi.FileStorageChannelListResponse:
|
||||
properties:
|
||||
@@ -502,6 +524,19 @@ definitions:
|
||||
$ref: '#/definitions/store.FileStorageChannel'
|
||||
type: array
|
||||
type: object
|
||||
httpapi.FileStorageChannelTestResponse:
|
||||
properties:
|
||||
deleteSucceeded:
|
||||
type: boolean
|
||||
durationMs:
|
||||
type: integer
|
||||
headSucceeded:
|
||||
type: boolean
|
||||
provider:
|
||||
type: string
|
||||
putSucceeded:
|
||||
type: boolean
|
||||
type: object
|
||||
httpapi.FileUploadData:
|
||||
properties:
|
||||
assetStorage:
|
||||
@@ -651,6 +686,8 @@ definitions:
|
||||
example: 0
|
||||
type: integer
|
||||
data: {}
|
||||
error:
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
message:
|
||||
example: SUCCEED
|
||||
type: string
|
||||
@@ -775,6 +812,8 @@ definitions:
|
||||
message:
|
||||
example: invalid parameter
|
||||
type: string
|
||||
public_error:
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
request_id:
|
||||
type: string
|
||||
type: object
|
||||
@@ -1602,16 +1641,7 @@ definitions:
|
||||
httpapi.VolcesErrorEnvelope:
|
||||
properties:
|
||||
error:
|
||||
$ref: '#/definitions/httpapi.VolcesErrorPayload'
|
||||
type: object
|
||||
httpapi.VolcesErrorPayload:
|
||||
properties:
|
||||
code:
|
||||
example: invalid_parameter
|
||||
type: string
|
||||
message:
|
||||
example: model is required
|
||||
type: string
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
type: object
|
||||
httpapi.WalletAdjustmentResponse:
|
||||
properties:
|
||||
@@ -1953,6 +1983,29 @@ definitions:
|
||||
- RevisionActive
|
||||
- RevisionSuperseded
|
||||
- RevisionFailed
|
||||
publicerror.Error:
|
||||
properties:
|
||||
action:
|
||||
type: string
|
||||
category:
|
||||
type: string
|
||||
code:
|
||||
type: string
|
||||
httpStatus:
|
||||
type: integer
|
||||
message:
|
||||
type: string
|
||||
requestId:
|
||||
type: string
|
||||
retryAfterSeconds:
|
||||
type: integer
|
||||
retryable:
|
||||
type: boolean
|
||||
taskId:
|
||||
type: string
|
||||
version:
|
||||
type: string
|
||||
type: object
|
||||
runner.PortraitAssetCapability:
|
||||
properties:
|
||||
availablePlatformIds:
|
||||
@@ -2297,6 +2350,8 @@ definitions:
|
||||
pricingSnapshot:
|
||||
additionalProperties: {}
|
||||
type: object
|
||||
publicError:
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
remoteTaskId:
|
||||
type: string
|
||||
request:
|
||||
@@ -2929,6 +2984,12 @@ definitions:
|
||||
type: object
|
||||
store.FileStorageChannelInput:
|
||||
properties:
|
||||
accessKey:
|
||||
type: string
|
||||
accessKeyId:
|
||||
type: string
|
||||
accessKeySecret:
|
||||
type: string
|
||||
apiKey:
|
||||
type: string
|
||||
channelKey:
|
||||
@@ -2949,6 +3010,10 @@ definitions:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
secretKey:
|
||||
type: string
|
||||
sessionToken:
|
||||
type: string
|
||||
status:
|
||||
type: string
|
||||
uploadUrl:
|
||||
@@ -3064,6 +3129,8 @@ definitions:
|
||||
pricingSnapshot:
|
||||
additionalProperties: {}
|
||||
type: object
|
||||
publicError:
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
remoteTaskId:
|
||||
type: string
|
||||
request:
|
||||
@@ -4125,6 +4192,8 @@ definitions:
|
||||
type: string
|
||||
providerModelName:
|
||||
type: string
|
||||
publicError:
|
||||
$ref: '#/definitions/publicerror.Error'
|
||||
queueKey:
|
||||
type: string
|
||||
requestFingerprint:
|
||||
@@ -6358,7 +6427,7 @@ paths:
|
||||
post:
|
||||
consumes:
|
||||
- application/json
|
||||
description: 创建文件存储通道,当前主要用于配置 server-main OpenAPI 上传通道。
|
||||
description: 创建 server-main OpenAPI、阿里云 OSS 或 S3 兼容文件存储通道。
|
||||
parameters:
|
||||
- description: 文件存储通道
|
||||
in: body
|
||||
@@ -6485,6 +6554,47 @@ paths:
|
||||
summary: 更新文件存储通道
|
||||
tags:
|
||||
- system
|
||||
/api/admin/system/file-storage/channels/{channelID}/test:
|
||||
post:
|
||||
description: 对指定 OSS 或 S3 通道执行隔离的 Put、Head、Delete 探针,不返回凭据或对象键。
|
||||
parameters:
|
||||
- description: 文件存储通道 ID
|
||||
in: path
|
||||
name: channelID
|
||||
required: true
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.FileStorageChannelTestResponse'
|
||||
"400":
|
||||
description: Bad Request
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.ErrorEnvelope'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.ErrorEnvelope'
|
||||
"403":
|
||||
description: Forbidden
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.ErrorEnvelope'
|
||||
"404":
|
||||
description: Not Found
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.ErrorEnvelope'
|
||||
"503":
|
||||
description: Service Unavailable
|
||||
schema:
|
||||
$ref: '#/definitions/httpapi.ErrorEnvelope'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: 测试对象存储通道
|
||||
tags:
|
||||
- system
|
||||
/api/admin/system/file-storage/settings:
|
||||
get:
|
||||
description: 返回文件存储系统设置;数据库对象尚未创建时返回默认设置。
|
||||
@@ -8652,7 +8762,7 @@ paths:
|
||||
post:
|
||||
consumes:
|
||||
- multipart/form-data
|
||||
description: 上传文件到配置的文件存储通道;没有启用通道时回退到本地静态上传目录。单文件最大 256MiB。
|
||||
description: 上传文件到配置的对象存储通道;所有通道失败时返回标准化存储错误,不写入本机静态目录。单文件最大 256MiB。
|
||||
parameters:
|
||||
- description: 要上传的文件
|
||||
in: formData
|
||||
|
||||
Reference in New Issue
Block a user