Add session handling for task relations
This commit is contained in:
parent
19c5ce05f7
commit
bcbae6b9e4
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue