From 5e8084c194381f5d9c71a340914eb10addb90002 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 23 Aug 2023 16:19:42 +0200 Subject: [PATCH] fix(project): duplicating a project should not create two backlog buckets Resolves https://community.vikunja.io/t/when-duplicating-a-project-the-resulting-project-has-an-extra-bucket/1524 --- pkg/models/project.go | 22 ++++++++++++---------- pkg/models/project_duplicate.go | 2 +- pkg/models/project_duplicate_test.go | 8 ++++++++ pkg/models/project_test.go | 3 +++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/pkg/models/project.go b/pkg/models/project.go index 12e95f655..8105445e2 100644 --- a/pkg/models/project.go +++ b/pkg/models/project.go @@ -680,7 +680,7 @@ func checkProjectBeforeUpdateOrDelete(s *xorm.Session, project *Project) (err er return nil } -func CreateProject(s *xorm.Session, project *Project, auth web.Auth) (err error) { +func CreateProject(s *xorm.Session, project *Project, auth web.Auth, createBacklogBucket bool) (err error) { err = project.CheckIsArchived(s) if err != nil { return err @@ -715,14 +715,16 @@ func CreateProject(s *xorm.Session, project *Project, auth web.Auth) (err error) } } - // Create a new first bucket for this project - b := &Bucket{ - ProjectID: project.ID, - Title: "Backlog", - } - err = b.Create(s, auth) - if err != nil { - return + if createBacklogBucket { + // Create a new first bucket for this project + b := &Bucket{ + ProjectID: project.ID, + Title: "Backlog", + } + err = b.Create(s, auth) + if err != nil { + return + } } return events.Dispatch(&ProjectCreatedEvent{ @@ -928,7 +930,7 @@ func updateProjectByTaskID(s *xorm.Session, taskID int64) (err error) { // @Failure 500 {object} models.Message "Internal error" // @Router /projects [put] func (p *Project) Create(s *xorm.Session, a web.Auth) (err error) { - err = CreateProject(s, p, a) + err = CreateProject(s, p, a, true) if err != nil { return } diff --git a/pkg/models/project_duplicate.go b/pkg/models/project_duplicate.go index 8321f1766..6aab4707c 100644 --- a/pkg/models/project_duplicate.go +++ b/pkg/models/project_duplicate.go @@ -81,7 +81,7 @@ func (pd *ProjectDuplicate) Create(s *xorm.Session, doer web.Auth) (err error) { pd.Project.ParentProjectID = pd.ParentProjectID // Set the owner to the current user pd.Project.OwnerID = doer.GetID() - if err := CreateProject(s, pd.Project, doer); err != nil { + if err := CreateProject(s, pd.Project, doer, false); err != nil { // If there is no available unique project identifier, just reset it. if IsErrProjectIdentifierIsNotUnique(err) { pd.Project.Identifier = "" diff --git a/pkg/models/project_duplicate_test.go b/pkg/models/project_duplicate_test.go index 0768c20b1..21112cf67 100644 --- a/pkg/models/project_duplicate_test.go +++ b/pkg/models/project_duplicate_test.go @@ -44,6 +44,14 @@ func TestProjectDuplicate(t *testing.T) { assert.True(t, can) err = l.Create(s, u) assert.NoError(t, err) + + // assert the new project has the same number of buckets as the old one + numberOfOriginalBuckets, err := s.Where("project_id = ?", l.ProjectID).Count(&Bucket{}) + assert.NoError(t, err) + numberOfDuplicatedBuckets, err := s.Where("project_id = ?", l.Project.ID).Count(&Bucket{}) + assert.NoError(t, err) + assert.Equal(t, numberOfOriginalBuckets, numberOfDuplicatedBuckets, "duplicated project does not have the same amount of buckets as the original one") + // To make this test 100% useful, it would need to assert a lot more stuff, but it is good enough for now. // Also, we're lacking utility functions to do all needed assertions. } diff --git a/pkg/models/project_test.go b/pkg/models/project_test.go index ba796fac0..58ce42623 100644 --- a/pkg/models/project_test.go +++ b/pkg/models/project_test.go @@ -51,6 +51,9 @@ func TestProject_CreateOrUpdate(t *testing.T) { "description": project.Description, "parent_project_id": 0, }, false) + db.AssertExists(t, "buckets", map[string]interface{}{ + "project_id": project.ID, + }, false) }) t.Run("nonexistant parent project", func(t *testing.T) { db.LoadAndAssertFixtures(t)