345 lines
12 KiB
Go
345 lines
12 KiB
Go
// 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 <https://www.gnu.org/licenses/>.
|
|
|
|
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"
|
|
}
|