MM - 60506 - notify user failed scheduled msgs (#29208)

* MM-60506 - notify user for failed scheduled messages

* add unit tests for handleFailedScheduledMessages and send system-bot message

* fix vet issues

* adjust test for vet report

* make sure to send the message to every user there was a failed message

---------

Co-authored-by: Harshil Sharma <harshil.sharma@mattermost.com>
Этот коммит содержится в:
Pablo Vélez
2024-11-12 11:33:29 +01:00
коммит произвёл GitHub
родитель 5eef415a39
Коммит 4e0fc5734c
4 изменённых файлов: 248 добавлений и 0 удалений

Просмотреть файл

@@ -11,6 +11,7 @@ import (
"github.com/mattermost/mattermost/server/v8/platform/services/telemetry"
"github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost/server/public/shared/i18n"
"github.com/mattermost/mattermost/server/public/shared/mlog"
"github.com/mattermost/mattermost/server/public/shared/request"
"github.com/pkg/errors"
@@ -374,5 +375,61 @@ func (a *App) handleFailedScheduledPosts(rctx request.CTX, failedScheduledPosts
"scheduled_posts_failed",
map[string]any{"count": len(failedScheduledPosts)},
)
a.notifyUserAboutFailedScheduledMessages(rctx, failedScheduledPosts)
}
}
func (a *App) notifyUserAboutFailedScheduledMessages(rctx request.CTX, failedMessages []*model.ScheduledPost) {
failedMessagesByUser := aggregateFailMessagesByUser(failedMessages)
systemBot, err := a.GetSystemBot(rctx)
if err != nil {
rctx.Logger().Error("Failed to get the system bot", mlog.Err(err))
return
}
for userId, userFailedMessages := range failedMessagesByUser {
a.Srv().Go(func(userId string, userFailedMessages []*model.ScheduledPost) func() {
return func() {
a.notifyUser(rctx, userId, userFailedMessages, systemBot)
}
}(userId, userFailedMessages))
}
}
func aggregateFailMessagesByUser(failedMessages []*model.ScheduledPost) map[string][]*model.ScheduledPost {
aggregated := make(map[string][]*model.ScheduledPost)
for _, msg := range failedMessages {
aggregated[msg.UserId] = append(aggregated[msg.UserId], msg)
}
return aggregated
}
func (a *App) notifyUser(rctx request.CTX, userId string, userFailedMessages []*model.ScheduledPost, systemBot *model.Bot) {
channel, err := a.GetOrCreateDirectChannel(rctx, userId, systemBot.UserId)
if err != nil {
rctx.Logger().Error("Failed to get or create the DM", mlog.Err(err))
return
}
user, err := a.GetUser(userId)
if err != nil {
rctx.Logger().Error("Failed to get the user", mlog.Err(err))
return
}
T := i18n.GetUserTranslations(user.Locale)
messageContent := T("app.scheduled_post.failed_messages", map[string]interface{}{
"Count": len(userFailedMessages),
})
post := &model.Post{
ChannelId: channel.Id,
Message: messageContent,
Type: model.PostTypeDefault,
UserId: systemBot.UserId,
}
if _, err := a.CreatePost(rctx, post, channel, model.CreatePostFlags{SetOnline: true}); err != nil {
rctx.Logger().Error("Failed to post notification about failed scheduled messages", mlog.Err(err))
}
}