diff --git a/app/channels.go b/app/channels.go index ea84b478fe..2c9f1cee51 100644 --- a/app/channels.go +++ b/app/channels.go @@ -78,10 +78,10 @@ type Channels struct { postReminderMut sync.Mutex postReminderTask *model.ScheduledTask - // collectionTypes maps collection types array to the registering plugin - collectionTypes map[string][]string - // topicTypes maps topic types array to collection types - topicTypes map[string][]string + // collectionTypes maps from collection types to the registering plugin id + collectionTypes map[string]string + // topicTypes maps from topic types to collection types + topicTypes map[string]string collectionAndTopicTypesMut sync.Mutex } @@ -103,8 +103,8 @@ func NewChannels(s *Server, services map[ServiceKey]any) (*Channels, error) { srv: s, imageProxy: imageproxy.MakeImageProxy(s.platform, s.httpService, s.Log()), uploadLockMap: map[string]bool{}, - collectionTypes: map[string][]string{}, - topicTypes: map[string][]string{}, + collectionTypes: map[string]string{}, + topicTypes: map[string]string{}, } // To get another service: diff --git a/app/collection.go b/app/collection.go index 73fb5ce866..9b895e3bc0 100644 --- a/app/collection.go +++ b/app/collection.go @@ -8,7 +8,6 @@ import ( "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/shared/mlog" - "github.com/mattermost/mattermost-server/v6/utils" ) func (a *App) registerCollectionAndTopic(pluginID, collectionType, topicType string) error { @@ -17,29 +16,20 @@ func (a *App) registerCollectionAndTopic(pluginID, collectionType, topicType str defer a.ch.collectionAndTopicTypesMut.Unlock() // check if collectionType was already registered by other plugin - for existingPluginID, existingCollectionTypes := range a.ch.collectionTypes { - if existingPluginID != pluginID && utils.StringInSlice(collectionType, existingCollectionTypes) { - return model.NewAppError("registerCollectionAndTopic", "app.collection.add_collection.exists.app_error", nil, "", http.StatusBadRequest) - } + existingPluginID, ok := a.ch.collectionTypes[collectionType] + if ok && existingPluginID != pluginID { + return model.NewAppError("registerCollectionAndTopic", "app.collection.add_collection.exists.app_error", nil, "", http.StatusBadRequest) } // check if topicType was already registered to other collection - for existingCollectionType, existingTopicTypes := range a.ch.topicTypes { - if existingCollectionType != collectionType && utils.StringInSlice(topicType, existingTopicTypes) { - return model.NewAppError("registerCollectionAndTopic", "app.collection.add_topic.exists.app_error", nil, "", http.StatusBadRequest) - } + existingCollectionType, ok := a.ch.topicTypes[topicType] + if ok && existingCollectionType != collectionType { + return model.NewAppError("registerCollectionAndTopic", "app.collection.add_topic.exists.app_error", nil, "", http.StatusBadRequest) } - a.ch.collectionTypes[pluginID] = appendIfUnique(a.ch.collectionTypes[pluginID], collectionType) - a.ch.topicTypes[collectionType] = appendIfUnique(a.ch.topicTypes[collectionType], topicType) + a.ch.collectionTypes[collectionType] = pluginID + a.ch.topicTypes[topicType] = collectionType a.ch.srv.Log().Info("registered collection and topic type", mlog.String("plugin_id", pluginID), mlog.String("collection_type", collectionType), mlog.String("topic_type", topicType)) return nil } - -func appendIfUnique(slice []string, a string) []string { - if utils.StringInSlice(a, slice) { - return slice - } - return append(slice, a) -} diff --git a/app/plugin.go b/app/plugin.go index 3942ba7014..b9042330bf 100644 --- a/app/plugin.go +++ b/app/plugin.go @@ -486,10 +486,19 @@ func (a *App) DisablePlugin(id string) *model.AppError { } func (ch *Channels) disablePlugin(id string) *model.AppError { - for _, collectionType := range ch.collectionTypes[id] { - delete(ch.topicTypes, collectionType) + // find all collectionTypes registered by plugin + for collectionTypeToRemove, existingPluginId := range ch.collectionTypes { + if existingPluginId != id { + continue + } + // find all topicTypes for existing collectionType + for topicTypeToRemove, existingCollectionType := range ch.topicTypes { + if existingCollectionType == collectionTypeToRemove { + delete(ch.topicTypes, topicTypeToRemove) + } + } + delete(ch.collectionTypes, collectionTypeToRemove) } - delete(ch.collectionTypes, id) pluginsEnvironment := ch.GetPluginsEnvironment() if pluginsEnvironment == nil {