Этот коммит содержится в:
Conor Macpherson
2022-12-27 16:54:46 -05:00
родитель c633a1d2fa
Коммит 9c71784d0d
4 изменённых файлов: 47 добавлений и 28 удалений

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

@@ -6,14 +6,17 @@ package api4
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"os" "os"
"strings"
"time" "time"
"github.com/mattermost/mattermost-server/v6/services/telemetry" "github.com/mattermost/mattermost-server/v6/services/telemetry"
"github.com/mattermost/mattermost-server/v6/shared/mlog" "github.com/mattermost/mattermost-server/v6/shared/mlog"
"github.com/mattermost/mattermost-server/v6/store"
"github.com/mattermost/mattermost-server/v6/utils" "github.com/mattermost/mattermost-server/v6/utils"
"github.com/mattermost/mattermost-server/v6/audit" "github.com/mattermost/mattermost-server/v6/audit"
@@ -315,15 +318,15 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
if c.App.Cloud() != nil { if license.IsCloud() {
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.not.allowed.for.cloud", nil, "", http.StatusNotImplemented) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.not_allowed_for_cloud", nil, "", http.StatusNotImplemented)
return return
} }
// Customer Info & Usage Analytics // Customer Info & Usage Analytics
activeUserCount, err := c.App.Srv().Store().Status().GetTotalActiveUsersCount() activeUserCount, err := c.App.Srv().Store().Status().GetTotalActiveUsersCount()
if err != nil { if err != nil {
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.user.count.fail", nil, "", http.StatusInternalServerError) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.user_count_fail", nil, "", http.StatusInternalServerError)
return return
} }
@@ -331,12 +334,12 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) {
incomingWebhookCount, err := c.App.Srv().Store().Webhook().AnalyticsIncomingCount("") incomingWebhookCount, err := c.App.Srv().Store().Webhook().AnalyticsIncomingCount("")
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.webhook.in.count.fail", nil, "", http.StatusInternalServerError) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.webhook_in_count_fail", nil, "", http.StatusInternalServerError)
return return
} }
outgoingWebhookCount, err := c.App.Srv().Store().Webhook().AnalyticsOutgoingCount("") outgoingWebhookCount, err := c.App.Srv().Store().Webhook().AnalyticsOutgoingCount("")
if err != nil { if err != nil {
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.webhook.out.count.fail", nil, "", http.StatusInternalServerError) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.webhook_out_count_fail", nil, "", http.StatusInternalServerError)
return return
} }
@@ -407,8 +410,16 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) {
dueDate := utils.GetNextTrueUpReviewDueDate(time.Now()) dueDate := utils.GetNextTrueUpReviewDueDate(time.Now())
status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(dueDate.UnixMilli()) status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(dueDate.UnixMilli())
if err != nil { if err != nil {
status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status) var nfErr *store.ErrNotFound
switch {
case errors.As(err, &nfErr):
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.status_not_found", nil, "", http.StatusNotFound).Wrap(err)
default:
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.get_status_error", nil, "", http.StatusInternalServerError).Wrap(err)
return
}
status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status)
if err != nil { if err != nil {
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.create.fail.app_error", nil, "", http.StatusInternalServerError) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.create.fail.app_error", nil, "", http.StatusInternalServerError)
return return
@@ -422,9 +433,12 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) {
delete(telemetryProperties, "plugins") delete(telemetryProperties, "plugins")
plugins := reviewProfile.Plugins.ToMap() plugins := reviewProfile.Plugins.ToMap()
for pluginName, pluginValue := range plugins { for pluginName, pluginValue := range plugins {
telemetryProperties[pluginName] = pluginValue telemetryProperties["plugin_"+pluginName] = pluginValue
} }
delete(telemetryProperties, "authentication_features")
telemetryProperties["authentication_features"] = strings.Join(reviewProfile.AuthenticationFeatures, ",")
telemetryService := c.App.Srv().GetTelemetryService() telemetryService := c.App.Srv().GetTelemetryService()
telemetryService.SendTelemetry(model.TrueUpReviewTelemetryName, telemetryProperties) telemetryService.SendTelemetry(model.TrueUpReviewTelemetryName, telemetryProperties)
@@ -444,22 +458,31 @@ func trueUpReviewStatus(c *Context, w http.ResponseWriter, r *http.Request) {
license := c.App.Channels().License() license := c.App.Channels().License()
if license == nil { if license == nil {
c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.license.required", nil, "", http.StatusNotImplemented) c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.license_required", nil, "", http.StatusNotImplemented)
return return
} }
if c.App.Cloud() != nil { if license.IsCloud() {
c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.not.allowed.for.cloud", nil, "", http.StatusNotImplemented) c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.not_allowed_for_cloud", nil, "", http.StatusNotImplemented)
return return
} }
nextDueDate := utils.GetNextTrueUpReviewDueDate(time.Now()) nextDueDate := utils.GetNextTrueUpReviewDueDate(time.Now())
status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(nextDueDate.UnixMilli()) status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(nextDueDate.UnixMilli())
if err != nil { if err != nil {
var nfErr *store.ErrNotFound
switch {
case errors.As(err, &nfErr):
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.status_not_found", nil, "", http.StatusNotFound).Wrap(err)
default:
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.get_status_error", nil, "", http.StatusInternalServerError).Wrap(err)
return
}
status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status) status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status)
if err != nil { if err != nil {
c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.create.fail.app_error", nil, "", http.StatusInternalServerError) c.Err = model.NewAppError("requestTrueUpReview", "api.license.true_up_review.create_error", nil, "", http.StatusInternalServerError)
return return
} }
} }

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

