From b3b360481cba454403cee1053f7f0dfb86c91988 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Mon, 31 Aug 2026 15:14:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(media):=20=E5=AD=98=E5=82=A8=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=20-=20=E4=BF=AE=E5=A4=8D=E6=9C=AA=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=20OSS=20=E9=85=8D=E7=BD=AE=E6=97=B6=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #361 --- backend/internal/service/settings.go | 4 +- backend/internal/service/settings_test.go | 42 +++++++++++++++++++++ docs/content/docs/progress/pending-test.mdx | 2 + 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 backend/internal/service/settings_test.go diff --git a/backend/internal/service/settings.go b/backend/internal/service/settings.go index 7100d4b7d..1ba4f057f 100644 --- a/backend/internal/service/settings.go +++ b/backend/internal/service/settings.go @@ -259,7 +259,7 @@ func (s *Service) UpdateUserOSSSetting(actor *model.User, req OSSSettingRequest) func (s *Service) readOSSSetting() (*model.SystemSetting, ossSettingValue, error) { setting, err := s.repo.SystemSetting(ossSettingKey) if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, defaultOSSSetting(), nil + return nil, normalizeOSSSetting(defaultOSSSetting()), nil } if err != nil { return nil, ossSettingValue{}, err @@ -294,7 +294,7 @@ func (s *Service) readOSSSetting() (*model.SystemSetting, ossSettingValue, error func (s *Service) readUserOSSSetting(userID string) (*model.UserOSSSetting, ossSettingValue, error) { setting, err := s.repo.LatestUserOSSSetting(userID) if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, defaultOSSSetting(), nil + return nil, normalizeOSSSetting(defaultOSSSetting()), nil } if err != nil { return nil, ossSettingValue{}, err diff --git a/backend/internal/service/settings_test.go b/backend/internal/service/settings_test.go new file mode 100644 index 000000000..eecb8b20b --- /dev/null +++ b/backend/internal/service/settings_test.go @@ -0,0 +1,42 @@ +package service + +import ( + "testing" + + "infinite-canvas/backend/internal/model" + "infinite-canvas/backend/internal/repository" + + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +func TestMissingOSSSettingsReturnNormalizedDefaults(t *testing.T) { + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) + if err != nil { + t.Fatal(err) + } + if err := db.AutoMigrate(&model.SystemSetting{}, &model.UserOSSSetting{}, &model.StorageLocation{}); err != nil { + t.Fatal(err) + } + svc := New(repository.New(db), t.TempDir()) + admin := &model.User{ID: "admin", Role: model.UserRoleAdmin} + + platformSetting, err := svc.AdminOSSSetting(admin) + if err != nil { + t.Fatal(err) + } + assertDefaultOSSSetting(t, platformSetting) + + userSetting, err := svc.UserOSSSetting(&model.User{ID: "user-1"}) + if err != nil { + t.Fatal(err) + } + assertDefaultOSSSetting(t, userSetting) +} + +func assertDefaultOSSSetting(t *testing.T, value *PublicOSSSetting) { + t.Helper() + if value.Provider != aliyunOSSProvider || value.PathPrefix != defaultOSSPathPrefix || value.S3Preset != "custom" { + t.Fatalf("default OSS setting = %+v", value) + } +} diff --git a/docs/content/docs/progress/pending-test.mdx b/docs/content/docs/progress/pending-test.mdx index fe87ca44f..6901d2b8e 100644 --- a/docs/content/docs/progress/pending-test.mdx +++ b/docs/content/docs/progress/pending-test.mdx @@ -418,6 +418,8 @@ description: 影策已实现功能的手工验证清单与未确认边界 - [x] 后端 S3 单次上传、Range 读取、预签名地址、Session Token、幂等删除、配置版本和迁移清单自动化测试通过。 - [x] 前端 S3 预设、关键字段重测判断、默认 `open-ai-canvas` 路径前缀、TypeScript 检查和生产构建通过。 +- [x] 平台或用户从未保存 OSS 配置时,后端统一返回标准化默认值(含 `s3Preset: custom`);缺省读取回归测试与后端全量测试通过。 +- [ ] 使用全新数据库登录管理员并打开 `/admin/settings/storage`,确认页面直接显示服务器本地存储且可切换阿里云 OSS、腾讯云 COS、七牛云 Kodo 和 S3 兼容存储。 - [ ] 分别使用 AWS S3、Cloudflare R2、Backblaze B2 和 RustFS 完成写入、Range 读取、删除及历史资源恢复验证。 - [ ] 验证 Path Style 开启时强制路径寻址,关闭时 AWS 使用虚拟主机寻址、其他自定义 Endpoint 自动使用路径寻址。 - [ ] 验证平台切换到本机后只影响新上传,历史 S3 资源仍可读取和删除;个人 S3 停用后正确回退平台存储。