@@ -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
|
||||
|
||||
42
backend/internal/service/settings_test.go
Normal file
42
backend/internal/service/settings_test.go
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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 停用后正确回退平台存储。
|
||||
|
||||
Reference in New Issue
Block a user