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:
2026-08-04 08:14:39 +08:00
parent d129bcccbd
commit 0f0998cbcf
55 changed files with 3649 additions and 1008 deletions
+32 -4
View File
@@ -1039,7 +1039,7 @@ export interface FileStorageChannel {
id: string;
channelKey: string;
name: string;
provider: 'server_main_openapi' | 'aliyun_oss' | 'tencent_cos' | string;
provider: 'server_main_openapi' | 'aliyun_oss' | 's3' | string;
uploadUrl?: string;
credentialsPreview?: Record<string, unknown>;
scenes?: string[];
@@ -1057,9 +1057,14 @@ export interface FileStorageChannel {
export interface FileStorageChannelUpsertRequest {
channelKey: string;
name: string;
provider?: 'server_main_openapi' | 'aliyun_oss' | 'tencent_cos' | string;
provider?: 'server_main_openapi' | 'aliyun_oss' | 's3' | string;
uploadUrl?: string;
apiKey?: string;
accessKey?: string;
accessKeyId?: string;
accessKeySecret?: string;
secretKey?: string;
sessionToken?: string;
scenes?: string[];
config?: Record<string, unknown>;
retryPolicy?: Record<string, unknown>;
@@ -1067,12 +1072,20 @@ export interface FileStorageChannelUpsertRequest {
status?: 'enabled' | 'disabled' | string;
}
export interface FileStorageChannelTestResult {
provider: 'aliyun_oss' | 's3' | string;
putSucceeded: boolean;
headSucceeded: boolean;
deleteSucceeded: boolean;
durationMs: number;
}
export interface FileStorageSettings {
resultUploadPolicy: 'default' | 'upload_all' | 'upload_none' | string;
resultUploadPolicy: 'default' | 'upload_all' | string;
}
export interface FileStorageSettingsUpdateRequest {
resultUploadPolicy: 'default' | 'upload_all' | 'upload_none' | string;
resultUploadPolicy: 'default' | 'upload_all' | string;
}
export interface ClientCustomizationSettings {
@@ -1238,6 +1251,19 @@ export interface IdentityRevisionPolicyUpdate {
sessionRefreshSeconds?: number;
}
export interface PublicErrorV1 {
code: string;
message: string;
category: string;
httpStatus: number;
retryable: boolean;
action: string;
retryAfterSeconds?: number;
requestId?: string;
taskId?: string;
version: 'v1' | string;
}
export interface GatewayTask {
id: string;
kind: string;
@@ -1284,6 +1310,7 @@ export interface GatewayTask {
error?: string;
errorCode?: string;
errorMessage?: string;
publicError?: PublicErrorV1;
attempts?: GatewayTaskAttempt[];
createdAt: string;
updatedAt: string;
@@ -1367,6 +1394,7 @@ export interface GatewayTaskAttempt {
upstreamSubmissionUpdatedAt?: string;
errorCode?: string;
errorMessage?: string;
publicError?: PublicErrorV1;
startedAt: string;
finishedAt?: string;
}