Add getting all task users and reminding them
This commit is contained in:
parent
b30c6eead8
commit
67ad1d82b6
|
@ -20,6 +20,8 @@ import (
|
|||
"code.vikunja.io/api/pkg/config"
|
||||
"code.vikunja.io/api/pkg/cron"
|
||||
"code.vikunja.io/api/pkg/log"
|
||||
"code.vikunja.io/api/pkg/mail"
|
||||
"code.vikunja.io/api/pkg/user"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
@ -36,6 +38,52 @@ func (TaskReminder) TableName() string {
|
|||
return "task_reminders"
|
||||
}
|
||||
|
||||
type taskUser struct {
|
||||
Task *Task `xorm:"extends"`
|
||||
User *user.User `xorm:"extends"`
|
||||
}
|
||||
|
||||
func getTaskUsersForTasks(taskIDs []int64) (taskUsers []*taskUser, err error) {
|
||||
// Get all creators of tasks
|
||||
creators := make(map[int64]*user.User, len(taskIDs))
|
||||
err = x.
|
||||
Select("users.id, users.username, users.email, users.name").
|
||||
Join("LEFT", "tasks", "tasks.created_by_id = users.id").
|
||||
In("tasks.id", taskIDs).
|
||||
GroupBy("tasks.id, users.id, users.username, users.email, users.name").
|
||||
Find(&creators)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
assignees, err := getRawTaskAssigneesForTasks(taskIDs)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
taskMap := make(map[int64]*Task, len(taskIDs))
|
||||
err = x.In("id", taskIDs).Find(&taskMap)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, taskID := range taskIDs {
|
||||
taskUsers = append(taskUsers, &taskUser{
|
||||
Task: taskMap[taskID],
|
||||
User: creators[taskMap[taskID].CreatedByID],
|
||||
})
|
||||
}
|
||||
|
||||
for _, assignee := range assignees {
|
||||
taskUsers = append(taskUsers, &taskUser{
|
||||
Task: taskMap[assignee.TaskID],
|
||||
User: &assignee.User,
|
||||
})
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// RegisterReminderCron registers a cron function which runs every minute to check if any reminders are due the
|
||||
// next minute to send emails.
|
||||
func RegisterReminderCron() {
|
||||
|
@ -68,6 +116,28 @@ func RegisterReminderCron() {
|
|||
}
|
||||
|
||||
log.Debugf("[Task Reminder Cron] Found %d reminders", len(reminders))
|
||||
|
||||
// We're sending a reminder to everyone who is assigned to the task or has created it.
|
||||
var taskIDs []int64
|
||||
for _, r := range reminders {
|
||||
taskIDs = append(taskIDs, r.TaskID)
|
||||
}
|
||||
|
||||
users, err := getTaskUsersForTasks(taskIDs)
|
||||
if err != nil {
|
||||
log.Errorf("[Task Reminder Cron] Could not get task users to send them reminders: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, u := range users {
|
||||
data := map[string]interface{}{
|
||||
"User": u.User,
|
||||
"Task": u.Task,
|
||||
}
|
||||
|
||||
mail.SendMailWithTemplate(u.User.Email, `Reminder for "`+u.Task.Title+`"`, "reminder-email", data)
|
||||
}
|
||||
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("Could not register reminder cron: %s", err)
|
||||
|
|
|
@ -375,6 +375,12 @@ func GetTaskSimple(t *Task) (task Task, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func getTasksByIDs(taskIDs []int64) (tasks []*Task, err error) {
|
||||
tasks = []*Task{}
|
||||
err = x.In("id", taskIDs).Find(&tasks)
|
||||
return
|
||||
}
|
||||
|
||||
// GetTasksByIDs returns all tasks for a list of ids
|
||||
func (bt *BulkTask) GetTasksByIDs() (err error) {
|
||||
for _, id := range bt.IDs {
|
||||
|
|
Loading…
Reference in New Issue