145 lines
3.6 KiB
Go
145 lines
3.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"seeyon-filesystem/config"
|
|
"seeyon-filesystem/model"
|
|
)
|
|
|
|
var engines = make(map[string]Engine)
|
|
var policyEngines = make(map[uint64]Engine)
|
|
|
|
// InvalidateEngine 清除指定策略的引擎缓存, 下次访问时重新创建
|
|
func InvalidateEngine(policyID uint64) {
|
|
delete(policyEngines, policyID)
|
|
}
|
|
|
|
func Register(policyType string, engine Engine) {
|
|
engines[policyType] = engine
|
|
}
|
|
|
|
func GetEngine(policy *model.StoragePolicy) (Engine, error) {
|
|
if engine, ok := policyEngines[policy.ID]; ok {
|
|
return engine, nil
|
|
}
|
|
|
|
// 根据策略类型创建引擎
|
|
var engine Engine
|
|
var err error
|
|
|
|
switch policy.Type {
|
|
case "local":
|
|
cfg := config.AppConfig.Storage
|
|
basePath := cfg.LocalBasePath
|
|
if policy.Config.BasePath != "" {
|
|
basePath = policy.Config.BasePath
|
|
}
|
|
engine = NewLocalEngineWithCDN(basePath, cfg.CDNHost, cfg.CDNPathPrefix)
|
|
|
|
case "minio":
|
|
engine, err = NewMinIOEngine(
|
|
policy.Config.Endpoint,
|
|
policy.Config.AccessKey,
|
|
policy.Config.SecretKey,
|
|
policy.Config.Bucket,
|
|
policy.Config.UseSSL,
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("创建MinIO引擎失败: %w", err)
|
|
}
|
|
|
|
default:
|
|
// 尝试从 engines map 获取(兼容旧注册方式)
|
|
var ok bool
|
|
engine, ok = engines[policy.Type]
|
|
if !ok {
|
|
return nil, fmt.Errorf("不支持的存储类型: %s", policy.Type)
|
|
}
|
|
}
|
|
|
|
policyEngines[policy.ID] = engine
|
|
return engine, nil
|
|
}
|
|
|
|
func GetEngineByPolicyID(policyID uint64) (Engine, error) {
|
|
if engine, ok := policyEngines[policyID]; ok {
|
|
return engine, nil
|
|
}
|
|
var policy model.StoragePolicy
|
|
if err := config.DB.First(&policy, policyID).Error; err != nil {
|
|
return nil, fmt.Errorf("存储策略不存在: %d", policyID)
|
|
}
|
|
return GetEngine(&policy)
|
|
}
|
|
|
|
func GetDefaultEngine() Engine {
|
|
if engine, ok := engines["local"]; ok {
|
|
return engine
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// InitEngines 初始化所有存储引擎
|
|
func InitEngines(localBasePath string) {
|
|
cfg := config.AppConfig.Storage
|
|
|
|
// 注册默认本地存储引擎(带CDN配置)
|
|
localEngine := NewLocalEngineWithCDN(localBasePath, cfg.CDNHost, cfg.CDNPathPrefix)
|
|
Register("local", localEngine)
|
|
|
|
if cfg.CDNHost != "" {
|
|
log.Printf("CDN已启用: %s%s", cfg.CDNHost, cfg.CDNPathPrefix)
|
|
}
|
|
|
|
// 从数据库加载存储策略
|
|
var policies []model.StoragePolicy
|
|
if err := config.DB.Find(&policies).Error; err != nil {
|
|
log.Printf("加载存储策略失败: %v", err)
|
|
return
|
|
}
|
|
|
|
for _, policy := range policies {
|
|
switch policy.Type {
|
|
case "local":
|
|
basePath := localBasePath
|
|
if policy.Config.BasePath != "" {
|
|
basePath = policy.Config.BasePath
|
|
}
|
|
policyEngines[policy.ID] = NewLocalEngineWithCDN(basePath, cfg.CDNHost, cfg.CDNPathPrefix)
|
|
log.Printf("初始化本地存储: %s -> %s (CDN: %s)", policy.Name, basePath, cfg.CDNHost+cfg.CDNPathPrefix)
|
|
|
|
case "minio":
|
|
engine, err := NewMinIOEngine(
|
|
policy.Config.Endpoint,
|
|
policy.Config.AccessKey,
|
|
policy.Config.SecretKey,
|
|
policy.Config.Bucket,
|
|
policy.Config.UseSSL,
|
|
)
|
|
if err != nil {
|
|
log.Printf("初始化MinIO失败 [%s]: %v", policy.Name, err)
|
|
continue
|
|
}
|
|
policyEngines[policy.ID] = engine
|
|
log.Printf("初始化MinIO: %s -> %s/%s", policy.Name, policy.Config.Endpoint, policy.Config.Bucket)
|
|
|
|
case "s3", "oss":
|
|
log.Printf("S3/OSS暂未实现: %s", policy.Name)
|
|
}
|
|
}
|
|
|
|
log.Printf("存储引擎初始化完成, 已加载 %d 个策略", len(policyEngines))
|
|
}
|
|
|
|
func GetMinIOEngine(policyID uint64) (*MinIOEngine, error) {
|
|
engine, err := GetEngineByPolicyID(policyID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if minioEngine, ok := engine.(*MinIOEngine); ok {
|
|
return minioEngine, nil
|
|
}
|
|
return nil, fmt.Errorf("策略 %d 不是MinIO类型", policyID)
|
|
}
|