支持 S3 兼容对象存储 (#336)

* feat(storage): 支持 S3 对象存储

* fix(storage): 补齐 S3 对象文件后缀
This commit is contained in:
Rou
2026-08-27 22:16:08 +08:00
committed by GitHub
parent d42e392ed7
commit 21b69d8bc7
25 changed files with 1374 additions and 88 deletions

View File

@@ -221,6 +221,12 @@ func migrations() []tableMigration {
migrateTable[model.EmailVerificationCode]("email_verification_codes"),
migrateTable[model.ModelChannel]("model_channels"),
migrateTable[model.ChannelModel]("channel_models"),
migrateTable[model.ChannelModelPriceTier]("channel_model_price_tiers"),
migrateTable[model.IDSequence]("id_sequences"),
migrateTable[model.LogicalModel]("logical_models"),
migrateTable[model.LogicalModelRevision]("logical_model_revisions"),
migrateTable[model.LogicalModelRoute]("logical_model_routes"),
migrateTable[model.RouteAttempt]("route_attempts"),
migrateTable[model.ApiCallLog]("api_call_logs"),
migrateTable[model.ModelPricing]("model_pricings"),
migrateTable[model.CreditAccount]("credit_accounts"),
@@ -231,13 +237,19 @@ func migrations() []tableMigration {
migrateTable[model.AdminAuditEvent]("admin_audit_events"),
migrateTable[model.UserDailyActivity]("user_daily_activities"),
migrateTable[model.SystemSetting]("system_settings"),
migrateTable[model.PluginPlatformState]("plugin_platform_states"),
migrateTable[model.UserPluginState]("user_plugin_states"),
migrateTable[model.ArkPrivateAssetBinding]("ark_private_asset_bindings"),
migrateTable[model.UserOSSSetting]("user_oss_settings"),
migrateTable[model.StorageLocation]("storage_locations"),
migrateTable[model.UserDailyUploadUsage]("user_daily_upload_usages"),
migrateTable[model.Skill]("skills"),
migrateTable[model.UserSkillState]("user_skill_states"),
migrateTable[model.Resource]("resources"),
migrateTable[model.ResourceDeletionJob]("resource_deletion_jobs"),
migrateTable[model.Asset]("assets"),
migrateTable[model.ProjectAssetLink]("project_asset_links"),
migrateTable[model.ProjectAssetFolder]("project_asset_folders"),
migrateTable[model.ProjectAssetCandidate]("project_asset_candidates"),
migrateTable[model.AssetVersion]("asset_versions"),
migrateTable[model.AssetRepresentation]("asset_representations"),
@@ -266,5 +278,7 @@ func migrations() []tableMigration {
migrateTable[model.TaskLog]("task_logs"),
migrateTable[model.SessionFile]("session_files"),
migrateTable[model.Result]("results"),
migrateTable[model.ComfyBridge]("comfy_bridges"),
migrateTable[model.ComfyBridgeRequest]("comfy_bridge_requests"),
}
}

View File

@@ -0,0 +1,36 @@
package main
import (
"sync"
"testing"
"infinite-canvas/backend/internal/database"
"gorm.io/gorm/schema"
)
func TestMigrationListCoversSchemaModels(t *testing.T) {
want := make(map[string]bool, len(database.Models()))
cache := &sync.Map{}
for _, value := range database.Models() {
parsed, err := schema.Parse(value, cache, schema.NamingStrategy{})
if err != nil {
t.Fatal(err)
}
want[parsed.Table] = false
}
for _, migration := range migrations() {
if _, exists := want[migration.name]; !exists {
t.Fatalf("migration list contains unknown table %q", migration.name)
}
if want[migration.name] {
t.Fatalf("migration list contains duplicate table %q", migration.name)
}
want[migration.name] = true
}
for table, covered := range want {
if !covered {
t.Errorf("migration list is missing table %q", table)
}
}
}