diff --git a/pkg/models/kanban.go b/pkg/models/kanban.go index 47d05231a..e24f9361b 100644 --- a/pkg/models/kanban.go +++ b/pkg/models/kanban.go @@ -97,14 +97,14 @@ func getDefaultBucket(s *xorm.Session, listID int64) (bucket *Bucket, err error) // @Success 200 {array} models.Bucket "The buckets with their tasks" // @Failure 500 {object} models.Message "Internal server error" // @Router /lists/{id}/buckets [get] -func (b *Bucket) ReadAll(auth web.Auth, search string, page int, perPage int) (result interface{}, resultCount int, numberOfTotalItems int64, err error) { +func (b *Bucket) ReadAll(s *xorm.Session, auth web.Auth, search string, page int, perPage int) (result interface{}, resultCount int, numberOfTotalItems int64, err error) { // Note: I'm ignoring pagination for now since I've yet to figure out a way on how to make it work // I'll probably just don't do it and instead make individual tasks archivable. // Get all buckets for this list buckets := []*Bucket{} - err = x.Where("list_id = ?", b.ListID).Find(&buckets) + err = s.Where("list_id = ?", b.ListID).Find(&buckets) if err != nil { return } @@ -119,7 +119,7 @@ func (b *Bucket) ReadAll(auth web.Auth, search string, page int, perPage int) (r // Get all users users := make(map[int64]*user.User) - err = x.In("id", userIDs).Find(&users) + err = s.In("id", userIDs).Find(&users) if err != nil { return } @@ -132,7 +132,7 @@ func (b *Bucket) ReadAll(auth web.Auth, search string, page int, perPage int) (r b.TaskCollection.ListID = b.ListID b.TaskCollection.OrderBy = []string{string(orderAscending)} b.TaskCollection.SortBy = []string{taskPropertyPosition} - ts, _, _, err := b.TaskCollection.ReadAll(auth, "", -1, 0) + ts, _, _, err := b.TaskCollection.ReadAll(s, auth, "", -1, 0) if err != nil { return } @@ -168,10 +168,10 @@ func (b *Bucket) ReadAll(auth web.Auth, search string, page int, perPage int) (r // @Failure 404 {object} web.HTTPError "The list does not exist." // @Failure 500 {object} models.Message "Internal error" // @Router /lists/{id}/buckets [put] -func (b *Bucket) Create(a web.Auth) (err error) { +func (b *Bucket) Create(s *xorm.Session, a web.Auth) (err error) { b.CreatedByID = a.GetID() - _, err = x.Insert(b) + _, err = s.Insert(b) return } @@ -190,8 +190,8 @@ func (b *Bucket) Create(a web.Auth) (err error) { // @Failure 404 {object} web.HTTPError "The bucket does not exist." // @Failure 500 {object} models.Message "Internal error" // @Router /lists/{listID}/buckets/{bucketID} [post] -func (b *Bucket) Update() (err error) { - _, err = x.Where("id = ?", b.ID).Update(b) +func (b *Bucket) Update(s *xorm.Session) (err error) { + _, err = s.Where("id = ?", b.ID).Update(b) return } @@ -208,14 +208,11 @@ func (b *Bucket) Update() (err error) { // @Failure 404 {object} web.HTTPError "The bucket does not exist." // @Failure 500 {object} models.Message "Internal error" // @Router /lists/{listID}/buckets/{bucketID} [delete] -func (b *Bucket) Delete() (err error) { - - s := x.NewSession() +func (b *Bucket) Delete(s *xorm.Session) (err error) { // Prevent removing the last bucket total, err := s.Where("list_id = ?", b.ListID).Count(&Bucket{}) if err != nil { - _ = s.Rollback() return } if total <= 1 { @@ -228,23 +225,19 @@ func (b *Bucket) Delete() (err error) { // Remove the bucket itself _, err = s.Where("id = ?", b.ID).Delete(&Bucket{}) if err != nil { - _ = s.Rollback() return } // Get the default bucket defaultBucket, err := getDefaultBucket(s, b.ListID) if err != nil { - _ = s.Rollback() return } // Remove all associations of tasks to that bucket - _, err = s.Where("bucket_id = ?", b.ID).Cols("bucket_id").Update(&Task{BucketID: defaultBucket.ID}) - if err != nil { - _ = s.Rollback() - return - } - - return s.Commit() + _, err = s. + Where("bucket_id = ?", b.ID). + Cols("bucket_id"). + Update(&Task{BucketID: defaultBucket.ID}) + return } diff --git a/pkg/models/kanban_rights.go b/pkg/models/kanban_rights.go index cd0987863..acf10bb3c 100644 --- a/pkg/models/kanban_rights.go +++ b/pkg/models/kanban_rights.go @@ -16,30 +16,33 @@ package models -import "code.vikunja.io/web" +import ( + "code.vikunja.io/web" + "xorm.io/xorm" +) // CanCreate checks if a user can create a new bucket -func (b *Bucket) CanCreate(a web.Auth) (bool, error) { +func (b *Bucket) CanCreate(s *xorm.Session, a web.Auth) (bool, error) { l := &List{ID: b.ListID} - return l.CanWrite(nil, a) + return l.CanWrite(s, a) } // CanUpdate checks if a user can update an existing bucket -func (b *Bucket) CanUpdate(a web.Auth) (bool, error) { - return b.canDoBucket(a) +func (b *Bucket) CanUpdate(s *xorm.Session, a web.Auth) (bool, error) { + return b.canDoBucket(s, a) } // CanDelete checks if a user can delete an existing bucket -func (b *Bucket) CanDelete(a web.Auth) (bool, error) { - return b.canDoBucket(a) +func (b *Bucket) CanDelete(s *xorm.Session, a web.Auth) (bool, error) { + return b.canDoBucket(s, a) } // canDoBucket checks if the bucket exists and if the user has the right to act on it -func (b *Bucket) canDoBucket(a web.Auth) (bool, error) { - bb, err := getBucketByID(x.NewSession(), b.ID) +func (b *Bucket) canDoBucket(s *xorm.Session, a web.Auth) (bool, error) { + bb, err := getBucketByID(s, b.ID) if err != nil { return false, err } l := &List{ID: bb.ListID} - return l.CanWrite(nil, a) + return l.CanWrite(s, a) } diff --git a/pkg/models/kanban_test.go b/pkg/models/kanban_test.go index 58d5e61d5..06a3cb1cc 100644 --- a/pkg/models/kanban_test.go +++ b/pkg/models/kanban_test.go @@ -30,7 +30,7 @@ func TestBucket_ReadAll(t *testing.T) { testuser := &user.User{ID: 1} b := &Bucket{ListID: 1} - bucketsInterface, _, _, err := b.ReadAll(testuser, "", 0, 0) + bucketsInterface, _, _, err := b.ReadAll(s, testuser, "", 0, 0) assert.NoError(t, err) buckets, is := bucketsInterface.([]*Bucket) @@ -76,7 +76,7 @@ func TestBucket_ReadAll(t *testing.T) { FilterValue: []string{"done"}, }, } - bucketsInterface, _, _, err := b.ReadAll(testuser, "", 0, 0) + bucketsInterface, _, _, err := b.ReadAll(s, testuser, "", 0, 0) assert.NoError(t, err) buckets := bucketsInterface.([]*Bucket) @@ -92,7 +92,7 @@ func TestBucket_Delete(t *testing.T) { ID: 2, // The second bucket only has 3 tasks ListID: 1, } - err := b.Delete() + err := b.Delete(s) assert.NoError(t, err) // Assert all tasks have been moved to bucket 1 as that one is the first @@ -111,7 +111,7 @@ func TestBucket_Delete(t *testing.T) { ID: 34, ListID: 18, } - err := b.Delete() + err := b.Delete(s) assert.Error(t, err) assert.True(t, IsErrCannotRemoveLastBucket(err)) db.AssertExists(t, "buckets", map[string]interface{}{ diff --git a/pkg/models/list.go b/pkg/models/list.go index ea6cf15c8..532fa18dc 100644 --- a/pkg/models/list.go +++ b/pkg/models/list.go @@ -595,7 +595,7 @@ func (l *List) Create(s *xorm.Session, a web.Auth) (err error) { ListID: l.ID, Title: "New Bucket", } - return b.Create(a) + return b.Create(s, a) } // Delete implements the delete method of CRUDable diff --git a/pkg/models/list_duplicate.go b/pkg/models/list_duplicate.go index 5bc3f2b8f..c3a6b752b 100644 --- a/pkg/models/list_duplicate.go +++ b/pkg/models/list_duplicate.go @@ -98,7 +98,7 @@ func (ld *ListDuplicate) Create(a web.Auth) (err error) { oldID := b.ID b.ID = 0 b.ListID = ld.List.ID - if err := b.Create(a); err != nil { + if err := b.Create(s, a); err != nil { return err } bucketMap[oldID] = b.ID diff --git a/pkg/modules/migration/create_from_structure.go b/pkg/modules/migration/create_from_structure.go index b6f69503b..e3e5ff0b1 100644 --- a/pkg/modules/migration/create_from_structure.go +++ b/pkg/modules/migration/create_from_structure.go @@ -87,7 +87,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err oldID := bucket.ID bucket.ID = 0 // We want a new id bucket.ListID = l.ID - err = bucket.Create(user) + err = bucket.Create(s, user) if err != nil { return } @@ -204,12 +204,12 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err // All tasks brought their own bucket with them, therefore the newly created default bucket is just extra space if !needsDefaultBucket { b := &models.Bucket{ListID: l.ID} - bucketsIn, _, _, err := b.ReadAll(user, "", 1, 1) + bucketsIn, _, _, err := b.ReadAll(s, user, "", 1, 1) if err != nil { return err } buckets := bucketsIn.([]*models.Bucket) - err = buckets[0].Delete() + err = buckets[0].Delete(s) if err != nil { return err }