From d68d3366687c1e432a810d539be5070d93e7b8fe Mon Sep 17 00:00:00 2001 From: Awuqing <3184394176@qq.com> Date: Tue, 11 Aug 2026 16:00:58 +0800 Subject: [PATCH] fix: preserve successful storage target updates --- .../repository/backup_record_repository.go | 4 +++- .../repository/backup_record_repository_test.go | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/server/internal/repository/backup_record_repository.go b/server/internal/repository/backup_record_repository.go index 9c3cdc0..8154fd9 100644 --- a/server/internal/repository/backup_record_repository.go +++ b/server/internal/repository/backup_record_repository.go @@ -115,7 +115,9 @@ func (r *GormBackupRecordRepository) Create(ctx context.Context, item *model.Bac } func (r *GormBackupRecordRepository) Update(ctx context.Context, item *model.BackupRecord) error { - return r.db.WithContext(ctx).Save(item).Error + // Task 与 StorageTarget 是查询时预加载的只读关联。更新记录字段时忽略它们, + // 避免已加载的旧关联把刚修改的外键(例如首个成功上传目标)覆盖回去。 + return r.db.WithContext(ctx).Omit("Task", "StorageTarget").Save(item).Error } func (r *GormBackupRecordRepository) Delete(ctx context.Context, id uint) error { diff --git a/server/internal/repository/backup_record_repository_test.go b/server/internal/repository/backup_record_repository_test.go index 0b71a76..0c1c0b1 100644 --- a/server/internal/repository/backup_record_repository_test.go +++ b/server/internal/repository/backup_record_repository_test.go @@ -88,6 +88,21 @@ func TestBackupRecordRepositoryQueries(t *testing.T) { if recent[0].StorageTarget.Name != "local" { t.Fatalf("expected recent storage target to be preloaded, got %#v", recent[0].StorageTarget) } + secondTarget := &model.StorageTarget{Name: "secondary", Type: "local_disk", Enabled: true, ConfigCiphertext: "{}", ConfigVersion: 1, LastTestStatus: "unknown"} + if err := repo.db.Create(secondTarget).Error; err != nil { + t.Fatalf("seed second storage target error: %v", err) + } + stored.StorageTargetID = secondTarget.ID + if err := repo.Update(ctx, stored); err != nil { + t.Fatalf("Update storage target ID returned error: %v", err) + } + updated, err := repo.FindByID(ctx, record.ID) + if err != nil { + t.Fatalf("FindByID after update returned error: %v", err) + } + if updated == nil || updated.StorageTargetID != secondTarget.ID || updated.StorageTarget.Name != "secondary" { + t.Fatalf("expected updated storage target to remain %d, got %#v", secondTarget.ID, updated) + } total, err := repo.Count(ctx) if err != nil { t.Fatalf("Count returned error: %v", err)