新增 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。
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package runner
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/easyai/easyai-ai-gateway/apps/api/internal/config"
|
|
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
|
|
)
|
|
|
|
type directOSSUploader struct {
|
|
endpoint string
|
|
bucket string
|
|
accessKeyID string
|
|
accessKeySecret string
|
|
publicBaseURL string
|
|
objectPrefix string
|
|
}
|
|
|
|
func newDirectOSSUploader(cfg config.Config) *directOSSUploader {
|
|
if !cfg.MediaOSSDirectEnabled {
|
|
return nil
|
|
}
|
|
return &directOSSUploader{
|
|
endpoint: strings.TrimRight(cfg.MediaOSSEndpoint, "/"),
|
|
bucket: strings.TrimSpace(cfg.MediaOSSBucket),
|
|
accessKeyID: strings.TrimSpace(cfg.MediaOSSAccessKeyID),
|
|
accessKeySecret: strings.TrimSpace(cfg.MediaOSSAccessKeySecret),
|
|
publicBaseURL: strings.TrimRight(cfg.MediaOSSPublicBaseURL, "/"),
|
|
objectPrefix: strings.Trim(cfg.MediaOSSObjectPrefix, "/"),
|
|
}
|
|
}
|
|
|
|
func directOSSScene(scene string) bool {
|
|
switch strings.TrimSpace(scene) {
|
|
case store.FileStorageSceneUpload, store.FileStorageSceneRequestAsset, store.FileStorageSceneImageResult:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func (u *directOSSUploader) fileStorageChannel() store.FileStorageChannel {
|
|
if u == nil {
|
|
return store.FileStorageChannel{}
|
|
}
|
|
return store.FileStorageChannel{
|
|
ChannelKey: "environment-direct-oss",
|
|
Name: "Environment Direct OSS",
|
|
Provider: "aliyun_oss",
|
|
AccessKeyID: u.accessKeyID,
|
|
AccessKeySecret: u.accessKeySecret,
|
|
Priority: 10,
|
|
Status: "enabled",
|
|
Scenes: []string{store.FileStorageSceneUpload, store.FileStorageSceneRequestAsset, store.FileStorageSceneImageResult},
|
|
Config: map[string]any{
|
|
"endpoint": u.endpoint,
|
|
"bucket": u.bucket,
|
|
"publicBaseUrl": u.publicBaseURL,
|
|
"objectPrefix": u.objectPrefix,
|
|
},
|
|
RetryPolicy: map[string]any{
|
|
"enabled": true,
|
|
"maxRetries": 2,
|
|
"backoffSeconds": []any{0.25, 1.0},
|
|
},
|
|
}
|
|
}
|