MM-17071 Remove auto responder logic from App.SendNotifications (#11789)
* MM-17071 Remove auto responder logic from App.SendNotifications * Log errors returned by SendAutoResponseIfNecessary
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e7c58dcba3
Коммит
bd270aecbd
@@ -8,28 +8,48 @@ import (
|
|||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *App) SendAutoResponse(channel *model.Channel, receiver *model.User) {
|
func (a *App) SendAutoResponseIfNecessary(channel *model.Channel, sender *model.User) (bool, *model.AppError) {
|
||||||
|
if channel.Type != model.CHANNEL_DIRECT {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
receiverId := channel.GetOtherUserIdForDM(sender.Id)
|
||||||
|
|
||||||
|
receiver, err := a.GetUser(receiverId)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.SendAutoResponse(channel, receiver)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) SendAutoResponse(channel *model.Channel, receiver *model.User) (bool, *model.AppError) {
|
||||||
if receiver == nil || receiver.NotifyProps == nil {
|
if receiver == nil || receiver.NotifyProps == nil {
|
||||||
return
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
active := receiver.NotifyProps[model.AUTO_RESPONDER_ACTIVE_NOTIFY_PROP] == "true"
|
active := receiver.NotifyProps[model.AUTO_RESPONDER_ACTIVE_NOTIFY_PROP] == "true"
|
||||||
message := receiver.NotifyProps[model.AUTO_RESPONDER_MESSAGE_NOTIFY_PROP]
|
message := receiver.NotifyProps[model.AUTO_RESPONDER_MESSAGE_NOTIFY_PROP]
|
||||||
|
|
||||||
if active && message != "" {
|
if !active || message == "" {
|
||||||
autoResponderPost := &model.Post{
|
return false, nil
|
||||||
ChannelId: channel.Id,
|
|
||||||
Message: message,
|
|
||||||
RootId: "",
|
|
||||||
ParentId: "",
|
|
||||||
Type: model.POST_AUTO_RESPONDER,
|
|
||||||
UserId: receiver.Id,
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := a.CreatePost(autoResponderPost, channel, false); err != nil {
|
|
||||||
mlog.Error(err.Error())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
autoResponderPost := &model.Post{
|
||||||
|
ChannelId: channel.Id,
|
||||||
|
Message: message,
|
||||||
|
RootId: "",
|
||||||
|
ParentId: "",
|
||||||
|
Type: model.POST_AUTO_RESPONDER,
|
||||||
|
UserId: receiver.Id,
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := a.CreatePost(autoResponderPost, channel, false); err != nil {
|
||||||
|
mlog.Error(err.Error())
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) SetAutoResponderStatus(user *model.User, oldNotifyProps model.StringMap) {
|
func (a *App) SetAutoResponderStatus(user *model.User, oldNotifyProps model.StringMap) {
|
||||||
|
|||||||
@@ -79,6 +79,64 @@ func TestDisableAutoResponder(t *testing.T) {
|
|||||||
assert.Equal(t, userUpdated2.NotifyProps["auto_responder_active"], "false")
|
assert.Equal(t, userUpdated2.NotifyProps["auto_responder_active"], "false")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendAutoResponseIfNecessary(t *testing.T) {
|
||||||
|
t.Run("should send auto response when enabled", func(t *testing.T) {
|
||||||
|
th := Setup(t).InitBasic()
|
||||||
|
defer th.TearDown()
|
||||||
|
|
||||||
|
receiver := th.CreateUser()
|
||||||
|
|
||||||
|
patch := &model.UserPatch{
|
||||||
|
NotifyProps: map[string]string{
|
||||||
|
"auto_responder_active": "true",
|
||||||
|
"auto_responder_message": "Hello, I'm unavailable today.",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
receiver, err := th.App.PatchUser(receiver.Id, patch, true)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
channel := th.CreateDmChannel(receiver)
|
||||||
|
|
||||||
|
sent, err := th.App.SendAutoResponseIfNecessary(channel, th.BasicUser)
|
||||||
|
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.True(t, sent)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should not send auto response when disabled", func(t *testing.T) {
|
||||||
|
th := Setup(t).InitBasic()
|
||||||
|
defer th.TearDown()
|
||||||
|
|
||||||
|
receiver := th.CreateUser()
|
||||||
|
|
||||||
|
patch := &model.UserPatch{
|
||||||
|
NotifyProps: map[string]string{
|
||||||
|
"auto_responder_active": "false",
|
||||||
|
"auto_responder_message": "Hello, I'm unavailable today.",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
receiver, err := th.App.PatchUser(receiver.Id, patch, true)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
channel := th.CreateDmChannel(receiver)
|
||||||
|
|
||||||
|
sent, err := th.App.SendAutoResponseIfNecessary(channel, th.BasicUser)
|
||||||
|
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.False(t, sent)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should not send auto response for non-DM channel", func(t *testing.T) {
|
||||||
|
th := Setup(t).InitBasic()
|
||||||
|
defer th.TearDown()
|
||||||
|
|
||||||
|
sent, err := th.App.SendAutoResponseIfNecessary(th.BasicChannel, th.BasicUser)
|
||||||
|
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.False(t, sent)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSendAutoResponseSuccess(t *testing.T) {
|
func TestSendAutoResponseSuccess(t *testing.T) {
|
||||||
th := Setup(t).InitBasic()
|
th := Setup(t).InitBasic()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
@@ -101,7 +159,10 @@ func TestSendAutoResponseSuccess(t *testing.T) {
|
|||||||
th.BasicChannel,
|
th.BasicChannel,
|
||||||
false)
|
false)
|
||||||
|
|
||||||
th.App.SendAutoResponse(th.BasicChannel, userUpdated1)
|
sent, err := th.App.SendAutoResponse(th.BasicChannel, userUpdated1)
|
||||||
|
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.True(t, sent)
|
||||||
|
|
||||||
if list, err := th.App.GetPosts(th.BasicChannel.Id, 0, 1); err != nil {
|
if list, err := th.App.GetPosts(th.BasicChannel.Id, 0, 1); err != nil {
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
@@ -138,7 +199,10 @@ func TestSendAutoResponseFailure(t *testing.T) {
|
|||||||
th.BasicChannel,
|
th.BasicChannel,
|
||||||
false)
|
false)
|
||||||
|
|
||||||
th.App.SendAutoResponse(th.BasicChannel, userUpdated1)
|
sent, err := th.App.SendAutoResponse(th.BasicChannel, userUpdated1)
|
||||||
|
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.False(t, sent)
|
||||||
|
|
||||||
if list, err := th.App.GetPosts(th.BasicChannel.Id, 0, 1); err != nil {
|
if list, err := th.App.GetPosts(th.BasicChannel.Id, 0, 1); err != nil {
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|||||||
@@ -73,19 +73,9 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod
|
|||||||
updateMentionChans := []chan *model.AppError{}
|
updateMentionChans := []chan *model.AppError{}
|
||||||
|
|
||||||
if channel.Type == model.CHANNEL_DIRECT {
|
if channel.Type == model.CHANNEL_DIRECT {
|
||||||
var otherUserId string
|
otherUserId := channel.GetOtherUserIdForDM(post.UserId)
|
||||||
|
|
||||||
userIds := strings.Split(channel.Name, "__")
|
_, ok := profileMap[otherUserId]
|
||||||
|
|
||||||
if userIds[0] != userIds[1] {
|
|
||||||
if userIds[0] == post.UserId {
|
|
||||||
otherUserId = userIds[1]
|
|
||||||
} else {
|
|
||||||
otherUserId = userIds[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
otherUser, ok := profileMap[otherUserId]
|
|
||||||
if ok {
|
if ok {
|
||||||
mentionedUserIds[otherUserId] = true
|
mentionedUserIds[otherUserId] = true
|
||||||
}
|
}
|
||||||
@@ -93,13 +83,6 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod
|
|||||||
if post.Props["from_webhook"] == "true" {
|
if post.Props["from_webhook"] == "true" {
|
||||||
mentionedUserIds[post.UserId] = true
|
mentionedUserIds[post.UserId] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if post.Type != model.POST_AUTO_RESPONDER {
|
|
||||||
a.Srv.Go(func() {
|
|
||||||
a.SendAutoResponse(channel, otherUser)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
keywords := a.getMentionKeywordsInChannel(profileMap, post.Type != model.POST_HEADER_CHANGE && post.Type != model.POST_PURPOSE_CHANGE, channelMemberNotifyPropsMap)
|
keywords := a.getMentionKeywordsInChannel(profileMap, post.Type != model.POST_HEADER_CHANGE && post.Type != model.POST_PURPOSE_CHANGE, channelMemberNotifyPropsMap)
|
||||||
|
|
||||||
|
|||||||
@@ -393,6 +393,13 @@ func (a *App) handlePostEvents(post *model.Post, user *model.User, channel *mode
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.Srv.Go(func() {
|
||||||
|
_, err := a.SendAutoResponseIfNecessary(channel, user)
|
||||||
|
if err != nil {
|
||||||
|
mlog.Error("Failed to send auto response", mlog.String("user_id", user.Id), mlog.String("post_id", post.Id), mlog.Err(err))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if triggerWebhooks {
|
if triggerWebhooks {
|
||||||
a.Srv.Go(func() {
|
a.Srv.Go(func() {
|
||||||
if err := a.handleWebhookEvents(post, team, channel, user); err != nil {
|
if err := a.handleWebhookEvents(post, team, channel, user); err != nil {
|
||||||
|
|||||||
@@ -239,6 +239,26 @@ func (o *Channel) IsGroupConstrained() bool {
|
|||||||
return o.GroupConstrained != nil && *o.GroupConstrained
|
return o.GroupConstrained != nil && *o.GroupConstrained
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *Channel) GetOtherUserIdForDM(userId string) string {
|
||||||
|
if o.Type != CHANNEL_DIRECT {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
userIds := strings.Split(o.Name, "__")
|
||||||
|
|
||||||
|
var otherUserId string
|
||||||
|
|
||||||
|
if userIds[0] != userIds[1] {
|
||||||
|
if userIds[0] == userId {
|
||||||
|
otherUserId = userIds[1]
|
||||||
|
} else {
|
||||||
|
otherUserId = userIds[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return otherUserId
|
||||||
|
}
|
||||||
|
|
||||||
func GetDMNameFromIds(userId1, userId2 string) string {
|
func GetDMNameFromIds(userId1, userId2 string) string {
|
||||||
if userId1 > userId2 {
|
if userId1 > userId2 {
|
||||||
return userId2 + "__" + userId1
|
return userId2 + "__" + userId1
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user