MM-28835 Configure/update notices setting for TeamAdmin (#15632)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
ed2cd0e552
Коммит
c298678663
@@ -6,33 +6,23 @@ package app
|
||||
import (
|
||||
"net/http"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v5/store"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/mattermost/mattermost-server/v5/config"
|
||||
"github.com/mattermost/mattermost-server/v5/mlog"
|
||||
"github.com/mattermost/mattermost-server/v5/model"
|
||||
"github.com/mattermost/mattermost-server/v5/store"
|
||||
"github.com/mattermost/mattermost-server/v5/utils"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
date_constraints "github.com/reflog/dateconstraints"
|
||||
)
|
||||
|
||||
const MAX_REPEAT_VIEWINGS = 3
|
||||
const MIN_SECONDS_BETWEEN_REPEAT_VIEWINGS = 60 * 60
|
||||
|
||||
// where to fetch notices from. setting as var to allow overriding during build/test
|
||||
var NOTICES_JSON_URL = "https://notices.mattermost.com/"
|
||||
|
||||
// notice.json fetch frequency in seconds. setting as var to allow overriding during build/test
|
||||
var NOTICES_JSON_FETCH_FREQUENCY_SECONDS = "3600" // one hour by default
|
||||
|
||||
// this variable can be set during build time for QA to skip caching JSON responses (to avoid CDN delay)
|
||||
var NOTICES_SKIP_CACHE = "false"
|
||||
|
||||
// http request cache
|
||||
var noticesCache = utils.RequestCache{}
|
||||
|
||||
@@ -65,9 +55,9 @@ func noticeMatchesConditions(config *model.Config, preferences store.PreferenceS
|
||||
}
|
||||
|
||||
for _, v := range clientVersions {
|
||||
c, err := semver.NewConstraint(v)
|
||||
if err != nil {
|
||||
return false, errors.Wrapf(err, "Cannot parse version range %s", v)
|
||||
c, err2 := semver.NewConstraint(v)
|
||||
if err2 != nil {
|
||||
return false, errors.Wrapf(err2, "Cannot parse version range %s", v)
|
||||
}
|
||||
if !c.Check(clientVersionParsed) {
|
||||
return false, nil
|
||||
@@ -77,9 +67,9 @@ func noticeMatchesConditions(config *model.Config, preferences store.PreferenceS
|
||||
// check if notice date range matches current
|
||||
if cnd.DisplayDate != nil {
|
||||
now := time.Now().UTC()
|
||||
c, err := date_constraints.NewConstraint(*cnd.DisplayDate)
|
||||
if err != nil {
|
||||
return false, errors.Wrapf(err, "Cannot parse date range %s", *cnd.DisplayDate)
|
||||
c, err2 := date_constraints.NewConstraint(*cnd.DisplayDate)
|
||||
if err2 != nil {
|
||||
return false, errors.Wrapf(err2, "Cannot parse date range %s", *cnd.DisplayDate)
|
||||
}
|
||||
if !c.Check(&now) {
|
||||
return false, nil
|
||||
@@ -87,14 +77,18 @@ func noticeMatchesConditions(config *model.Config, preferences store.PreferenceS
|
||||
}
|
||||
|
||||
// check if current server version is notice range
|
||||
serverVersion, _ := semver.NewVersion(model.BuildNumber)
|
||||
for _, v := range cnd.ServerVersion {
|
||||
c, err := semver.NewConstraint(v)
|
||||
if err != nil {
|
||||
return false, errors.Wrapf(err, "Cannot parse version range %s", v)
|
||||
}
|
||||
if !c.Check(serverVersion) {
|
||||
return false, nil
|
||||
serverVersion, err := semver.NewVersion(model.BuildNumber)
|
||||
if err != nil {
|
||||
mlog.Warn("Skipping server version check, build number is not in semver format", mlog.String("build_number", model.BuildNumber))
|
||||
} else {
|
||||
for _, v := range cnd.ServerVersion {
|
||||
c, err := semver.NewConstraint(v)
|
||||
if err != nil {
|
||||
return false, errors.Wrapf(err, "Cannot parse version range %s", v)
|
||||
}
|
||||
if !c.Check(serverVersion) {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +185,7 @@ func (a *App) GetProductNotices(userId, teamId string, client model.NoticeClient
|
||||
isTeamAdmin := a.SessionHasPermissionToTeam(*a.Session(), teamId, model.PERMISSION_MANAGE_TEAM)
|
||||
|
||||
// check if notices for regular users are disabled
|
||||
if !*a.Srv().Config().AnnouncementSettings.UserNoticesEnabled && !isTeamAdmin && !isSystemAdmin {
|
||||
if !*a.Srv().Config().AnnouncementSettings.UserNoticesEnabled && !isSystemAdmin {
|
||||
return []model.NoticeMessage{}, nil
|
||||
}
|
||||
|
||||
@@ -269,12 +263,11 @@ func (a *App) UpdateViewedProductNotices(userId string, noticeIds []string) *mod
|
||||
}
|
||||
|
||||
func (a *App) UpdateProductNotices() *model.AppError {
|
||||
skip, err := strconv.ParseBool(NOTICES_SKIP_CACHE)
|
||||
if err != nil {
|
||||
skip = false
|
||||
}
|
||||
mlog.Debug("Will fetch notices from", mlog.String("url", NOTICES_JSON_URL), mlog.Bool("skip_cache", skip))
|
||||
url := *a.Srv().Config().AnnouncementSettings.NoticesURL
|
||||
skip := *a.Srv().Config().AnnouncementSettings.NoticesSkipCache
|
||||
mlog.Debug("Will fetch notices from", mlog.String("url", url), mlog.Bool("skip_cache", skip))
|
||||
var appErr *model.AppError
|
||||
var err error
|
||||
cachedPostCount, err = a.Srv().Store.Post().AnalyticsPostCount("", false, false)
|
||||
if err != nil {
|
||||
mlog.Error("Failed to fetch post count", mlog.String("error", err.Error()))
|
||||
@@ -285,7 +278,7 @@ func (a *App) UpdateProductNotices() *model.AppError {
|
||||
mlog.Error("Failed to fetch user count", mlog.String("error", appErr.Error()))
|
||||
}
|
||||
|
||||
data, err := utils.GetUrlWithCache(NOTICES_JSON_URL, ¬icesCache, skip)
|
||||
data, err := utils.GetUrlWithCache(url, ¬icesCache, skip)
|
||||
if err != nil {
|
||||
return model.NewAppError("UpdateProductNotices", "api.system.update_notices.fetch_failed", nil, err.Error(), http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -449,10 +449,6 @@ func TestNoticeValidation(t *testing.T) {
|
||||
func TestNoticeFetch(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.AnnouncementSettings.AdminNoticesEnabled = true
|
||||
*cfg.AnnouncementSettings.UserNoticesEnabled = true
|
||||
})
|
||||
|
||||
notices := model.ProductNotices{model.ProductNotice{
|
||||
Conditions: model.Conditions{},
|
||||
@@ -491,8 +487,11 @@ func TestNoticeFetch(t *testing.T) {
|
||||
}
|
||||
}))
|
||||
defer server1.Close()
|
||||
|
||||
NOTICES_JSON_URL = fmt.Sprintf("http://%s/notices.json", server1.Listener.Addr().String())
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.AnnouncementSettings.AdminNoticesEnabled = true
|
||||
*cfg.AnnouncementSettings.UserNoticesEnabled = true
|
||||
*cfg.AnnouncementSettings.NoticesURL = fmt.Sprintf("http://%s/notices.json", server1.Listener.Addr().String())
|
||||
})
|
||||
|
||||
// fetch fake notices
|
||||
appErr = th.App.UpdateProductNotices()
|
||||
@@ -518,7 +517,9 @@ func TestNoticeFetch(t *testing.T) {
|
||||
require.Len(t, views, 1)
|
||||
|
||||
// fetch another set
|
||||
NOTICES_JSON_URL = fmt.Sprintf("http://%s/notices2.json", server1.Listener.Addr().String())
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.AnnouncementSettings.NoticesURL = fmt.Sprintf("http://%s/notices2.json", server1.Listener.Addr().String())
|
||||
})
|
||||
|
||||
// fetch fake notices
|
||||
appErr = th.App.UpdateProductNotices()
|
||||
|
||||
Ссылка в новой задаче
Block a user