Add session handling for task relations

This commit is contained in:
kolaente 2020-12-22 23:06:41 +01:00
parent 19c5ce05f7
commit bcbae6b9e4
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
4 changed files with 27 additions and 23 deletions

View File

@ -19,6 +19,7 @@ package models
import (
"time"
"xorm.io/xorm"
"code.vikunja.io/api/pkg/user"
"code.vikunja.io/web"
@ -117,7 +118,7 @@ type RelatedTaskMap map[RelationKind][]*Task
// @Failure 400 {object} web.HTTPError "Invalid task relation object provided."
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{taskID}/relations [put]
func (rel *TaskRelation) Create(a web.Auth) error {
func (rel *TaskRelation) Create(s *xorm.Session, a web.Auth) error {
// Check if both tasks are the same
if rel.TaskID == rel.OtherTaskID {
@ -128,7 +129,7 @@ func (rel *TaskRelation) Create(a web.Auth) error {
}
// Check if the relation already exists, in one form or the other.
exists, err := x.
exists, err := s.
Where("(task_id = ? AND other_task_id = ? AND relation_kind = ?) OR (task_id = ? AND other_task_id = ? AND relation_kind = ?)",
rel.TaskID, rel.OtherTaskID, rel.RelationKind, rel.TaskID, rel.OtherTaskID, rel.RelationKind).
Exist(rel)
@ -180,7 +181,7 @@ func (rel *TaskRelation) Create(a web.Auth) error {
}
// Finally insert everything
_, err = x.Insert(&[]*TaskRelation{
_, err = s.Insert(&[]*TaskRelation{
rel,
otherRelation,
})
@ -200,9 +201,9 @@ func (rel *TaskRelation) Create(a web.Auth) error {
// @Failure 404 {object} web.HTTPError "The task relation was not found."
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{taskID}/relations [delete]
func (rel *TaskRelation) Delete() error {
func (rel *TaskRelation) Delete(s *xorm.Session) error {
// Check if the relation exists
exists, err := x.
exists, err := s.
Cols("task_id", "other_task_id", "relation_kind").
Get(rel)
if err != nil {
@ -216,6 +217,6 @@ func (rel *TaskRelation) Delete() error {
}
}
_, err = x.Delete(rel)
_, err = s.Delete(rel)
return err
}

View File

@ -17,17 +17,20 @@
package models
import "code.vikunja.io/web"
import (
"code.vikunja.io/web"
"xorm.io/xorm"
)
// CanDelete checks if a user can delete a task relation
func (rel *TaskRelation) CanDelete(a web.Auth) (bool, error) {
func (rel *TaskRelation) CanDelete(s *xorm.Session, a web.Auth) (bool, error) {
// A user can delete a relation if it can update the base task
baseTask := &Task{ID: rel.TaskID}
return baseTask.CanUpdate(a)
}
// CanCreate checks if a user can create a new relation between two relations
func (rel *TaskRelation) CanCreate(a web.Auth) (bool, error) {
func (rel *TaskRelation) CanCreate(s *xorm.Session, a web.Auth) (bool, error) {
// Check if the relation kind is valid
if !rel.RelationKind.isValid() {
return false, ErrInvalidRelationKind{Kind: rel.RelationKind}

View File

@ -34,7 +34,7 @@ func TestTaskRelation_Create(t *testing.T) {
OtherTaskID: 2,
RelationKind: RelationKindSubtask,
}
err := rel.Create(&user.User{ID: 1})
err := rel.Create(s, &user.User{ID: 1})
assert.NoError(t, err)
db.AssertExists(t, "task_relations", map[string]interface{}{
"task_id": 1,
@ -51,7 +51,7 @@ func TestTaskRelation_Create(t *testing.T) {
OtherTaskID: 13,
RelationKind: RelationKindSubtask,
}
err := rel.Create(&user.User{ID: 1})
err := rel.Create(s, &user.User{ID: 1})
assert.NoError(t, err)
db.AssertExists(t, "task_relations", map[string]interface{}{
"task_id": 1,
@ -68,7 +68,7 @@ func TestTaskRelation_Create(t *testing.T) {
OtherTaskID: 29,
RelationKind: RelationKindSubtask,
}
err := rel.Create(&user.User{ID: 1})
err := rel.Create(s, &user.User{ID: 1})
assert.Error(t, err)
assert.True(t, IsErrRelationAlreadyExists(err))
})
@ -79,7 +79,7 @@ func TestTaskRelation_Create(t *testing.T) {
TaskID: 1,
OtherTaskID: 1,
}
err := rel.Create(&user.User{ID: 1})
err := rel.Create(s, &user.User{ID: 1})
assert.Error(t, err)
assert.True(t, IsErrRelationTasksCannotBeTheSame(err))
})
@ -94,7 +94,7 @@ func TestTaskRelation_Delete(t *testing.T) {
OtherTaskID: 29,
RelationKind: RelationKindSubtask,
}
err := rel.Delete()
err := rel.Delete(s)
assert.NoError(t, err)
db.AssertMissing(t, "task_relations", map[string]interface{}{
"task_id": 1,
@ -110,7 +110,7 @@ func TestTaskRelation_Delete(t *testing.T) {
OtherTaskID: 3,
RelationKind: RelationKindSubtask,
}
err := rel.Delete()
err := rel.Delete(s)
assert.Error(t, err)
assert.True(t, IsErrRelationDoesNotExist(err))
})
@ -125,7 +125,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 2,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.NoError(t, err)
assert.True(t, can)
})
@ -137,7 +137,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 13,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.NoError(t, err)
assert.True(t, can)
})
@ -149,7 +149,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 1,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.NoError(t, err)
assert.False(t, can)
})
@ -161,7 +161,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 1,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.NoError(t, err)
assert.False(t, can)
})
@ -173,7 +173,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 14,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.NoError(t, err)
assert.False(t, can)
})
@ -185,7 +185,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 1,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.Error(t, err)
assert.True(t, IsErrTaskDoesNotExist(err))
assert.False(t, can)
@ -198,7 +198,7 @@ func TestTaskRelation_CanCreate(t *testing.T) {
OtherTaskID: 999999,
RelationKind: RelationKindSubtask,
}
can, err := rel.CanCreate(&user.User{ID: 1})
can, err := rel.CanCreate(s, &user.User{ID: 1})
assert.Error(t, err)
assert.True(t, IsErrTaskDoesNotExist(err))
assert.False(t, can)

View File

@ -145,7 +145,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err
OtherTaskID: rt.ID,
RelationKind: kind,
}
err = taskRel.Create(user)
err = taskRel.Create(s, user)
if err != nil {
return
}