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>
Этот коммит содержится в:
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user