diff --git a/pkg/models/kanban.go b/pkg/models/kanban.go index 597420a97..0b6adaffc 100644 --- a/pkg/models/kanban.go +++ b/pkg/models/kanban.go @@ -310,7 +310,7 @@ func (b *Bucket) Update(s *xorm.Session, _ web.Auth) (err error) { // @Failure 404 {object} web.HTTPError "The bucket does not exist." // @Failure 500 {object} models.Message "Internal error" // @Router /projects/{projectID}/buckets/{bucketID} [delete] -func (b *Bucket) Delete(s *xorm.Session, _ web.Auth) (err error) { +func (b *Bucket) Delete(s *xorm.Session, a web.Auth) (err error) { // Prevent removing the last bucket total, err := s.Where("project_id = ?", b.ProjectID).Count(&Bucket{}) @@ -324,17 +324,27 @@ func (b *Bucket) Delete(s *xorm.Session, _ web.Auth) (err error) { } } - // Remove the bucket itself - _, err = s.Where("id = ?", b.ID).Delete(&Bucket{}) - if err != nil { - return - } - // Get the default bucket p, err := GetProjectSimpleByID(s, b.ProjectID) if err != nil { return } + var updateProject bool + if b.ID == p.DefaultBucketID { + p.DefaultBucketID = 0 + updateProject = true + } + if b.ID == p.DoneBucketID { + p.DoneBucketID = 0 + updateProject = true + } + if updateProject { + err = p.Update(s, a) + if err != nil { + return + } + } + defaultBucketID, err := getDefaultBucketID(s, p) if err != nil { return err @@ -345,5 +355,11 @@ func (b *Bucket) Delete(s *xorm.Session, _ web.Auth) (err error) { Where("bucket_id = ?", b.ID). Cols("bucket_id"). Update(&Task{BucketID: defaultBucketID}) + if err != nil { + return + } + + // Remove the bucket itself + _, err = s.Where("id = ?", b.ID).Delete(&Bucket{}) return } diff --git a/pkg/models/kanban_test.go b/pkg/models/kanban_test.go index e972b126b..c997d9d18 100644 --- a/pkg/models/kanban_test.go +++ b/pkg/models/kanban_test.go @@ -197,6 +197,23 @@ func TestBucket_Delete(t *testing.T) { "project_id": 18, }, false) }) + t.Run("done bucket should be reset", func(t *testing.T) { + db.LoadAndAssertFixtures(t) + s := db.NewSession() + defer s.Close() + + b := &Bucket{ + ID: 3, + ProjectID: 1, + } + err := b.Delete(s, user) + require.NoError(t, err) + + db.AssertMissing(t, "projects", map[string]interface{}{ + "id": 1, + "done_bucket_id": 3, + }) + }) } func TestBucket_Update(t *testing.T) {