refactor(backend): split project write responsibilities

This commit is contained in:
2026-07-21 15:27:11 +08:00
parent 9e862f2a7f
commit 1fcbb31301
18 changed files with 1025 additions and 649 deletions

View File

@@ -203,73 +203,6 @@ func TestWorkspaceRejectsProjectOwnedByAnotherUser(t *testing.T) {
require.Error(t, err)
}
func TestCreateTaskAddsTaskToOwnedProject(t *testing.T) {
database := newTestDB(t)
service := NewService()
require.NoError(t, database.Create(&models.SenlinAgentUser{Email: "david@example.com", DisplayName: "David", PasswordHash: "hash"}).Error)
project, err := service.CreateProject(1, "Alpha", "")
require.NoError(t, err)
dueAt := time.Date(2026, 7, 21, 9, 30, 0, 0, time.UTC)
task, err := service.CreateTask(1, project.ID, CreateTaskInput{
Title: "Follow up with client",
Description: "整理客户反馈并形成行动项",
Status: "",
DueAt: &dueAt,
Tag: "客户反馈",
})
require.NoError(t, err)
require.Equal(t, project.ID, task.ProjectID)
require.Equal(t, uint(1), task.CreatedBy)
require.Equal(t, "Follow up with client", task.Title)
require.Equal(t, "open", task.Status)
require.NotNil(t, task.DueAt)
require.NotNil(t, task.TagID)
workspace, err := service.Workspace(1, project.Identity)
require.NoError(t, err)
require.Len(t, workspace.Tasks, 1)
require.Equal(t, "Follow up with client", workspace.Tasks[0].Title)
require.Equal(t, "客户反馈", workspace.Tasks[0].Tag)
require.Equal(t, []string{"客户反馈"}, workspaceTagNames(workspace.Tags))
}
func TestCreateTaskRejectsProjectOwnedByAnotherUser(t *testing.T) {
newTestDB(t)
service := NewService()
project, err := service.CreateProject(2, "Beta", "")
require.NoError(t, err)
_, err = service.CreateTask(1, project.ID, CreateTaskInput{Title: "Nope"})
require.Error(t, err)
}
func TestUpdateTaskPersistsTagAndCompletion(t *testing.T) {
newTestDB(t)
service := NewService()
require.NoError(t, models.DBService.Create(&models.SenlinAgentUser{Email: "david@example.com", DisplayName: "David", PasswordHash: "hash"}).Error)
project, err := service.CreateProject(1, "Alpha", "")
require.NoError(t, err)
task, err := service.CreateTask(1, project.ID, CreateTaskInput{Title: "Draft proposal", Tag: "客户"})
require.NoError(t, err)
updated, err := service.UpdateTask(1, project.ID, task.ID, UpdateTaskInput{
Title: "Draft proposal v2",
Description: "Updated scope",
Completed: true,
Tag: "重要",
})
require.NoError(t, err)
require.Equal(t, "Draft proposal v2", updated.Title)
require.Equal(t, "done", updated.Status)
workspace, err := service.Workspace(1, project.Identity)
require.NoError(t, err)
require.Equal(t, "重要", workspace.Tasks[0].Tag)
require.Equal(t, []string{"客户", "重要"}, workspaceTagNames(workspace.Tags))
}
func TestCreateProjectTagAddsTagToOwnedProject(t *testing.T) {
newTestDB(t)
service := NewService()
@@ -297,28 +230,6 @@ func TestCreateProjectTagRejectsProjectOwnedByAnotherUser(t *testing.T) {
require.Error(t, err)
}
func TestCreateFileSourceAddsSourceToOwnedProject(t *testing.T) {
database := newTestDB(t)
service := NewService()
project, err := service.CreateProject(1, "Alpha", "")
require.NoError(t, err)
source, err := service.CreateFileSource(1, project.ID, CreateFileSourceInput{
Title: "客户访谈.pdf",
FilePath: "projects/1/客户访谈.pdf",
})
require.NoError(t, err)
require.Equal(t, project.ID, source.ProjectID)
require.Equal(t, uint(1), source.CreatedBy)
require.Equal(t, "file", source.Kind)
require.Equal(t, "客户访谈.pdf", source.Title)
require.Equal(t, "projects/1/客户访谈.pdf", source.FilePath)
var count int64
require.NoError(t, database.Model(&models.SenlinAgentSource{}).Where("project_id = ? AND kind = ?", project.ID, "file").Count(&count).Error)
require.Equal(t, int64(1), count)
}
func TestCreateCronPlanAddsPlanToOwnedProject(t *testing.T) {
database := newTestDB(t)
service := NewService()