* add license service interface

* add wrapper

* remove wrapper from channels struct until its being used

* add comments
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2022-03-01 15:14:43 +03:00
коммит произвёл GitHub
родитель 229200720c
Коммит f2471200f9
4 изменённых файлов: 76 добавлений и 3 удалений

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

@@ -31,6 +31,13 @@ type configSvc interface {
SaveConfig(newCfg *model.Config, sendConfigChangeClusterMessage bool) (*model.Config, *model.Config, *model.AppError)
}
// licenseSvc is added to act as a starting point for future integrated products.
// It has the same signature and functionality with the license related APIs of the plugin-api.
type licenseSvc interface { // nolint: unused,deadcode
GetLicense() *model.License
RequestTrialLicense(requesterID string, users int, termsAccepted bool, receiveEmailsAccepted bool) *model.AppError
}
// namer is an interface which enforces that
// all services can return their names.
type namer interface {
@@ -120,6 +127,7 @@ func NewChannels(s *Server, services map[ServiceKey]interface{}) (*Channels, err
}
ch.cfgSvc = cfgSvc
}
}
// We are passing a partially filled Channels struct so that the enterprise
// methods can have access to app methods.

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

@@ -17,6 +17,7 @@ import (
"github.com/mattermost/mattermost-server/v6/jobs"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/shared/mlog"
"github.com/mattermost/mattermost-server/v6/store"
"github.com/mattermost/mattermost-server/v6/utils"
)
@@ -28,6 +29,62 @@ const (
var RequestTrialURL = "https://customers.mattermost.com/api/v1/trials"
// licenseWrapper is an adapter struct that only exposes the
// config related functionality to be passed down to other products.
type licenseWrapper struct {
srv *Server
}
func (w *licenseWrapper) Name() ServiceKey {
return LicenseKey
}
func (w *licenseWrapper) GetLicense() *model.License {
return w.srv.License()
}
func (w *licenseWrapper) RequestTrialLicense(requesterID string, users int, termsAccepted bool, receiveEmailsAccepted bool) *model.AppError {
if *w.srv.Config().ExperimentalSettings.RestrictSystemAdmin {
return model.NewAppError("RequestTrialLicense", "api.restricted_system_admin", nil, "", http.StatusForbidden)
}
if !termsAccepted {
return model.NewAppError("RequestTrialLicense", "api.license.request-trial.bad-request.terms-not-accepted", nil, "", http.StatusBadRequest)
}
if users == 0 {
return model.NewAppError("RequestTrialLicense", "api.license.request-trial.bad-request", nil, "", http.StatusBadRequest)
}
requester, err := w.srv.userService.GetUser(requesterID)
if err != nil {
var nfErr *store.ErrNotFound
switch {
case errors.As(err, &nfErr):
return model.NewAppError("RequestTrialLicense", MissingAccountError, nil, nfErr.Error(), http.StatusNotFound)
default:
return model.NewAppError("RequestTrialLicense", "app.user.get_by_username.app_error", nil, err.Error(), http.StatusInternalServerError)
}
}
if *w.srv.Config().ServiceSettings.SiteURL == "" {
return model.NewAppError("RequestTrialLicense", "api.license.request_trial_license.no-site-url.app_error", nil, "", http.StatusBadRequest)
}
trialLicenseRequest := &model.TrialLicenseRequest{
ServerID: w.srv.TelemetryId(),
Name: requester.GetDisplayName(model.ShowFullName),
Email: requester.Email,
SiteName: *w.srv.Config().TeamSettings.SiteName,
SiteURL: *w.srv.Config().ServiceSettings.SiteURL,
Users: users,
TermsAccepted: termsAccepted,
ReceiveEmailsAccepted: receiveEmailsAccepted,
}
return w.srv.RequestTrialLicense(trialLicenseRequest)
}
// JWTClaims custom JWT claims with the needed information for the
// renewal process
type JWTClaims struct {

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

@@ -1409,7 +1409,8 @@ func TestPushNotificationRace(t *testing.T) {
}
s.configStore = &configWrapper{srv: s, Store: memoryStore}
serviceMap := map[ServiceKey]interface{}{
ConfigKey: s.configStore,
ConfigKey: s.configStore,
LicenseKey: &licenseWrapper{s},
}
ch, err := NewChannels(s, serviceMap)
require.NoError(t, err)

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

@@ -89,7 +89,8 @@ var SentryDSN = "placeholder_sentry_dsn"
type ServiceKey string
const (
ConfigKey ServiceKey = "config"
ConfigKey ServiceKey = "config"
LicenseKey ServiceKey = "license"
)
type Server struct {
@@ -141,6 +142,7 @@ type Server struct {
licenseValue atomic.Value
clientLicenseValue atomic.Value
licenseListeners map[string]func(*model.License, *model.License)
licenseWrapper *licenseWrapper
timezones *timezones.Timezones
@@ -255,10 +257,15 @@ func NewServer(options ...Option) (*Server, error) {
mlog.Info("Server is initializing...", mlog.String("go_version", runtime.Version()))
s.httpService = httpservice.MakeHTTPService(s)
s.licenseWrapper = &licenseWrapper{
srv: s,
}
serviceMap := map[ServiceKey]interface{}{
ConfigKey: s.configStore,
ConfigKey: s.configStore,
LicenseKey: s.licenseWrapper,
}
// Step 3: Initialize products.
// Depends on s.httpService.
for name, initializer := range products {