Send a notification to the user when they are added to the list
This commit is contained in:
parent
0bd27ddeb7
commit
c873c1ec32
5 changed files with 61 additions and 6 deletions
|
@ -216,7 +216,7 @@ func (n *NamespaceSharedWithTeamEvent) Name() string {
|
||||||
type TeamMemberAddedEvent struct {
|
type TeamMemberAddedEvent struct {
|
||||||
Team *Team
|
Team *Team
|
||||||
Member *user.User
|
Member *user.User
|
||||||
Doer web.Auth
|
Doer *user.User
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name defines the name for TeamMemberAddedEvent
|
// Name defines the name for TeamMemberAddedEvent
|
||||||
|
|
|
@ -43,6 +43,7 @@ func RegisterListeners() {
|
||||||
events.RegisterListener((&TaskDeletedEvent{}).Name(), &SendTaskDeletedNotification{})
|
events.RegisterListener((&TaskDeletedEvent{}).Name(), &SendTaskDeletedNotification{})
|
||||||
events.RegisterListener((&ListCreatedEvent{}).Name(), &SendListCreatedNotification{})
|
events.RegisterListener((&ListCreatedEvent{}).Name(), &SendListCreatedNotification{})
|
||||||
events.RegisterListener((&TaskAssigneeCreatedEvent{}).Name(), &SubscribeAssigneeToTask{})
|
events.RegisterListener((&TaskAssigneeCreatedEvent{}).Name(), &SubscribeAssigneeToTask{})
|
||||||
|
events.RegisterListener((&TeamMemberAddedEvent{}).Name(), &SendTeamMemberAddedNotification{})
|
||||||
}
|
}
|
||||||
|
|
||||||
//////
|
//////
|
||||||
|
@ -377,3 +378,27 @@ func (s *DecreaseTeamCounter) Name() string {
|
||||||
func (s *DecreaseTeamCounter) Handle(payload message.Payload) (err error) {
|
func (s *DecreaseTeamCounter) Handle(payload message.Payload) (err error) {
|
||||||
return keyvalue.DecrBy(metrics.TeamCountKey, 1)
|
return keyvalue.DecrBy(metrics.TeamCountKey, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendTeamMemberAddedNotification represents a listener
|
||||||
|
type SendTeamMemberAddedNotification struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name defines the name for the SendTeamMemberAddedNotification listener
|
||||||
|
func (s *SendTeamMemberAddedNotification) Name() string {
|
||||||
|
return "send.team.member.added.notification"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle is executed when the event SendTeamMemberAddedNotification listens on is fired
|
||||||
|
func (s *SendTeamMemberAddedNotification) Handle(payload message.Payload) (err error) {
|
||||||
|
event := &TeamMemberAddedEvent{}
|
||||||
|
err = json.Unmarshal(payload, event)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifications.Notify(event.Member, &TeamMemberAddedNotification{
|
||||||
|
Member: event.Member,
|
||||||
|
Doer: event.Doer,
|
||||||
|
Team: event.Team,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ type TaskCommentNotification struct {
|
||||||
func (n *TaskCommentNotification) ToMail() *notifications.Mail {
|
func (n *TaskCommentNotification) ToMail() *notifications.Mail {
|
||||||
|
|
||||||
mail := notifications.NewMail().
|
mail := notifications.NewMail().
|
||||||
From(n.Doer.GetName() + " via Vikunja <" + config.MailerFromEmail.GetString() + ">").
|
From(n.Doer.GetNameAndFromEmail()).
|
||||||
Subject("Re: " + n.Task.Title)
|
Subject("Re: " + n.Task.Title)
|
||||||
|
|
||||||
lines := bufio.NewScanner(strings.NewReader(n.Comment.Comment))
|
lines := bufio.NewScanner(strings.NewReader(n.Comment.Comment))
|
||||||
|
@ -132,3 +132,25 @@ func (n *ListCreatedNotification) ToMail() *notifications.Mail {
|
||||||
func (n *ListCreatedNotification) ToDB() interface{} {
|
func (n *ListCreatedNotification) ToDB() interface{} {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TeamMemberAddedNotification represents a TeamMemberAddedNotification notification
|
||||||
|
type TeamMemberAddedNotification struct {
|
||||||
|
Member *user.User
|
||||||
|
Doer *user.User
|
||||||
|
Team *Team
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -46,11 +46,11 @@ func (tm *TeamMember) Create(s *xorm.Session, a web.Auth) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the user exists
|
// Check if the user exists
|
||||||
user, err := user2.GetUserByUsername(s, tm.Username)
|
member, err := user2.GetUserByUsername(s, tm.Username)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tm.UserID = user.ID
|
tm.UserID = member.ID
|
||||||
|
|
||||||
// Check if that user is already part of the team
|
// Check if that user is already part of the team
|
||||||
exists, err := s.
|
exists, err := s.
|
||||||
|
@ -69,10 +69,11 @@ func (tm *TeamMember) Create(s *xorm.Session, a web.Auth) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doer, _ := user2.GetFromAuth(a)
|
||||||
return events.Dispatch(&TeamMemberAddedEvent{
|
return events.Dispatch(&TeamMemberAddedEvent{
|
||||||
Team: team,
|
Team: team,
|
||||||
Member: user,
|
Member: member,
|
||||||
Doer: a,
|
Doer: doer,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"code.vikunja.io/api/pkg/config"
|
||||||
|
|
||||||
"code.vikunja.io/api/pkg/db"
|
"code.vikunja.io/api/pkg/db"
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
|
@ -116,6 +118,11 @@ func (u *User) GetName() string {
|
||||||
return u.Username
|
return u.Username
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetNameAndFromEmail returns the name and email address for a user. Useful to use in notifications.
|
||||||
|
func (u *User) GetNameAndFromEmail() string {
|
||||||
|
return u.GetName() + " via Vikunja <" + config.MailerFromEmail.GetString() + ">"
|
||||||
|
}
|
||||||
|
|
||||||
// GetFromAuth returns a user object from a web.Auth object and returns an error if the underlying type
|
// GetFromAuth returns a user object from a web.Auth object and returns an error if the underlying type
|
||||||
// is not a user object
|
// is not a user object
|
||||||
func GetFromAuth(a web.Auth) (*User, error) {
|
func GetFromAuth(a web.Auth) (*User, error) {
|
||||||
|
|
Loading…
Reference in a new issue