diff --git a/pkg/models/list.go b/pkg/models/list.go index 2292d6c2d..8b61dad1d 100644 --- a/pkg/models/list.go +++ b/pkg/models/list.go @@ -287,6 +287,13 @@ func GetListSimplByTaskID(taskID int64) (l *List, err error) { return &list, nil } +// GetListsByIDs returns a map of lists from a slice with list ids +func GetListsByIDs(listIDs []int64) (lists map[int64]*List, err error) { + lists = make(map[int64]*List, len(listIDs)) + err = x.In("id", listIDs).Find(&lists) + return +} + type listOptions struct { search string user *user.User diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index deb73aeb2..58be285e7 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -431,26 +431,8 @@ func (t *Task) setIdentifier(list *List) { t.Identifier = list.Identifier + "-" + strconv.FormatInt(t.Index, 10) } -// 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]*Task) (err error) { - - // No need to iterate over users and stuff if the list doesn't has tasks - if len(taskMap) == 0 { - return - } - - // Get all users & task ids and put them into the array - var userIDs []int64 - var taskIDs []int64 - var listIDs []int64 - for _, i := range taskMap { - taskIDs = append(taskIDs, i.ID) - userIDs = append(userIDs, i.CreatedByID) - listIDs = append(listIDs, i.ListID) - } - - // Get all assignees +// Get all assignees +func addAssigneesToTasks(taskIDs []int64, taskMap map[int64]*Task) (err error) { taskAssignees, err := getRawTaskAssigneesForTasks(taskIDs) if err != nil { return @@ -463,7 +445,11 @@ func addMoreInfoToTasks(taskMap map[int64]*Task) (err error) { } } - // Get all labels for all the tasks + return +} + +// Get all labels for all the tasks +func addLabelsToTasks(taskIDs []int64, taskMap map[int64]*Task) (err error) { labels, _, _, err := getLabelsByTaskIDs(&LabelByTaskIDsOptions{ TaskIDs: taskIDs, Page: -1, @@ -477,29 +463,24 @@ func addMoreInfoToTasks(taskMap map[int64]*Task) (err error) { } } - // Get task attachments + return +} + +// Get task attachments +func addAttachmentsToTasks(taskIDs []int64, taskMap map[int64]*Task) (err error) { attachments, err := getTaskAttachmentsByTaskIDs(taskIDs) if err != nil { return } - // Get all users of a task - // aka the ones who created a task - users := make(map[int64]*user.User) - err = x.In("id", userIDs).Find(&users) - if err != nil { - return - } - - // Obfuscate all user emails - for _, u := range users { - u.Email = "" - } - - // Put the users and files in task attachments for _, a := range attachments { taskMap[a.TaskID].Attachments = append(taskMap[a.TaskID].Attachments, a) } + return +} + +func getTaskReminderMap(taskIDs []int64) (taskReminders map[int64][]time.Time, err error) { + taskReminders = make(map[int64][]time.Time) // Get all reminders and put them in a map to have it easier later reminders, err := getRemindersForTasks(taskIDs) @@ -507,35 +488,14 @@ func addMoreInfoToTasks(taskMap map[int64]*Task) (err error) { return } - taskReminders := make(map[int64][]time.Time) for _, r := range reminders { taskReminders[r.TaskID] = append(taskReminders[r.TaskID], r.Reminder) } - // Get all identifiers - lists := make(map[int64]*List, len(listIDs)) - err = x.In("id", listIDs).Find(&lists) - if err != nil { - return - } + return +} - // Add all user objects to the appropriate tasks - for _, task := range taskMap { - - // Make created by user objects - task.CreatedBy = users[task.CreatedByID] - - // Add the reminders - task.Reminders = taskReminders[task.ID] - - // Prepare the subtasks - task.RelatedTasks = make(RelatedTaskMap) - - // Build the task identifier from the list identifier and task index - task.setIdentifier(lists[task.ListID]) - } - - // Get all related tasks +func addRelatedTasksToTasks(taskIDs []int64, taskMap map[int64]*Task) (err error) { relatedTasks := []*TaskRelation{} err = x.In("task_id", taskIDs).Find(&relatedTasks) if err != nil { @@ -563,6 +523,77 @@ func addMoreInfoToTasks(taskMap map[int64]*Task) (err error) { return } +// 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]*Task) (err error) { + + // No need to iterate over users and stuff if the list doesn't have tasks + if len(taskMap) == 0 { + return + } + + // Get all users & task ids and put them into the array + var userIDs []int64 + var taskIDs []int64 + var listIDs []int64 + for _, i := range taskMap { + taskIDs = append(taskIDs, i.ID) + userIDs = append(userIDs, i.CreatedByID) + listIDs = append(listIDs, i.ListID) + } + + err = addAssigneesToTasks(taskIDs, taskMap) + if err != nil { + return + } + + err = addLabelsToTasks(taskIDs, taskMap) + if err != nil { + return + } + + err = addAttachmentsToTasks(taskIDs, taskMap) + if err != nil { + return + } + + users, err := user.GetUsersByIDs(userIDs) + if err != nil { + return + } + + taskReminders, err := getTaskReminderMap(taskIDs) + if err != nil { + return err + } + + // Get all identifiers + lists, err := GetListsByIDs(listIDs) + if err != nil { + return err + } + + // Add all objects to their tasks + for _, task := range taskMap { + + // Make created by user objects + task.CreatedBy = users[task.CreatedByID] + + // Add the reminders + task.Reminders = taskReminders[task.ID] + + // Prepare the subtasks + task.RelatedTasks = make(RelatedTaskMap) + + // Build the task identifier from the list identifier and task index + task.setIdentifier(lists[task.ListID]) + } + + // Get all related tasks + err = addRelatedTasksToTasks(taskIDs, taskMap) + return +} + func checkBucketAndTaskBelongToSameList(s *xorm.Session, fullTask *Task, bucketID int64) (err error) { if bucketID != 0 { b, err := getBucketByID(s, bucketID) diff --git a/pkg/user/user.go b/pkg/user/user.go index 0195aeafe..1fba49848 100644 --- a/pkg/user/user.go +++ b/pkg/user/user.go @@ -141,6 +141,22 @@ func GetUserWithEmail(user *User) (userOut *User, err error) { return getUser(user, true) } +// GetUsersByIDs returns a map of users from a slice of user ids +func GetUsersByIDs(userIDs []int64) (users map[int64]*User, err error) { + users = make(map[int64]*User) + err = x.In("id", userIDs).Find(&users) + if err != nil { + return + } + + // Obfuscate all user emails + for _, u := range users { + u.Email = "" + } + + return +} + // getUser is a small helper function to avoid having duplicated code for almost the same use case func getUser(user *User, withEmail bool) (userOut *User, err error) { userOut = &User{} // To prevent a panic if user is nil