// Vikunja is a to-do list application to facilitate your life. // Copyright 2018-present Vikunja and contributors. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public Licensee as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public Licensee for more details. // // You should have received a copy of the GNU Affero General Public Licensee // along with this program. If not, see . package models import ( "sort" "strconv" "time" "code.vikunja.io/api/pkg/utils" "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/notifications" "code.vikunja.io/api/pkg/user" ) // ReminderDueNotification represents a ReminderDueNotification notification type ReminderDueNotification struct { User *user.User `json:"user,omitempty"` Task *Task `json:"task"` Project *Project `json:"project"` } // ToMail returns the mail notification for ReminderDueNotification func (n *ReminderDueNotification) ToMail() *notifications.Mail { return notifications.NewMail(). To(n.User.Email). Subject(`Recordatorio para "`+n.Task.Title+`" (`+n.Project.Title+`)`). Greeting("Hola "+n.User.GetName()+","). Line(`Este es un amigable recordatorio de la tarea "`+n.Task.Title+`" (`+n.Project.Title+`).`). Action("Abrir Tarea", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)). Line("¡Qué tengas un buen día!") } // ToDB returns the ReminderDueNotification notification in a format which can be saved in the db func (n *ReminderDueNotification) ToDB() interface{} { return &ReminderDueNotification{ Task: n.Task, Project: n.Project, } } // Name returns the name of the notification func (n *ReminderDueNotification) Name() string { return "task.reminder" } // TaskCommentNotification represents a TaskCommentNotification notification type TaskCommentNotification struct { Doer *user.User `json:"doer"` Task *Task `json:"task"` Comment *TaskComment `json:"comment"` Mentioned bool `json:"mentioned"` } func (n *TaskCommentNotification) SubjectID() int64 { return n.Comment.ID } // ToMail returns the mail notification for TaskCommentNotification func (n *TaskCommentNotification) ToMail() *notifications.Mail { mail := notifications.NewMail(). From(n.Doer.GetNameAndFromEmail()). Subject("Re: " + n.Task.Title) if n.Mentioned { mail. Line("**" + n.Doer.GetName() + "** te mencionó en un comentario:"). Subject(n.Doer.GetName() + ` the mencionó en un comentario de la tarea "` + n.Task.Title + `"`) } mail.HTML(n.Comment.Comment) return mail. Action("Ver Tarea", n.Task.GetFrontendURL()) } // ToDB returns the TaskCommentNotification notification in a format which can be saved in the db func (n *TaskCommentNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *TaskCommentNotification) Name() string { return "task.comment" } // TaskAssignedNotification represents a TaskAssignedNotification notification type TaskAssignedNotification struct { Doer *user.User `json:"doer"` Task *Task `json:"task"` Assignee *user.User `json:"assignee"` Target *user.User `json:"-"` } // ToMail returns the mail notification for TaskAssignedNotification func (n *TaskAssignedNotification) ToMail() *notifications.Mail { if n.Target.ID == n.Assignee.ID { return notifications.NewMail(). Subject("Has sido asignado a "+n.Task.Title+"("+n.Task.GetFullIdentifier()+")"). Line(n.Doer.GetName()+" te ha asignado a la tarea "+n.Task.Title+"."). Action("Ver Tarea", n.Task.GetFrontendURL()) } return notifications.NewMail(). Subject(n.Task.Title+"("+n.Task.GetFullIdentifier()+")"+" ha sido asignado a "+n.Assignee.GetName()). Line(n.Doer.GetName()+" ha asignado esta tarea a "+n.Assignee.GetName()+"."). Action("Ver Tarea", n.Task.GetFrontendURL()) } // ToDB returns the TaskAssignedNotification notification in a format which can be saved in the db func (n *TaskAssignedNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *TaskAssignedNotification) Name() string { return "task.assigned" } // TaskDeletedNotification represents a TaskDeletedNotification notification type TaskDeletedNotification struct { Doer *user.User `json:"doer"` Task *Task `json:"task"` } // ToMail returns the mail notification for TaskDeletedNotification func (n *TaskDeletedNotification) ToMail() *notifications.Mail { return notifications.NewMail(). Subject(n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")" + " ha sido borrado"). Line(n.Doer.GetName() + " ha borrado la tarea " + n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")") } // ToDB returns the TaskDeletedNotification notification in a format which can be saved in the db func (n *TaskDeletedNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *TaskDeletedNotification) Name() string { return "task.deleted" } // ProjectCreatedNotification represents a ProjectCreatedNotification notification type ProjectCreatedNotification struct { Doer *user.User `json:"doer"` Project *Project `json:"project"` } // ToMail returns the mail notification for ProjectCreatedNotification func (n *ProjectCreatedNotification) ToMail() *notifications.Mail { return notifications.NewMail(). Subject(n.Doer.GetName()+` creó el proyecto "`+n.Project.Title+`"`). Line(n.Doer.GetName()+` creó el proyecto "`+n.Project.Title+`"`). Action("Ver Proyecto", config.ServicePublicURL.GetString()+"projects/") } // ToDB returns the ProjectCreatedNotification notification in a format which can be saved in the db func (n *ProjectCreatedNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *ProjectCreatedNotification) Name() string { return "project.created" } // TeamMemberAddedNotification represents a TeamMemberAddedNotification notification type TeamMemberAddedNotification struct { Member *user.User `json:"member"` Doer *user.User `json:"doer"` Team *Team `json:"team"` } // ToMail returns the mail notification for TeamMemberAddedNotification func (n *TeamMemberAddedNotification) ToMail() *notifications.Mail { return notifications.NewMail(). Subject(n.Doer.GetName()+" te añadió al equipo "+n.Team.Name). From(n.Doer.GetNameAndFromEmail()). Greeting("Hi "+n.Member.GetName()+","). Line(n.Doer.GetName()+" te acaba de añadir al equipo "+n.Team.Name+"."). Action("Ver Equipo", config.ServicePublicURL.GetString()+"teams/"+strconv.FormatInt(n.Team.ID, 10)+"/edit") } // ToDB returns the TeamMemberAddedNotification notification in a format which can be saved in the db func (n *TeamMemberAddedNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *TeamMemberAddedNotification) Name() string { return "team.member.added" } // UndoneTaskOverdueNotification represents a UndoneTaskOverdueNotification notification type UndoneTaskOverdueNotification struct { User *user.User Task *Task Project *Project } // ToMail returns the mail notification for UndoneTaskOverdueNotification func (n *UndoneTaskOverdueNotification) ToMail() *notifications.Mail { until := time.Until(n.Task.DueDate).Round(1*time.Hour) * -1 return notifications.NewMail(). Subject(`La tarea "`+n.Task.Title+`" (`+n.Project.Title+`) está vencida`). Greeting("Hola "+n.User.GetName()+","). Line(`Este es un recordatorio amigable de que la tarea "`+n.Task.Title+`" (`+n.Project.Title+`) está vencida desde `+utils.HumanizeDuration(until)+` y aún no está completada.`). Action("Abrir Tarea", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)). Line("¡Qué tengas un buen día!") } // ToDB returns the UndoneTaskOverdueNotification notification in a format which can be saved in the db func (n *UndoneTaskOverdueNotification) ToDB() interface{} { return nil } // Name returns the name of the notification func (n *UndoneTaskOverdueNotification) Name() string { return "task.undone.overdue" } // UndoneTasksOverdueNotification represents a UndoneTasksOverdueNotification notification type UndoneTasksOverdueNotification struct { User *user.User Tasks map[int64]*Task Projects map[int64]*Project } // ToMail returns the mail notification for UndoneTasksOverdueNotification func (n *UndoneTasksOverdueNotification) ToMail() *notifications.Mail { sortedTasks := make([]*Task, 0, len(n.Tasks)) for _, task := range n.Tasks { sortedTasks = append(sortedTasks, task) } sort.Slice(sortedTasks, func(i, j int) bool { return sortedTasks[i].DueDate.Before(sortedTasks[j].DueDate) }) overdueLine := "" for _, task := range sortedTasks { until := time.Until(task.DueDate).Round(1*time.Hour) * -1 overdueLine += `* [` + task.Title + `](` + config.ServicePublicURL.GetString() + "tasks/" + strconv.FormatInt(task.ID, 10) + `) (` + n.Projects[task.ProjectID].Title + `), vencida desde ` + utils.HumanizeDuration(until) + "\n" } return notifications.NewMail(). Subject(`Tus tareas vencidas`). Greeting("Hola "+n.User.GetName()+","). Line("Tienes las siguientes tareas vencidas:"). Line(overdueLine). Action("Abrir Tareas", config.ServicePublicURL.GetString()). Line("¡Qué tengas un buen día!") } // ToDB returns the UndoneTasksOverdueNotification notification in a format which can be saved in the db func (n *UndoneTasksOverdueNotification) ToDB() interface{} { return nil } // Name returns the name of the notification func (n *UndoneTasksOverdueNotification) Name() string { return "task.undone.overdue" } // UserMentionedInTaskNotification represents a UserMentionedInTaskNotification notification type UserMentionedInTaskNotification struct { Doer *user.User `json:"doer"` Task *Task `json:"task"` IsNew bool `json:"is_new"` } func (n *UserMentionedInTaskNotification) SubjectID() int64 { return n.Task.ID } // ToMail returns the mail notification for UserMentionedInTaskNotification func (n *UserMentionedInTaskNotification) ToMail() *notifications.Mail { subject := n.Doer.GetName() + ` te mencionó en la nueva tarea "` + n.Task.Title + `"` if n.IsNew { subject = n.Doer.GetName() + ` te mencionó en la tarea "` + n.Task.Title + `"` } mail := notifications.NewMail(). From(n.Doer.GetNameAndFromEmail()). Subject(subject). Line("**" + n.Doer.GetName() + "** te mencionó en la tarea:"). HTML(n.Task.Description) return mail. Action("Ver Tarea", n.Task.GetFrontendURL()) } // ToDB returns the UserMentionedInTaskNotification notification in a format which can be saved in the db func (n *UserMentionedInTaskNotification) ToDB() interface{} { return n } // Name returns the name of the notification func (n *UserMentionedInTaskNotification) Name() string { return "task.mentioned" } // DataExportReadyNotification represents a DataExportReadyNotification notification type DataExportReadyNotification struct { User *user.User `json:"user"` } // ToMail returns the mail notification for DataExportReadyNotification func (n *DataExportReadyNotification) ToMail() *notifications.Mail { return notifications.NewMail(). Subject("Tus datos exportados están listos"). Greeting("Hola "+n.User.GetName()+","). Line("Tus datos exportados están listos para descargar. Oprime el siguiente botón para descargarlos:"). Action("Descargar", config.ServicePublicURL.GetString()+"user/export/download"). Line("La descarga estará disponible por los siguientes 7 días."). Line("¡Qué tengas un buen día!") } // ToDB returns the DataExportReadyNotification notification in a format which can be saved in the db func (n *DataExportReadyNotification) ToDB() interface{} { return nil } // Name returns the name of the notification func (n *DataExportReadyNotification) Name() string { return "data.export.ready" }