mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
`(a *App) InitServer` was being called from multiple goroutines and were modifying the fields of the App struct concurrently. However, the fields were just reflecting the Server fields, and we already have public getters for those fields. Therefore, we remove those fields and just change the code to return the server field directly. Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
115 lines
2.4 KiB
Go
115 lines
2.4 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package app
|
|
|
|
import (
|
|
"github.com/mattermost/mattermost-server/v5/mlog"
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/mattermost/mattermost-server/v5/config"
|
|
"github.com/mattermost/mattermost-server/v5/store"
|
|
)
|
|
|
|
type Option func(s *Server) error
|
|
|
|
// By default, the app will use the store specified by the configuration. This allows you to
|
|
// construct an app with a different store.
|
|
//
|
|
// The override parameter must be either a store.Store or func(App) store.Store().
|
|
func StoreOverride(override interface{}) Option {
|
|
return func(s *Server) error {
|
|
switch o := override.(type) {
|
|
case store.Store:
|
|
s.newStore = func() store.Store {
|
|
return o
|
|
}
|
|
return nil
|
|
|
|
case func(*Server) store.Store:
|
|
s.newStore = func() store.Store {
|
|
return o(s)
|
|
}
|
|
return nil
|
|
|
|
default:
|
|
return errors.New("invalid StoreOverride")
|
|
}
|
|
}
|
|
}
|
|
|
|
// Config applies the given config dsn, whether a path to config.json or a database connection string.
|
|
func Config(dsn string, watch bool) Option {
|
|
return func(s *Server) error {
|
|
configStore, err := config.NewStore(dsn, watch)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to apply Config option")
|
|
}
|
|
|
|
s.configStore = configStore
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// ConfigStore applies the given config store, typically to replace the traditional sources with a memory store for testing.
|
|
func ConfigStore(configStore config.Store) Option {
|
|
return func(s *Server) error {
|
|
s.configStore = configStore
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func RunJobs(s *Server) error {
|
|
s.runjobs = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func JoinCluster(s *Server) error {
|
|
s.joinCluster = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func StartMetrics(s *Server) error {
|
|
s.startMetrics = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func StartSearchEngine(s *Server) error {
|
|
s.startSearchEngine = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func SetLogger(logger *mlog.Logger) Option {
|
|
return func(s *Server) error {
|
|
s.Log = logger
|
|
return nil
|
|
}
|
|
}
|
|
|
|
type AppOption func(a *App)
|
|
type AppOptionCreator func() []AppOption
|
|
|
|
func ServerConnector(s *Server) AppOption {
|
|
return func(a *App) {
|
|
a.srv = s
|
|
a.log = s.Log
|
|
a.notificationsLog = s.NotificationsLog
|
|
|
|
a.cluster = s.Cluster
|
|
a.compliance = s.Compliance
|
|
a.dataRetention = s.DataRetention
|
|
a.searchEngine = s.SearchEngine
|
|
a.messageExport = s.MessageExport
|
|
a.metrics = s.Metrics
|
|
|
|
a.httpService = s.HTTPService
|
|
a.imageProxy = s.ImageProxy
|
|
a.timezones = s.timezones
|
|
}
|
|
}
|