[MM-45564] - Notify Admin v2 (#20777)
* [MM-45564] - Notify Admin v2 * add dummy data * update dummy data * add store methods * experiment with recurring task * complete saving of the notification * make improvements * make improvements * add store layer tests * fix lint * update store layer tests * add app layer unit tests * add store layers * add app layer tests * fix lint * fix lint * fix tests * fix tests lint * fix lint * fix lint * fix retry layer test * add notifications manual trigger * filter notifications based on current plan * add test case * temp change * feedback impl * fix translations * change job scheduler * refactor job * fix store layer tests * extract i18n * fix lint * fix translations * fix translations * add license statement for new file * feedback impl-2 * fix lint * update make file * add intl ids * improve * fix lint * feedback impl * move code and rename files * fix lint * feedback impl * add config for trigger notifications api * fix tests * tmp change * undo temp changes Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c11ad8995f
Коммит
bd42f0cd8c
93
app/cloud.go
93
app/cloud.go
@@ -4,109 +4,16 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v6/app/request"
|
||||
"github.com/mattermost/mattermost-server/v6/einterfaces"
|
||||
"github.com/mattermost/mattermost-server/v6/model"
|
||||
"github.com/mattermost/mattermost-server/v6/product"
|
||||
"github.com/mattermost/mattermost-server/v6/shared/i18n"
|
||||
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
||||
)
|
||||
|
||||
func (a *App) NotifySystemAdminsToUpgrade(c *request.Context, currentUserTeamID string) *model.AppError {
|
||||
userId := c.Session().Id
|
||||
|
||||
fakeId := strings.ReplaceAll(model.CloudNotifyAdminInfo, "_", "") + "123456"
|
||||
|
||||
// check if already notified
|
||||
notificationPref, err := a.Srv().Store.Preference().Get(fakeId, model.PreferenceCloudUserEphemeralInfo, model.CloudNotifyAdminInfo)
|
||||
if err != nil {
|
||||
mlog.Warn("Unable to get preference cloud_user_ephemeral_info", mlog.Err(err))
|
||||
}
|
||||
|
||||
if notificationPref != nil {
|
||||
info := &model.AdminNotificationUserInfo{}
|
||||
err = json.Unmarshal([]byte(notificationPref.Value), info)
|
||||
if err != nil {
|
||||
mlog.Warn("Unable to Unmarshal", mlog.Err(err))
|
||||
}
|
||||
|
||||
if !model.CanNotify(info.LastNotificationTimestamp) {
|
||||
return model.NewAppError("app.NotifySystemAdminsToUpgrade", "api.cloud.notify_admin_to_upgrade_error.already_notified", nil, "", http.StatusForbidden)
|
||||
}
|
||||
}
|
||||
|
||||
team, appErr := a.GetTeam(currentUserTeamID)
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
|
||||
sysadmins, appErr := a.GetUsersFromProfiles(&model.UserGetOptions{
|
||||
Page: 0,
|
||||
PerPage: 100,
|
||||
Role: model.SystemAdminRoleId,
|
||||
Inactive: false,
|
||||
})
|
||||
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
|
||||
systemBot, appErr := a.GetSystemBot()
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
|
||||
for _, admin := range sysadmins {
|
||||
T := i18n.GetUserTranslations(admin.Locale)
|
||||
channel, appErr := a.GetOrCreateDirectChannel(c, systemBot.UserId, admin.Id)
|
||||
if appErr != nil {
|
||||
mlog.Warn("Error getting direct channel", mlog.Err(appErr))
|
||||
continue
|
||||
}
|
||||
|
||||
post := &model.Post{
|
||||
Message: T("api.cloud.upgrade_plan_bot_message", map[string]any{"TeamName": team.Name}),
|
||||
UserId: systemBot.UserId,
|
||||
ChannelId: channel.Id,
|
||||
Type: fmt.Sprintf("%sup_notification", model.PostCustomTypePrefix), // webapp will have to create renderer for this custom post type
|
||||
}
|
||||
|
||||
_, appErr = a.CreatePost(c, post, channel, false, true)
|
||||
if appErr != nil {
|
||||
mlog.Warn("Error creating post", mlog.Err(appErr))
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// mark as done for current user until end of cool off period
|
||||
out, err := json.Marshal(&model.AdminNotificationUserInfo{
|
||||
LastUserIDToNotify: userId,
|
||||
LastNotificationTimestamp: model.GetMillis(),
|
||||
})
|
||||
if err != nil {
|
||||
mlog.Warn("Unable to Marshal", mlog.Err(err))
|
||||
}
|
||||
|
||||
pref := model.Preference{
|
||||
UserId: fakeId, // to only have one preference for now and not a preference per user
|
||||
Category: model.PreferenceCloudUserEphemeralInfo,
|
||||
Name: model.CloudNotifyAdminInfo,
|
||||
Value: string(out),
|
||||
}
|
||||
|
||||
if err := a.Srv().Store.Preference().Save(model.Preferences{pref}); err != nil {
|
||||
mlog.Warn("Encountered error saving cloud_user_ephemeral_info preference", mlog.Err(err))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Ensure cloud service wrapper implements `product.CloudService`
|
||||
var _ product.CloudService = (*cloudWrapper)(nil)
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user