Refactor ListTask to Task (#92)

This commit is contained in:
konrad 2019-08-14 20:19:04 +00:00 committed by Gitea
parent be14634e1e
commit 66cdd79666
26 changed files with 206 additions and 189 deletions

View file

@ -184,7 +184,7 @@ Sorry for some of them being in German, I'll tranlate them at some point.
* [x] Less files, but with some kind of logic
* [x] Have extra functions for logging to call so it is possible to call `log.Info` instead of `log.Log.Info`
* [x] `GetUserByID` and the likes should return pointers
* [ ] `ListTask` should be just `Task`
* [x] `ListTask` should be just `Task`
### Linters

View file

@ -70,8 +70,8 @@ func TestList(t *testing.T) {
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
// Owned by user3
_, err := testHandler.testReadOne(nil, map[string]string{"list": "2"})
// Owned by user13
_, err := testHandler.testReadOne(nil, map[string]string{"list": "20"})
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `You don't have the right to see this`)
})
@ -177,8 +177,8 @@ func TestList(t *testing.T) {
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
// Owned by user3
_, err := testHandler.testUpdate(nil, map[string]string{"list": "2"}, `{"title":"TestLoremIpsum"}`)
// Owned by user13
_, err := testHandler.testUpdate(nil, map[string]string{"list": "20"}, `{"title":"TestLoremIpsum"}`)
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
@ -260,8 +260,8 @@ func TestList(t *testing.T) {
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
// Owned by user3
_, err := testHandler.testDelete(nil, map[string]string{"list": "2"})
// Owned by user13
_, err := testHandler.testDelete(nil, map[string]string{"list": "20"})
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
@ -371,8 +371,8 @@ func TestList(t *testing.T) {
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
// Owned by user3
_, err := testHandler.testCreate(nil, map[string]string{"namespace": "3"}, `{"title":"Lorem"}`)
// Owned by user13
_, err := testHandler.testCreate(nil, map[string]string{"namespace": "15"}, `{"title":"Lorem"}`)
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})

View file

@ -25,16 +25,16 @@ import (
"testing"
)
func TestListTask(t *testing.T) {
func TestTask(t *testing.T) {
testHandler := webHandlerTest{
user: &testuser1,
strFunc: func() handler.CObject {
return &models.ListTask{}
return &models.Task{}
},
t: t,
}
// Only run specific nested tests:
// ^TestListTask$/^Update$/^Update_task_items$/^Removing_Assignees_null$
// ^TestTask$/^Update$/^Update_task_items$/^Removing_Assignees_null$
t.Run("ReadAll", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
rec, err := testHandler.testReadAll(nil, nil)
@ -333,7 +333,7 @@ func TestListTask(t *testing.T) {
t.Run("Nonexisting", func(t *testing.T) {
_, err := testHandler.testUpdate(nil, map[string]string{"listtask": "99999"}, `{"text":"Lorem Ipsum"}`)
assert.Error(t, err)
assertHandlerErrorCode(t, err, models.ErrCodeListTaskDoesNotExist)
assertHandlerErrorCode(t, err, models.ErrCodeTaskDoesNotExist)
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
@ -415,7 +415,7 @@ func TestListTask(t *testing.T) {
t.Run("Nonexisting", func(t *testing.T) {
_, err := testHandler.testDelete(nil, map[string]string{"listtask": "99999"})
assert.Error(t, err)
assertHandlerErrorCode(t, err, models.ErrCodeListTaskDoesNotExist)
assertHandlerErrorCode(t, err, models.ErrCodeTaskDoesNotExist)
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
@ -501,8 +501,8 @@ func TestListTask(t *testing.T) {
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
// Owned by user3
_, err := testHandler.testCreate(nil, map[string]string{"list": "2"}, `{"text":"Lorem Ipsum"}`)
// Owned by user13
_, err := testHandler.testCreate(nil, map[string]string{"list": "20"}, `{"text":"Lorem Ipsum"}`)
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})

View file

@ -25,8 +25,8 @@ import (
type BulkTask struct {
// A list of task ids to update
IDs []int64 `json:"task_ids"`
Tasks []*ListTask `json:"-"`
ListTask
Tasks []*Task `json:"-"`
Task
}
func (bt *BulkTask) checkIfTasksAreOnTheSameList() (err error) {
@ -72,7 +72,7 @@ func (bt *BulkTask) CanUpdate(a web.Auth) (bool, error) {
// @Produce json
// @Security JWTKeyAuth
// @Param task body models.BulkTask true "The task object. Looks like a normal task, the only difference is it uses an array of list_ids to update."
// @Success 200 {object} models.ListTask "The updated task object."
// @Success 200 {object} models.Task "The updated task object."
// @Failure 400 {object} code.vikunja.io/web.HTTPError "Invalid task object provided."
// @Failure 403 {object} code.vikunja.io/web.HTTPError "The user does not have access to the task (aka its list)"
// @Failure 500 {object} models.Message "Internal error"
@ -90,7 +90,7 @@ func (bt *BulkTask) Update() (err error) {
for _, oldtask := range bt.Tasks {
// When a repeating task is marked as done, we update all deadlines and reminders and set it as undone
updateDone(oldtask, &bt.ListTask)
updateDone(oldtask, &bt.Task)
// Update the assignees
if err := oldtask.updateTaskAssignees(bt.Assignees); err != nil {
@ -100,12 +100,12 @@ func (bt *BulkTask) Update() (err error) {
// For whatever reason, xorm dont detect if done is updated, so we need to update this every time by hand
// Which is why we merge the actual task struct with the one we got from the
// The user struct overrides values in the actual one.
if err := mergo.Merge(oldtask, &bt.ListTask, mergo.WithOverride); err != nil {
if err := mergo.Merge(oldtask, &bt.Task, mergo.WithOverride); err != nil {
return err
}
// And because a false is considered to be a null value, we need to explicitly check that case here.
if !bt.ListTask.Done {
if !bt.Task.Done {
oldtask.Done = false
}

View file

@ -7,8 +7,8 @@ import (
func TestBulkTask_Update(t *testing.T) {
type fields struct {
IDs []int64
Tasks []*ListTask
ListTask ListTask
Tasks []*Task
Task Task
User *User
}
tests := []struct {
@ -21,7 +21,7 @@ func TestBulkTask_Update(t *testing.T) {
name: "Test normal update",
fields: fields{
IDs: []int64{10, 11, 12},
ListTask: ListTask{
Task: Task{
Text: "bulkupdated",
},
User: &User{ID: 1},
@ -31,7 +31,7 @@ func TestBulkTask_Update(t *testing.T) {
name: "Test with one task on different list",
fields: fields{
IDs: []int64{10, 11, 12, 13},
ListTask: ListTask{
Task: Task{
Text: "bulkupdated",
},
User: &User{ID: 1},
@ -42,7 +42,7 @@ func TestBulkTask_Update(t *testing.T) {
name: "Test without any tasks",
fields: fields{
IDs: []int64{},
ListTask: ListTask{
Task: Task{
Text: "bulkupdated",
},
User: &User{ID: 1},
@ -55,7 +55,7 @@ func TestBulkTask_Update(t *testing.T) {
bt := &BulkTask{
IDs: tt.fields.IDs,
Tasks: tt.fields.Tasks,
ListTask: tt.fields.ListTask,
Task: tt.fields.Task,
}
allowed, _ := bt.CanUpdate(tt.fields.User)
if !allowed != tt.wantForbidden {

View file

@ -427,48 +427,48 @@ func (err ErrListTitleCannotBeEmpty) HTTPError() web.HTTPError {
// List task errors
// ================
// ErrListTaskCannotBeEmpty represents a "ErrListDoesNotExist" kind of error. Used if the list does not exist.
type ErrListTaskCannotBeEmpty struct{}
// ErrTaskCannotBeEmpty represents a "ErrListDoesNotExist" kind of error. Used if the list does not exist.
type ErrTaskCannotBeEmpty struct{}
// IsErrListTaskCannotBeEmpty checks if an error is a ErrListDoesNotExist.
func IsErrListTaskCannotBeEmpty(err error) bool {
_, ok := err.(ErrListTaskCannotBeEmpty)
// IsErrTaskCannotBeEmpty checks if an error is a ErrListDoesNotExist.
func IsErrTaskCannotBeEmpty(err error) bool {
_, ok := err.(ErrTaskCannotBeEmpty)
return ok
}
func (err ErrListTaskCannotBeEmpty) Error() string {
func (err ErrTaskCannotBeEmpty) Error() string {
return fmt.Sprintf("List task text cannot be empty.")
}
// ErrCodeListTaskCannotBeEmpty holds the unique world-error code of this error
const ErrCodeListTaskCannotBeEmpty = 4001
// ErrCodeTaskCannotBeEmpty holds the unique world-error code of this error
const ErrCodeTaskCannotBeEmpty = 4001
// HTTPError holds the http error description
func (err ErrListTaskCannotBeEmpty) HTTPError() web.HTTPError {
return web.HTTPError{HTTPCode: http.StatusBadRequest, Code: ErrCodeListTaskCannotBeEmpty, Message: "You must provide at least a list task text."}
func (err ErrTaskCannotBeEmpty) HTTPError() web.HTTPError {
return web.HTTPError{HTTPCode: http.StatusBadRequest, Code: ErrCodeTaskCannotBeEmpty, Message: "You must provide at least a list task text."}
}
// ErrListTaskDoesNotExist represents a "ErrListDoesNotExist" kind of error. Used if the list does not exist.
type ErrListTaskDoesNotExist struct {
// ErrTaskDoesNotExist represents a "ErrListDoesNotExist" kind of error. Used if the list does not exist.
type ErrTaskDoesNotExist struct {
ID int64
}
// IsErrListTaskDoesNotExist checks if an error is a ErrListDoesNotExist.
func IsErrListTaskDoesNotExist(err error) bool {
_, ok := err.(ErrListTaskDoesNotExist)
// IsErrTaskDoesNotExist checks if an error is a ErrListDoesNotExist.
func IsErrTaskDoesNotExist(err error) bool {
_, ok := err.(ErrTaskDoesNotExist)
return ok
}
func (err ErrListTaskDoesNotExist) Error() string {
func (err ErrTaskDoesNotExist) Error() string {
return fmt.Sprintf("List task does not exist. [ID: %d]", err.ID)
}
// ErrCodeListTaskDoesNotExist holds the unique world-error code of this error
const ErrCodeListTaskDoesNotExist = 4002
// ErrCodeTaskDoesNotExist holds the unique world-error code of this error
const ErrCodeTaskDoesNotExist = 4002
// HTTPError holds the http error description
func (err ErrListTaskDoesNotExist) HTTPError() web.HTTPError {
return web.HTTPError{HTTPCode: http.StatusNotFound, Code: ErrCodeListTaskDoesNotExist, Message: "This list task does not exist"}
func (err ErrTaskDoesNotExist) HTTPError() web.HTTPError {
return web.HTTPError{HTTPCode: http.StatusNotFound, Code: ErrCodeTaskDoesNotExist, Message: "This list task does not exist"}
}
// ErrBulkTasksMustBeInSameList represents a "ErrBulkTasksMustBeInSameList" kind of error.

View file

@ -152,3 +152,11 @@
namespace_id: 14
updated: 0
created: 0
-
id: 20
title: Test20
description: Lorem Ipsum
owner_id: 13
namespace_id: 15
updated: 0
created: 0

View file

@ -70,3 +70,9 @@
owner_id: 7
updated: 0
created: 0
- id: 15
name: testnamespace15
description: Lorem Ipsum
owner_id: 13
updated: 0
created: 0

View file

@ -109,7 +109,7 @@ func (lt *LabelTask) Create(a web.Auth) (err error) {
// @Router /tasks/{task}/labels [get]
func (lt *LabelTask) ReadAll(search string, a web.Auth, page int) (labels interface{}, err error) {
// Check if the user has the right to see the task
task := ListTask{ID: lt.TaskID}
task := Task{ID: lt.TaskID}
canRead, err := task.CanRead(a)
if err != nil {
return nil, err
@ -193,7 +193,7 @@ func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, err
}
// Create or update a bunch of task labels
func (t *ListTask) updateTaskLabels(creator web.Auth, labels []*Label) (err error) {
func (t *Task) updateTaskLabels(creator web.Auth, labels []*Label) (err error) {
// If we don't have any new labels, delete everything right away. Saves us some hassle.
if len(labels) == 0 && len(t.Labels) > 0 {

View file

@ -76,7 +76,7 @@ func TestLabelTask_ReadAll(t *testing.T) {
a: &User{ID: 1},
},
wantErr: true,
errType: IsErrListTaskDoesNotExist,
errType: IsErrTaskDoesNotExist,
},
}
for _, tt := range tests {
@ -168,7 +168,7 @@ func TestLabelTask_Create(t *testing.T) {
},
wantForbidden: true,
wantErr: true,
errType: IsErrListTaskDoesNotExist,
errType: IsErrTaskDoesNotExist,
},
}
for _, tt := range tests {

View file

@ -35,7 +35,7 @@ type List struct {
// The user who created this list.
Owner *User `xorm:"-" json:"owner" valid:"-"`
// An array of tasks which belong to the list.
Tasks []*ListTask `xorm:"-" json:"tasks"`
Tasks []*Task `xorm:"-" json:"tasks"`
// A unix timestamp when this list was created. You cannot change this value.
Created int64 `xorm:"created not null" json:"created"`
@ -206,7 +206,7 @@ func AddListDetails(lists []*List) (err error) {
}
// Get all tasks
ts := []*ListTask{}
ts := []*Task{}
err = x.In("list_id", listIDs).Find(&ts)
if err != nil {
return
@ -354,6 +354,6 @@ func (l *List) Delete() (err error) {
metrics.UpdateCount(-1, metrics.ListCountKey)
// Delete all todotasks on that list
_, err = x.Where("list_id = ?", l.ID).Delete(&ListTask{})
_, err = x.Where("list_id = ?", l.ID).Delete(&Task{})
return
}

View file

@ -130,6 +130,9 @@ func (l *List) checkRight(a web.Auth, rights ...Right) (bool, error) {
))
}
// If the user is the owner of a namespace, it has any right, all the time
conds = append(conds, builder.Eq{"n.owner_id": a.GetID()})
exists, err := x.Select("l.*").
Table("list").
Alias("l").

View file

@ -36,7 +36,7 @@ func GetTables() []interface{} {
return []interface{}{
&User{},
&List{},
&ListTask{},
&Task{},
&Team{},
&TeamMember{},
&TeamList{},
@ -44,7 +44,7 @@ func GetTables() []interface{} {
&Namespace{},
&ListUser{},
&NamespaceUser{},
&ListTaskAssginee{},
&TaskAssginee{},
&Label{},
&LabelTask{},
&TaskReminder{},

View file

@ -330,7 +330,7 @@ func (n *Namespace) Delete() (err error) {
}
// Delete tasks
_, err = x.In("list_id", listIDs).Delete(&ListTask{})
_, err = x.In("list_id", listIDs).Delete(&Task{})
if err != nil {
return
}

View file

@ -20,8 +20,8 @@ import (
"code.vikunja.io/web"
)
// ListTaskAssginee represents an assignment of a user to a task
type ListTaskAssginee struct {
// TaskAssginee represents an assignment of a user to a task
type TaskAssginee struct {
ID int64 `xorm:"int(11) autoincr not null unique pk" json:"-"`
TaskID int64 `xorm:"int(11) INDEX not null" json:"-" param:"listtask"`
UserID int64 `xorm:"int(11) INDEX not null" json:"user_id" param:"user"`
@ -32,18 +32,18 @@ type ListTaskAssginee struct {
}
// TableName makes a pretty table name
func (ListTaskAssginee) TableName() string {
func (TaskAssginee) TableName() string {
return "task_assignees"
}
// ListTaskAssigneeWithUser is a helper type to deal with user joins
type ListTaskAssigneeWithUser struct {
// TaskAssigneeWithUser is a helper type to deal with user joins
type TaskAssigneeWithUser struct {
TaskID int64
User `xorm:"extends"`
}
func getRawTaskAssigneesForTasks(taskIDs []int64) (taskAssignees []*ListTaskAssigneeWithUser, err error) {
taskAssignees = []*ListTaskAssigneeWithUser{nil}
func getRawTaskAssigneesForTasks(taskIDs []int64) (taskAssignees []*TaskAssigneeWithUser, err error) {
taskAssignees = []*TaskAssigneeWithUser{nil}
err = x.Table("task_assignees").
Select("task_id, users.*").
In("task_id", taskIDs).
@ -53,12 +53,12 @@ func getRawTaskAssigneesForTasks(taskIDs []int64) (taskAssignees []*ListTaskAssi
}
// Create or update a bunch of task assignees
func (t *ListTask) updateTaskAssignees(assignees []*User) (err error) {
func (t *Task) updateTaskAssignees(assignees []*User) (err error) {
// If we don't have any new assignees, delete everything right away. Saves us some hassle.
if len(assignees) == 0 && len(t.Assignees) > 0 {
_, err = x.Where("task_id = ?", t.ID).
Delete(ListTaskAssginee{})
Delete(TaskAssginee{})
t.setTaskAssignees(assignees)
return err
}
@ -96,7 +96,7 @@ func (t *ListTask) updateTaskAssignees(assignees []*User) (err error) {
if len(assigneesToDelete) > 0 {
_, err = x.In("user_id", assigneesToDelete).
And("task_id = ?", t.ID).
Delete(ListTaskAssginee{})
Delete(TaskAssginee{})
if err != nil {
return err
}
@ -131,7 +131,7 @@ func (t *ListTask) updateTaskAssignees(assignees []*User) (err error) {
}
// Small helper functions to set the new assignees in various places
func (t *ListTask) setTaskAssignees(assignees []*User) {
func (t *Task) setTaskAssignees(assignees []*User) {
if len(assignees) == 0 {
t.Assignees = nil
return
@ -152,8 +152,8 @@ func (t *ListTask) setTaskAssignees(assignees []*User) {
// @Failure 403 {object} code.vikunja.io/web.HTTPError "Not allowed to delete the assignee."
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{taskID}/assignees/{userID} [delete]
func (la *ListTaskAssginee) Delete() (err error) {
_, err = x.Delete(&ListTaskAssginee{TaskID: la.TaskID, UserID: la.UserID})
func (la *TaskAssginee) Delete() (err error) {
_, err = x.Delete(&TaskAssginee{TaskID: la.TaskID, UserID: la.UserID})
if err != nil {
return err
}
@ -169,13 +169,13 @@ func (la *ListTaskAssginee) Delete() (err error) {
// @Accept json
// @Produce json
// @Security JWTKeyAuth
// @Param assignee body models.ListTaskAssginee true "The assingee object"
// @Param assignee body models.TaskAssginee true "The assingee object"
// @Param taskID path int true "Task ID"
// @Success 200 {object} models.ListTaskAssginee "The created assingee object."
// @Success 200 {object} models.TaskAssginee "The created assingee object."
// @Failure 400 {object} code.vikunja.io/web.HTTPError "Invalid assignee object provided."
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{taskID}/assignees [put]
func (la *ListTaskAssginee) Create(a web.Auth) (err error) {
func (la *TaskAssginee) Create(a web.Auth) (err error) {
// Get the list to perform later checks
list, err := GetListSimplByTaskID(la.TaskID)
@ -183,11 +183,11 @@ func (la *ListTaskAssginee) Create(a web.Auth) (err error) {
return
}
task := &ListTask{ID: la.TaskID}
task := &Task{ID: la.TaskID}
return task.addNewAssigneeByID(la.UserID, list)
}
func (t *ListTask) addNewAssigneeByID(newAssigneeID int64, list *List) (err error) {
func (t *Task) addNewAssigneeByID(newAssigneeID int64, list *List) (err error) {
// Check if the user exists and has access to the list
newAssignee, err := GetUserByID(newAssigneeID)
if err != nil {
@ -201,7 +201,7 @@ func (t *ListTask) addNewAssigneeByID(newAssigneeID int64, list *List) (err erro
return ErrUserDoesNotHaveAccessToList{list.ID, newAssigneeID}
}
_, err = x.Insert(ListTaskAssginee{
_, err = x.Insert(TaskAssginee{
TaskID: t.ID,
UserID: newAssigneeID,
})
@ -225,7 +225,7 @@ func (t *ListTask) addNewAssigneeByID(newAssigneeID int64, list *List) (err erro
// @Success 200 {array} models.User "The assignees"
// @Failure 500 {object} models.Message "Internal error"
// @Router /labels [get]
func (la *ListTaskAssginee) ReadAll(search string, a web.Auth, page int) (interface{}, error) {
func (la *TaskAssginee) ReadAll(search string, a web.Auth, page int) (interface{}, error) {
var taskAssignees []*User
err := x.Table("task_assignees").
Select("users.*").
@ -255,7 +255,7 @@ type BulkAssignees struct {
// @Security JWTKeyAuth
// @Param assignee body models.BulkAssignees true "The array of assignees"
// @Param taskID path int true "Task ID"
// @Success 200 {object} models.ListTaskAssginee "The created assingees object."
// @Success 200 {object} models.TaskAssginee "The created assingees object."
// @Failure 400 {object} code.vikunja.io/web.HTTPError "Invalid assignee object provided."
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{taskID}/assignees/bulk [post]

View file

@ -21,21 +21,21 @@ import (
)
// CanCreate checks if a user can add a new assignee
func (la *ListTaskAssginee) CanCreate(a web.Auth) (bool, error) {
return canDoListTaskAssingee(la.TaskID, a)
func (la *TaskAssginee) CanCreate(a web.Auth) (bool, error) {
return canDoTaskAssingee(la.TaskID, a)
}
// CanCreate checks if a user can add a new assignee
func (ba *BulkAssignees) CanCreate(a web.Auth) (bool, error) {
return canDoListTaskAssingee(ba.TaskID, a)
return canDoTaskAssingee(ba.TaskID, a)
}
// CanDelete checks if a user can delete an assignee
func (la *ListTaskAssginee) CanDelete(a web.Auth) (bool, error) {
return canDoListTaskAssingee(la.TaskID, a)
func (la *TaskAssginee) CanDelete(a web.Auth) (bool, error) {
return canDoTaskAssingee(la.TaskID, a)
}
func canDoListTaskAssingee(taskID int64, a web.Auth) (bool, error) {
func canDoTaskAssingee(taskID int64, a web.Auth) (bool, error) {
// Check if the current user can edit the list
list, err := GetListSimplByTaskID(taskID)
if err != nil {

View file

@ -15,7 +15,7 @@ import (
"code.vikunja.io/web"
)
func sortTasksForTesting(by SortBy) (tasks []*ListTask) {
func sortTasksForTesting(by SortBy) (tasks []*Task) {
user1 := &User{
ID: 1,
Username: "user1",
@ -37,7 +37,7 @@ func sortTasksForTesting(by SortBy) (tasks []*ListTask) {
AvatarURL: "3efbe51f864c6666bc27caf4c6ff90ed", // hash for ""
}
tasks = []*ListTask{
tasks = []*Task{
{
ID: 1,
Text: "task #1",
@ -341,7 +341,7 @@ func sortTasksForTesting(by SortBy) (tasks []*ListTask) {
return
}
func TestListTask_ReadAll(t *testing.T) {
func TestTask_ReadAll(t *testing.T) {
assert.NoError(t, LoadFixtures())
// Dummy users
@ -368,7 +368,7 @@ func TestListTask_ReadAll(t *testing.T) {
Sorting string
StartDateSortUnix int64
EndDateSortUnix int64
Subtasks []*ListTask
Subtasks []*Task
Created int64
Updated int64
CreatedBy *User
@ -388,7 +388,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr bool
}{
{
name: "ReadAll ListTasks normally",
name: "ReadAll Tasks normally",
fields: fields{},
args: args{
search: "",
@ -399,7 +399,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by priority (desc)",
name: "ReadAll Tasks sorted by priority (desc)",
fields: fields{
Sorting: "priority",
},
@ -412,7 +412,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by priority asc",
name: "ReadAll Tasks sorted by priority asc",
fields: fields{
Sorting: "priorityasc",
},
@ -425,7 +425,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by priority desc",
name: "ReadAll Tasks sorted by priority desc",
fields: fields{
Sorting: "prioritydesc",
},
@ -438,7 +438,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by due date default desc",
name: "ReadAll Tasks sorted by due date default desc",
fields: fields{
Sorting: "duedate",
},
@ -451,7 +451,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by due date asc",
name: "ReadAll Tasks sorted by due date asc",
fields: fields{
Sorting: "duedateasc",
},
@ -464,7 +464,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks sorted by due date desc",
name: "ReadAll Tasks sorted by due date desc",
fields: fields{
Sorting: "duedatedesc",
},
@ -478,7 +478,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks with range",
name: "ReadAll Tasks with range",
fields: fields{
StartDateSortUnix: 1544500000,
EndDateSortUnix: 1544600000,
@ -488,7 +488,7 @@ func TestListTask_ReadAll(t *testing.T) {
a: &User{ID: 1},
page: 0,
},
want: []*ListTask{
want: []*Task{
{
ID: 7,
Text: "task #7 with start date",
@ -514,7 +514,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks with range",
name: "ReadAll Tasks with range",
fields: fields{
StartDateSortUnix: 1544700000,
EndDateSortUnix: 1545000000,
@ -524,7 +524,7 @@ func TestListTask_ReadAll(t *testing.T) {
a: &User{ID: 1},
page: 0,
},
want: []*ListTask{
want: []*Task{
{
ID: 8,
Text: "task #8 with end date",
@ -550,7 +550,7 @@ func TestListTask_ReadAll(t *testing.T) {
wantErr: false,
},
{
name: "ReadAll ListTasks with range without end date",
name: "ReadAll Tasks with range without end date",
fields: fields{
StartDateSortUnix: 1544700000,
},
@ -559,7 +559,7 @@ func TestListTask_ReadAll(t *testing.T) {
a: &User{ID: 1},
page: 0,
},
want: []*ListTask{
want: []*Task{
{
ID: 8,
Text: "task #8 with end date",
@ -587,7 +587,7 @@ func TestListTask_ReadAll(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
lt := &ListTask{
lt := &Task{
ID: tt.fields.ID,
Text: tt.fields.Text,
Description: tt.fields.Description,
@ -611,7 +611,7 @@ func TestListTask_ReadAll(t *testing.T) {
}
got, err := lt.ReadAll(tt.args.search, tt.args.a, tt.args.page)
if (err != nil) != tt.wantErr {
t.Errorf("Test %s, ListTask.ReadAll() error = %v, wantErr %v", tt.name, err, tt.wantErr)
t.Errorf("Test %s, Task.ReadAll() error = %v, wantErr %v", tt.name, err, tt.wantErr)
return
}
if diff, equal := messagediff.PrettyDiff(got, tt.want); !equal {

View file

@ -25,8 +25,8 @@ import (
"time"
)
// ListTask represents an task in a todolist
type ListTask struct {
// Task represents an task in a todolist
type Task struct {
// The unique, numeric id of this task.
ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"listtask"`
// The task text. This is what you'll see in the list.
@ -69,7 +69,7 @@ type ListTask struct {
EndDateSortUnix int64 `xorm:"-" json:"-" query:"enddate"`
// An array of subtasks.
Subtasks []*ListTask `xorm:"-" json:"subtasks"`
Subtasks []*Task `xorm:"-" json:"subtasks"`
// A unix timestamp when this task was created. You cannot change this value.
Created int64 `xorm:"created not null" json:"created"`
@ -84,7 +84,7 @@ type ListTask struct {
}
// TableName returns the table name for listtasks
func (ListTask) TableName() string {
func (Task) TableName() string {
return "tasks"
}
@ -125,10 +125,10 @@ const (
// @Param startdate query int false "The start date parameter to filter by. Expects a unix timestamp. If no end date, but a start date is specified, the end date is set to the current time."
// @Param enddate query int false "The end date parameter to filter by. Expects a unix timestamp. If no start date, but an end date is specified, the start date is set to the current time."
// @Security JWTKeyAuth
// @Success 200 {array} models.ListTask "The tasks"
// @Success 200 {array} models.Task "The tasks"
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/all [get]
func (t *ListTask) ReadAll(search string, a web.Auth, page int) (interface{}, error) {
func (t *Task) ReadAll(search string, a web.Auth, page int) (interface{}, error) {
var sortby SortBy
switch t.Sorting {
case "priority":
@ -151,7 +151,7 @@ func (t *ListTask) ReadAll(search string, a web.Auth, page int) (interface{}, er
}
//GetTasksByUser returns all tasks for a user
func GetTasksByUser(search string, u *User, page int, sortby SortBy, startDate time.Time, endDate time.Time) ([]*ListTask, error) {
func GetTasksByUser(search string, u *User, page int, sortby SortBy, startDate time.Time, endDate time.Time) ([]*Task, error) {
// Get all lists
lists, err := getRawListsForUser("", u, page)
if err != nil {
@ -176,7 +176,7 @@ func GetTasksByUser(search string, u *User, page int, sortby SortBy, startDate t
orderby = "due_date_unix asc"
}
taskMap := make(map[int64]*ListTask)
taskMap := make(map[int64]*Task)
// Then return all tasks for that lists
if startDate.Unix() != 0 || endDate.Unix() != 0 {
@ -222,7 +222,7 @@ func GetTasksByUser(search string, u *User, page int, sortby SortBy, startDate t
return tasks, err
}
func sortTasks(tasks []*ListTask, by SortBy) {
func sortTasks(tasks []*Task, by SortBy) {
switch by {
case SortTasksByPriorityDesc:
sort.Slice(tasks, func(i, j int) bool {
@ -244,9 +244,9 @@ func sortTasks(tasks []*ListTask, by SortBy) {
}
// GetTasksByListID gets all todotasks for a list
func GetTasksByListID(listID int64) (tasks []*ListTask, err error) {
func GetTasksByListID(listID int64) (tasks []*Task, err error) {
// make a map so we can put in a lot of other stuff more easily
taskMap := make(map[int64]*ListTask, len(tasks))
taskMap := make(map[int64]*Task, len(tasks))
err = x.Where("list_id = ?", listID).Find(&taskMap)
if err != nil {
return
@ -257,30 +257,30 @@ func GetTasksByListID(listID int64) (tasks []*ListTask, err error) {
}
// GetTaskByIDSimple returns a raw task without extra data by the task ID
func GetTaskByIDSimple(taskID int64) (task ListTask, err error) {
func GetTaskByIDSimple(taskID int64) (task Task, err error) {
if taskID < 1 {
return ListTask{}, ErrListTaskDoesNotExist{taskID}
return Task{}, ErrTaskDoesNotExist{taskID}
}
return GetTaskSimple(&ListTask{ID: taskID})
return GetTaskSimple(&Task{ID: taskID})
}
// GetTaskSimple returns a raw task without extra data
func GetTaskSimple(t *ListTask) (task ListTask, err error) {
func GetTaskSimple(t *Task) (task Task, err error) {
task = *t
exists, err := x.Get(&task)
if err != nil {
return ListTask{}, err
return Task{}, err
}
if !exists {
return ListTask{}, ErrListTaskDoesNotExist{t.ID}
return Task{}, ErrTaskDoesNotExist{t.ID}
}
return
}
// GetTaskByID returns all tasks a list has
func GetTaskByID(listTaskID int64) (listTask ListTask, err error) {
func GetTaskByID(listTaskID int64) (listTask Task, err error) {
listTask, err = GetTaskByIDSimple(listTaskID)
if err != nil {
return
@ -321,11 +321,11 @@ func GetTaskByID(listTaskID int64) (listTask ListTask, err error) {
func (bt *BulkTask) GetTasksByIDs() (err error) {
for _, id := range bt.IDs {
if id < 1 {
return ErrListTaskDoesNotExist{id}
return ErrTaskDoesNotExist{id}
}
}
taskMap := make(map[int64]*ListTask, len(bt.Tasks))
taskMap := make(map[int64]*Task, len(bt.Tasks))
err = x.In("id", bt.IDs).Find(&taskMap)
if err != nil {
return
@ -336,8 +336,8 @@ func (bt *BulkTask) GetTasksByIDs() (err error) {
}
// GetTasksByUIDs gets all tasks from a bunch of uids
func GetTasksByUIDs(uids []string) (tasks []*ListTask, err error) {
taskMap := make(map[int64]*ListTask)
func GetTasksByUIDs(uids []string) (tasks []*Task, err error) {
taskMap := make(map[int64]*Task)
err = x.In("uid", uids).Find(&taskMap)
if err != nil {
return
@ -349,7 +349,7 @@ func GetTasksByUIDs(uids []string) (tasks []*ListTask, err error) {
// This function takes a map with pointers and returns a slice with pointers to tasks
// It adds more stuff like assignees/labels/etc to a bunch of tasks
func addMoreInfoToTasks(taskMap map[int64]*ListTask) (tasks []*ListTask, err error) {
func addMoreInfoToTasks(taskMap map[int64]*Task) (tasks []*Task, err error) {
// No need to iterate over users and stuff if the list doesn't has tasks
if len(taskMap) == 0 {
@ -430,7 +430,7 @@ func addMoreInfoToTasks(taskMap map[int64]*ListTask) (tasks []*ListTask, err err
}
// make a complete slice from the map
tasks = []*ListTask{}
tasks = []*Task{}
for _, t := range taskMap {
tasks = append(tasks, t)
}
@ -453,19 +453,19 @@ func addMoreInfoToTasks(taskMap map[int64]*ListTask) (tasks []*ListTask, err err
// @Produce json
// @Security JWTKeyAuth
// @Param id path int true "List ID"
// @Param task body models.ListTask true "The task object"
// @Success 200 {object} models.ListTask "The created task object."
// @Param task body models.Task true "The task object"
// @Success 200 {object} models.Task "The created task object."
// @Failure 400 {object} code.vikunja.io/web.HTTPError "Invalid task object provided."
// @Failure 403 {object} code.vikunja.io/web.HTTPError "The user does not have access to the list"
// @Failure 500 {object} models.Message "Internal error"
// @Router /lists/{id} [put]
func (t *ListTask) Create(a web.Auth) (err error) {
func (t *Task) Create(a web.Auth) (err error) {
t.ID = 0
// Check if we have at least a text
if t.Text == "" {
return ErrListTaskCannotBeEmpty{}
return ErrTaskCannotBeEmpty{}
}
// Check if the list exists
@ -514,13 +514,13 @@ func (t *ListTask) Create(a web.Auth) (err error) {
// @Produce json
// @Security JWTKeyAuth
// @Param id path int true "Task ID"
// @Param task body models.ListTask true "The task object"
// @Success 200 {object} models.ListTask "The updated task object."
// @Param task body models.Task true "The task object"
// @Success 200 {object} models.Task "The updated task object."
// @Failure 400 {object} code.vikunja.io/web.HTTPError "Invalid task object provided."
// @Failure 403 {object} code.vikunja.io/web.HTTPError "The user does not have access to the task (aka its list)"
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{id} [post]
func (t *ListTask) Update() (err error) {
func (t *Task) Update() (err error) {
// Check if the task exists
ot, err := GetTaskByID(t.ID)
if err != nil {
@ -634,7 +634,7 @@ func (t *ListTask) Update() (err error) {
// This helper function updates the reminders and doneAtUnix of the *old* task (since that's the one we're inserting
// with updated values into the db)
func updateDone(oldTask *ListTask, newTask *ListTask) {
func updateDone(oldTask *Task, newTask *Task) {
if !oldTask.Done && newTask.Done && oldTask.RepeatAfter > 0 {
oldTask.DueDateUnix = oldTask.DueDateUnix + oldTask.RepeatAfter // assuming we'll save the old task (merged)
@ -657,7 +657,7 @@ func updateDone(oldTask *ListTask, newTask *ListTask) {
// Creates or deletes all necessary remindes without unneded db operations.
// The parameter is a slice with unix dates which holds the new reminders.
func (t *ListTask) updateReminders(reminders []int64) (err error) {
func (t *Task) updateReminders(reminders []int64) (err error) {
// If we're removing everything, delete all reminders right away
if len(reminders) == 0 && len(t.RemindersUnix) > 0 {
@ -701,7 +701,7 @@ func (t *ListTask) updateReminders(reminders []int64) (err error) {
if len(remindersToDelete) > 0 {
_, err = x.In("reminder_unix", remindersToDelete).
And("task_id = ?", t.ID).
Delete(ListTaskAssginee{})
Delete(TaskAssginee{})
if err != nil {
return err
}
@ -743,7 +743,7 @@ func (t *ListTask) updateReminders(reminders []int64) (err error) {
// @Failure 403 {object} code.vikunja.io/web.HTTPError "The user does not have access to the list"
// @Failure 500 {object} models.Message "Internal error"
// @Router /tasks/{id} [delete]
func (t *ListTask) Delete() (err error) {
func (t *Task) Delete() (err error) {
// Check if it exists
_, err = GetTaskByID(t.ID)
@ -751,12 +751,12 @@ func (t *ListTask) Delete() (err error) {
return
}
if _, err = x.ID(t.ID).Delete(ListTask{}); err != nil {
if _, err = x.ID(t.ID).Delete(Task{}); err != nil {
return err
}
// Delete assignees
if _, err = x.Where("task_id = ?", t.ID).Delete(ListTaskAssginee{}); err != nil {
if _, err = x.Where("task_id = ?", t.ID).Delete(TaskAssginee{}); err != nil {
return err
}

View file

@ -21,25 +21,25 @@ import (
)
// CanDelete checks if the user can delete an task
func (t *ListTask) CanDelete(a web.Auth) (bool, error) {
return t.canDoListTask(a)
func (t *Task) CanDelete(a web.Auth) (bool, error) {
return t.canDoTask(a)
}
// CanUpdate determines if a user has the right to update a list task
func (t *ListTask) CanUpdate(a web.Auth) (bool, error) {
return t.canDoListTask(a)
func (t *Task) CanUpdate(a web.Auth) (bool, error) {
return t.canDoTask(a)
}
// CanCreate determines if a user has the right to create a list task
func (t *ListTask) CanCreate(a web.Auth) (bool, error) {
func (t *Task) CanCreate(a web.Auth) (bool, error) {
// A user can do a task if he has write acces to its list
l := &List{ID: t.ListID}
return l.CanWrite(a)
}
// CanRead determines if a user can read a task
func (t *ListTask) CanRead(a web.Auth) (canRead bool, err error) {
//return t.canDoListTask(a)
func (t *Task) CanRead(a web.Auth) (canRead bool, err error) {
//return t.canDoTask(a)
// Get the task, error out if it doesn't exist
*t, err = GetTaskByIDSimple(t.ID)
if err != nil {
@ -52,7 +52,7 @@ func (t *ListTask) CanRead(a web.Auth) (canRead bool, err error) {
}
// Helper function to check if a user can do stuff on a list task
func (t *ListTask) canDoListTask(a web.Auth) (bool, error) {
func (t *Task) canDoTask(a web.Auth) (bool, error) {
// Get the task
lI, err := GetTaskByIDSimple(t.ID)
if err != nil {

View file

@ -21,11 +21,11 @@ import (
"testing"
)
func TestListTask_Create(t *testing.T) {
func TestTask_Create(t *testing.T) {
//assert.NoError(t, LoadFixtures())
// Fake list task
listtask := ListTask{
listtask := Task{
Text: "Lorem",
Description: "Lorem Ipsum BACKERY",
ListID: 1,
@ -63,13 +63,13 @@ func TestListTask_Create(t *testing.T) {
listtask.ID = 0
err = listtask.Delete()
assert.Error(t, err)
assert.True(t, IsErrListTaskDoesNotExist(err))
assert.True(t, IsErrTaskDoesNotExist(err))
// Try adding a list task with an empty text
listtask.Text = ""
err = listtask.Create(doer)
assert.Error(t, err)
assert.True(t, IsErrListTaskCannotBeEmpty(err))
assert.True(t, IsErrTaskCannotBeEmpty(err))
// Try adding one to a nonexistant list
listtask.ListID = 99993939
@ -82,7 +82,7 @@ func TestListTask_Create(t *testing.T) {
listtask.ID = 94829352
err = listtask.Update()
assert.Error(t, err)
assert.True(t, IsErrListTaskDoesNotExist(err))
assert.True(t, IsErrTaskDoesNotExist(err))
// Try inserting an task with a nonexistant user
nUser := &User{ID: 9482385}
@ -94,14 +94,14 @@ func TestListTask_Create(t *testing.T) {
func TestUpdateDone(t *testing.T) {
t.Run("marking a task as done", func(t *testing.T) {
oldTask := &ListTask{Done: false}
newTask := &ListTask{Done: true}
oldTask := &Task{Done: false}
newTask := &Task{Done: true}
updateDone(oldTask, newTask)
assert.NotEqual(t, int64(0), oldTask.DoneAtUnix)
})
t.Run("unmarking a task as done", func(t *testing.T) {
oldTask := &ListTask{Done: true}
newTask := &ListTask{Done: false}
oldTask := &Task{Done: true}
newTask := &Task{Done: false}
updateDone(oldTask, newTask)
assert.Equal(t, int64(0), oldTask.DoneAtUnix)
})

View file

@ -100,7 +100,7 @@ func TaskHandler(c echo.Context) error {
storage := &VikunjaCaldavListStorage{
list: &models.List{ID: listID},
task: &models.ListTask{UID: taskUID},
task: &models.Task{UID: taskUID},
user: &u,
}

View file

@ -37,7 +37,7 @@ type VikunjaCaldavListStorage struct {
// Used when handling a list
list *models.List
// Used when handling a single task, like updating
task *models.ListTask
task *models.Task
// The current user
user *models.User
isPrincipal bool
@ -176,7 +176,7 @@ func (vcls *VikunjaCaldavListStorage) GetResourcesByFilters(rpath string, filter
//return vcls.GetResources(rpath, false)
}
func getTaskURL(task *models.ListTask) string {
func getTaskURL(task *models.Task) string {
return ListBasePath + "/" + strconv.FormatInt(task.ListID, 10) + `/` + task.UID + `.ics`
}
@ -187,9 +187,9 @@ func (vcls *VikunjaCaldavListStorage) GetResource(rpath string) (*data.Resource,
if vcls.task != nil {
// save and override the updated unix date to not break any later etag checks
updated := vcls.task.Updated
task, err := models.GetTaskSimple(&models.ListTask{ID: vcls.task.ID, UID: vcls.task.UID})
task, err := models.GetTaskSimple(&models.Task{ID: vcls.task.ID, UID: vcls.task.UID})
if err != nil {
if models.IsErrListTaskDoesNotExist(err) {
if models.IsErrTaskDoesNotExist(err) {
return nil, false, errs.ResourceNotFoundError
}
return nil, false, err
@ -316,7 +316,7 @@ func (vcls *VikunjaCaldavListStorage) DeleteResource(rpath string) error {
// VikunjaListResourceAdapter holds the actual resource
type VikunjaListResourceAdapter struct {
list *models.List
task *models.ListTask
task *models.Task
isPrincipal bool
isCollection bool
@ -356,7 +356,7 @@ func (vlra *VikunjaListResourceAdapter) GetContent() string {
}
if vlra.task != nil {
list := models.List{Tasks: []*models.ListTask{vlra.task}}
list := models.List{Tasks: []*models.Task{vlra.task}}
return getCaldavTodosForTasks(&list)
}

View file

@ -59,7 +59,7 @@ func getCaldavTodosForTasks(list *models.List) string {
return caldav.ParseTodos(caldavConfig, caldavtodos)
}
func parseTaskFromVTODO(content string) (vTask *models.ListTask, err error) {
func parseTaskFromVTODO(content string) (vTask *models.Task, err error) {
parsed, err := ical.ParseCalendar(content)
if err != nil {
return nil, err
@ -89,7 +89,7 @@ func parseTaskFromVTODO(content string) (vTask *models.ListTask, err error) {
// Parse the enddate
duration, _ := time.ParseDuration(task["DURATION"])
vTask = &models.ListTask{
vTask = &models.Task{
UID: task["UID"],
Text: task["SUMMARY"],
Description: task["DESCRIPTION"],

View file

@ -55,7 +55,7 @@ func setupMetrics(a *echo.Group) {
},
{
metrics.TaskCountKey,
models.ListTask{},
models.Task{},
},
{
metrics.TeamCountKey,

View file

@ -196,7 +196,7 @@ func registerAPIRoutes(a *echo.Group) {
taskHandler := &handler.WebHandler{
EmptyStruct: func() handler.CObject {
return &models.ListTask{}
return &models.Task{}
},
}
a.PUT("/lists/:list", taskHandler.CreateWeb)
@ -213,7 +213,7 @@ func registerAPIRoutes(a *echo.Group) {
assigneeTaskHandler := &handler.WebHandler{
EmptyStruct: func() handler.CObject {
return &models.ListTaskAssginee{}
return &models.TaskAssginee{}
},
}
a.PUT("/tasks/:listtask/assignees", assigneeTaskHandler.CreateWeb)

View file

@ -488,7 +488,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
}
],
@ -497,7 +497,7 @@ var doc = `{
"description": "The created task object.",
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"400": {
@ -2393,7 +2393,7 @@ var doc = `{
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
}
},
@ -2442,7 +2442,7 @@ var doc = `{
"description": "The updated task object.",
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"400": {
@ -2502,7 +2502,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
}
],
@ -2511,7 +2511,7 @@ var doc = `{
"description": "The updated task object.",
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"400": {
@ -2618,7 +2618,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTaskAssginee"
"$ref": "#/definitions/models.TaskAssginee"
}
},
{
@ -2634,7 +2634,7 @@ var doc = `{
"description": "The created assingee object.",
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTaskAssginee"
"$ref": "#/definitions/models.TaskAssginee"
}
},
"400": {
@ -2696,7 +2696,7 @@ var doc = `{
"description": "The created assingees object.",
"schema": {
"type": "object",
"$ref": "#/definitions/models.ListTaskAssginee"
"$ref": "#/definitions/models.TaskAssginee"
}
},
"400": {
@ -3803,7 +3803,7 @@ var doc = `{
"description": "An array of subtasks.",
"type": "array",
"items": {
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"task_ids": {
@ -3920,7 +3920,7 @@ var doc = `{
"description": "An array of tasks which belong to the list.",
"type": "array",
"items": {
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"title": {
@ -3935,7 +3935,7 @@ var doc = `{
}
}
},
"models.ListTask": {
"models.Task": {
"type": "object",
"properties": {
"assignees": {
@ -4021,7 +4021,7 @@ var doc = `{
"description": "An array of subtasks.",
"type": "array",
"items": {
"$ref": "#/definitions/models.ListTask"
"$ref": "#/definitions/models.Task"
}
},
"text": {
@ -4036,7 +4036,7 @@ var doc = `{
}
}
},
"models.ListTaskAssginee": {
"models.TaskAssginee": {
"type": "object",
"properties": {
"created": {