2021-02-07 22:05:09 +01:00
// Vikunja is a to-do list application to facilitate your life.
// Copyright 2018-2021 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 (
2021-02-14 20:18:14 +01:00
"bufio"
2022-09-30 18:35:40 +02:00
"sort"
2021-02-07 22:05:09 +01:00
"strconv"
2021-02-14 20:18:14 +01:00
"strings"
2021-04-11 17:08:43 +02:00
"time"
2021-02-07 22:05:09 +01:00
2021-04-18 14:25:50 +02:00
"code.vikunja.io/api/pkg/utils"
2021-02-07 22:05:09 +01:00
"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 {
2021-02-21 15:50:34 +01:00
User * user . User ` json:"user" `
Task * Task ` json:"task" `
2021-02-07 22:05:09 +01:00
}
// ToMail returns the mail notification for ReminderDueNotification
func ( n * ReminderDueNotification ) ToMail ( ) * notifications . Mail {
return notifications . NewMail ( ) .
To ( n . User . Email ) .
Subject ( ` Reminder for " ` + n . Task . Title + ` " ` ) .
Greeting ( "Hi " + n . User . GetName ( ) + "," ) .
Line ( ` This is a friendly reminder of the task " ` + n . Task . Title + ` ". ` ) .
Action ( "Open Task" , config . ServiceFrontendurl . GetString ( ) + "tasks/" + strconv . FormatInt ( n . Task . ID , 10 ) ) .
Line ( "Have a nice day!" )
}
// ToDB returns the ReminderDueNotification notification in a format which can be saved in the db
func ( n * ReminderDueNotification ) ToDB ( ) interface { } {
return nil
}
2021-02-14 20:18:14 +01:00
2021-02-21 15:50:34 +01:00
// Name returns the name of the notification
func ( n * ReminderDueNotification ) Name ( ) string {
return ""
}
2021-02-14 20:18:14 +01:00
// TaskCommentNotification represents a TaskCommentNotification notification
type TaskCommentNotification struct {
2021-07-29 17:42:49 +02:00
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
2021-02-14 20:18:14 +01:00
}
// ToMail returns the mail notification for TaskCommentNotification
func ( n * TaskCommentNotification ) ToMail ( ) * notifications . Mail {
mail := notifications . NewMail ( ) .
2021-07-29 17:42:49 +02:00
From ( n . Doer . GetNameAndFromEmail ( ) )
subject := "Re: " + n . Task . Title
if n . Mentioned {
subject = n . Doer . GetName ( ) + ` mentioned you in a comment in " ` + n . Task . Title + ` " `
mail . Line ( "**" + n . Doer . GetName ( ) + "** mentioned you in a comment:" )
}
mail . Subject ( subject )
2021-02-14 20:18:14 +01:00
lines := bufio . NewScanner ( strings . NewReader ( n . Comment . Comment ) )
for lines . Scan ( ) {
mail . Line ( lines . Text ( ) )
}
return mail .
Action ( "View Task" , 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
}
2021-02-21 15:50:34 +01:00
// Name returns the name of the notification
func ( n * TaskCommentNotification ) Name ( ) string {
return "task.comment"
}
2021-02-14 20:18:14 +01:00
// TaskAssignedNotification represents a TaskAssignedNotification notification
type TaskAssignedNotification struct {
2021-02-21 15:50:34 +01:00
Doer * user . User ` json:"doer" `
Task * Task ` json:"task" `
Assignee * user . User ` json:"assignee" `
2021-02-14 20:18:14 +01:00
}
// ToMail returns the mail notification for TaskAssignedNotification
func ( n * TaskAssignedNotification ) ToMail ( ) * notifications . Mail {
return notifications . NewMail ( ) .
Subject ( n . Task . Title + "(" + n . Task . GetFullIdentifier ( ) + ")" + " has been assigned to " + n . Assignee . GetName ( ) ) .
2021-10-16 16:38:59 +02:00
Line ( n . Doer . GetName ( ) + " has assigned this task to " + n . Assignee . GetName ( ) + "." ) .
2021-02-14 20:18:14 +01:00
Action ( "View Task" , 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
}
2021-02-21 15:50:34 +01:00
// Name returns the name of the notification
func ( n * TaskAssignedNotification ) Name ( ) string {
return "task.assigned"
}
2021-02-14 20:18:14 +01:00
// TaskDeletedNotification represents a TaskDeletedNotification notification
type TaskDeletedNotification struct {
2021-02-21 15:50:34 +01:00
Doer * user . User ` json:"doer" `
Task * Task ` json:"task" `
2021-02-14 20:18:14 +01:00
}
// ToMail returns the mail notification for TaskDeletedNotification
func ( n * TaskDeletedNotification ) ToMail ( ) * notifications . Mail {
return notifications . NewMail ( ) .
Subject ( n . Task . Title + "(" + n . Task . GetFullIdentifier ( ) + ")" + " has been delete" ) .
Line ( n . Doer . GetName ( ) + " has deleted the task " + 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
}
2021-02-21 15:50:34 +01:00
// Name returns the name of the notification
func ( n * TaskDeletedNotification ) Name ( ) string {
return "task.deleted"
}
2021-02-14 20:18:14 +01:00
// ListCreatedNotification represents a ListCreatedNotification notification
type ListCreatedNotification struct {
2021-02-21 15:50:34 +01:00
Doer * user . User ` json:"doer" `
List * List ` json:"list" `
2021-02-14 20:18:14 +01:00
}
// ToMail returns the mail notification for ListCreatedNotification
func ( n * ListCreatedNotification ) ToMail ( ) * notifications . Mail {
return notifications . NewMail ( ) .
Subject ( n . Doer . GetName ( ) + ` created the list " ` + n . List . Title + ` " ` ) .
Line ( n . Doer . GetName ( ) + ` created the list " ` + n . List . Title + ` " ` ) .
Action ( "View List" , config . ServiceFrontendurl . GetString ( ) + "lists/" )
}
// ToDB returns the ListCreatedNotification notification in a format which can be saved in the db
func ( n * ListCreatedNotification ) ToDB ( ) interface { } {
2021-02-21 15:50:34 +01:00
return n
}
// Name returns the name of the notification
func ( n * ListCreatedNotification ) Name ( ) string {
return "list.created"
2021-02-14 20:18:14 +01:00
}
2021-02-17 20:48:06 +01:00
// TeamMemberAddedNotification represents a TeamMemberAddedNotification notification
type TeamMemberAddedNotification struct {
2021-02-21 15:50:34 +01:00
Member * user . User ` json:"member" `
Doer * user . User ` json:"doer" `
Team * Team ` json:"team" `
2021-02-17 20:48:06 +01:00
}
// ToMail returns the mail notification for TeamMemberAddedNotification
func ( n * TeamMemberAddedNotification ) ToMail ( ) * notifications . Mail {
return notifications . NewMail ( ) .
Subject ( n . Doer . GetName ( ) + " added you to the " + n . Team . Name + " team in Vikunja" ) .
From ( n . Doer . GetNameAndFromEmail ( ) ) .
Greeting ( "Hi " + n . Member . GetName ( ) + "," ) .
Line ( n . Doer . GetName ( ) + " has just added you to the " + n . Team . Name + " team in Vikunja." ) .
Action ( "View Team" , config . ServiceFrontendurl . 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 { } {
2021-02-21 15:50:34 +01:00
return n
}
// Name returns the name of the notification
func ( n * TeamMemberAddedNotification ) Name ( ) string {
return "team.member.added"
2021-02-17 20:48:06 +01:00
}
2021-04-11 17:08:43 +02:00
// UndoneTaskOverdueNotification represents a UndoneTaskOverdueNotification notification
type UndoneTaskOverdueNotification struct {
User * user . User
Task * Task
}
// ToMail returns the mail notification for UndoneTaskOverdueNotification
func ( n * UndoneTaskOverdueNotification ) ToMail ( ) * notifications . Mail {
2021-04-18 14:25:50 +02:00
until := time . Until ( n . Task . DueDate ) . Round ( 1 * time . Hour ) * - 1
2021-04-11 17:08:43 +02:00
return notifications . NewMail ( ) .
Subject ( ` Task " ` + n . Task . Title + ` " is overdue ` ) .
Greeting ( "Hi " + n . User . GetName ( ) + "," ) .
2021-04-18 14:25:50 +02:00
Line ( ` This is a friendly reminder of the task " ` + n . Task . Title + ` " which is overdue since ` + utils . HumanizeDuration ( until ) + ` and not yet done. ` ) .
2021-04-11 17:08:43 +02:00
Action ( "Open Task" , config . ServiceFrontendurl . GetString ( ) + "tasks/" + strconv . FormatInt ( n . Task . ID , 10 ) ) .
Line ( "Have a nice day!" )
}
// 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"
}
2021-04-18 15:32:02 +02:00
// UndoneTasksOverdueNotification represents a UndoneTasksOverdueNotification notification
type UndoneTasksOverdueNotification struct {
User * user . User
2022-09-30 18:35:40 +02:00
Tasks map [ int64 ] * Task
2021-04-18 15:32:02 +02:00
}
// ToMail returns the mail notification for UndoneTasksOverdueNotification
func ( n * UndoneTasksOverdueNotification ) ToMail ( ) * notifications . Mail {
2022-09-30 18:35:40 +02:00
sortedTasks := make ( [ ] * Task , 0 , len ( n . Tasks ) )
2021-04-18 15:32:02 +02:00
for _ , task := range n . Tasks {
2022-09-30 18:35:40 +02:00
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 {
2021-04-18 15:32:02 +02:00
until := time . Until ( task . DueDate ) . Round ( 1 * time . Hour ) * - 1
overdueLine += ` * [ ` + task . Title + ` ]( ` + config . ServiceFrontendurl . GetString ( ) + "tasks/" + strconv . FormatInt ( task . ID , 10 ) + ` ), overdue since ` + utils . HumanizeDuration ( until ) + "\n"
}
return notifications . NewMail ( ) .
Subject ( ` Your overdue tasks ` ) .
Greeting ( "Hi " + n . User . GetName ( ) + "," ) .
Line ( "You have the following overdue tasks:" ) .
Line ( overdueLine ) .
Action ( "Open Vikunja" , config . ServiceFrontendurl . GetString ( ) ) .
Line ( "Have a nice day!" )
}
// 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"
}
2021-07-29 17:42:49 +02:00
// 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 ( ) + ` mentioned you in a new task " ` + n . Task . Title + ` " `
if n . IsNew {
subject = n . Doer . GetName ( ) + ` mentioned you in a task " ` + n . Task . Title + ` " `
}
mail := notifications . NewMail ( ) .
From ( n . Doer . GetNameAndFromEmail ( ) ) .
Subject ( subject ) .
Line ( "**" + n . Doer . GetName ( ) + "** mentioned you in a task:" )
lines := bufio . NewScanner ( strings . NewReader ( n . Task . Description ) )
for lines . Scan ( ) {
mail . Line ( lines . Text ( ) )
}
return mail .
Action ( "View Task" , 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"
}
2021-09-04 21:26:31 +02:00
// 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 ( "Your Vikunja Data Export is ready" ) .
Greeting ( "Hi " + n . User . GetName ( ) + "," ) .
Line ( "Your Vikunja Data Export is ready for you to download. Click the button below to download it:" ) .
Action ( "Download" , config . ServiceFrontendurl . GetString ( ) + "user/export/download" ) .
Line ( "The download will be available for the next 7 days." ) .
Line ( "Have a nice day!" )
}
// 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"
}