@@ -344,16 +344,13 @@ func TestRequestTrueUpReview(t *testing.T) {
}) })
t.Run("returns 501 when ran by cloud user", func(t *testing.T) { t.Run("returns 501 when ran by cloud user", func(t *testing.T) {
cloud := mocks.CloudInterface{} th.App.Srv().SetLicense(model.NewTestLicense("cloud"))
cloudImpl := th.App.Srv().Cloud
th.App.Srv().Cloud = &cloud
defer func() {
th.App.Srv().Cloud = cloudImpl
}()
resp, err := th.SystemAdminClient.DoAPIPost("/license/review", "") resp, err := th.SystemAdminClient.DoAPIPost("/license/review", "")
require.Error(t, err) require.Error(t, err)
require.Equal(t, http.StatusNotImplemented, resp.StatusCode) require.Equal(t, http.StatusNotImplemented, resp.StatusCode)
th.App.Srv().SetLicense(model.NewTestLicense())
}) })
t.Run("returns 403 when user does not have permissions", func(t *testing.T) { t.Run("returns 403 when user does not have permissions", func(t *testing.T) {
@@ -384,16 +381,13 @@ func TestTrueUpReviewStatus(t *testing.T) {
}) })
t.Run("returns 501 when ran by cloud user", func(t *testing.T) { t.Run("returns 501 when ran by cloud user", func(t *testing.T) {
cloud := mocks.CloudInterface{} th.App.Srv().SetLicense(model.NewTestLicense("cloud"))
cloudImpl := th.App.Srv().Cloud
th.App.Srv().Cloud = &cloud
defer func() {
th.App.Srv().Cloud = cloudImpl
}()
resp, err := th.SystemAdminClient.DoAPIGet("/license/review/status", "") resp, err := th.SystemAdminClient.DoAPIGet("/license/review/status", "")
require.Error(t, err) require.Error(t, err)
require.Equal(t, http.StatusNotImplemented, resp.StatusCode) require.Equal(t, http.StatusNotImplemented, resp.StatusCode)
th.App.Srv().SetLicense(model.NewTestLicense())
}) })
t.Run("returns 403 when user does not have permissions", func(t *testing.T) { t.Run("returns 403 when user does not have permissions", func(t *testing.T) {

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

@@ -3,6 +3,8 @@
package model package model
import "strings"
type TrueUpReviewProfile struct { type TrueUpReviewProfile struct {
ServerId string `json:"server_id"` ServerId string `json:"server_id"`
ServerVersion string `json:"server_version"` ServerVersion string `json:"server_version"`
@@ -29,8 +31,8 @@ func (t *TrueUpReviewPlugins) ToMap() map[string]interface{} {
return map[string]interface{}{ return map[string]interface{}{
"total_active_plugins": t.TotalActivePlugins, "total_active_plugins": t.TotalActivePlugins,
"total_inactive_plugins": t.TotalInactivePlugins, "total_inactive_plugins": t.TotalInactivePlugins,
"active_plugin_names": t.ActivePluginNames, "active_plugin_names": strings.Join(t.ActivePluginNames, ","),
"inactive_plugin_names": t.InactivePluginNames, "inactive_plugin_names": strings.Join(t.InactivePluginNames, ","),
} }
} }

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

@@ -98,17 +98,17 @@ func TestGetNextTrueUpReviewDueDate(t *testing.T) {
// Before the 15th // Before the 15th
now := time.Date(2022, 12, 14, 0, 0, 0, 0, time.Local) now := time.Date(2022, 12, 14, 0, 0, 0, 0, time.Local)
due := GetNextTrueUpReviewDueDate(now) due := GetNextTrueUpReviewDueDate(now)
assert.Equal(t, due.Day(), TrueUpReviewDueDay) assert.Equal(t, due.Day(), trueUpReviewDueDay)
// On the 15th // On the 15th
now = time.Date(2022, 12, 15, 0, 0, 0, 0, time.Local) now = time.Date(2022, 12, 15, 0, 0, 0, 0, time.Local)
due = GetNextTrueUpReviewDueDate(now) due = GetNextTrueUpReviewDueDate(now)
assert.Equal(t, due.Day(), TrueUpReviewDueDay) assert.Equal(t, due.Day(), trueUpReviewDueDay)
// After the 15th // After the 15th
now = time.Date(2022, 12, 16, 0, 0, 0, 0, time.Local) now = time.Date(2022, 12, 16, 0, 0, 0, 0, time.Local)
due = GetNextTrueUpReviewDueDate(now) due = GetNextTrueUpReviewDueDate(now)
assert.Equal(t, due.Day(), TrueUpReviewDueDay) assert.Equal(t, due.Day(), trueUpReviewDueDay)
}) })
t.Run("Due date will always be in next quarter if the current date is past the 15th", func(t *testing.T) { t.Run("Due date will always be in next quarter if the current date is past the 15th", func(t *testing.T) {