fix(*): 删除闭环 - 统一服务端真相并释放画布素材关联

This commit is contained in:
ddCat committed 2026-08-25 15:22:05 +08:00
1 parent 9d848b9daa
commit d2748243d8
8 files changed
+135 -60

No files matched your search

@@ -149,6 +149,55 @@ func TestDeleteProjectUnlinksCanvasAndKeepsIndependentRecords(t *testing.T) {
}
}
func TestDeleteUserCanvasProjectDetachesTaskAndSessionScope(t *testing.T) {
service, db := newProjectDeleteTestService(t)
canvas := model.CanvasProject{ID: "canvas-delete-1", UserID: "user-1", Title: "待删除画布", PayloadJSON: `{"id":"canvas-delete-1"}`}
task := model.Task{ID: "task-canvas-delete-1", UserID: "user-1", ProjectID: canvas.ID, Status: model.TaskStatusSucceeded, Prompt: "已完成"}
session := model.Session{ID: "session-canvas-delete-1", UserID: "user-1", ProjectID: canvas.ID, Status: model.SessionStatusCompleted}
canvasLink := model.CanvasUnitLink{ID: "canvas-link-delete-1", ProjectID: "project-1", CanvasID: canvas.ID, UnitID: "unit-1", Role: "primary"}
for _, item := range []any{&canvas, &model.CanvasShare{ID: "share-canvas-delete-1", UserID: "user-1", ProjectID: canvas.ID}, &canvasLink, &task, &session} {
if err := db.Create(item).Error; err != nil {
t.Fatal(err)
}
}
if err := service.DeleteUserCanvasProject("user-1", canvas.ID); err != nil {
t.Fatal(err)
}
var storedCanvas model.CanvasProject
if err := db.First(&storedCanvas, "id = ?", canvas.ID).Error; !errors.Is(err, gorm.ErrRecordNotFound) {
t.Fatalf("canvas error = %v, want record not found", err)
}
var storedTask model.Task
if err := db.First(&storedTask, "id = ?", task.ID).Error; err != nil {
t.Fatal(err)
}
if storedTask.ProjectID != "" {
t.Fatalf("task project id = %q, want empty", storedTask.ProjectID)
}
var storedSession model.Session
if err := db.First(&storedSession, "id = ?", session.ID).Error; err != nil {
t.Fatal(err)
}
if storedSession.ProjectID != "" {
t.Fatalf("session project id = %q, want empty", storedSession.ProjectID)
}
var shareCount int64
if err := db.Model(&model.CanvasShare{}).Where("project_id = ?", canvas.ID).Count(&shareCount).Error; err != nil {
t.Fatal(err)
}
if shareCount != 0 {
t.Fatalf("canvas share count = %d, want 0", shareCount)
}
var linkCount int64
if err := db.Model(&model.CanvasUnitLink{}).Where("canvas_id = ?", canvas.ID).Count(&linkCount).Error; err != nil {
t.Fatal(err)
}
if linkCount != 0 {
t.Fatalf("canvas link count = %d, want 0", linkCount)
}
}
func TestDeleteProjectRejectsActiveProjectOrCanvasTasks(t *testing.T) {
service, db := newProjectDeleteTestService(t)
project := model.Project{ID: "project-1", UserID: "user-1", Name: "短剧", Status: model.ProjectStatusActive}