github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/searchlayer/layer.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package searchlayer 5 6 import ( 7 "github.com/mattermost/mattermost-server/v5/mlog" 8 "github.com/mattermost/mattermost-server/v5/model" 9 "github.com/mattermost/mattermost-server/v5/services/searchengine" 10 "github.com/mattermost/mattermost-server/v5/store" 11 ) 12 13 type SearchStore struct { 14 store.Store 15 searchEngine *searchengine.Broker 16 user *SearchUserStore 17 team *SearchTeamStore 18 channel *SearchChannelStore 19 post *SearchPostStore 20 config *model.Config 21 } 22 23 func NewSearchLayer(baseStore store.Store, searchEngine *searchengine.Broker, cfg *model.Config) *SearchStore { 24 searchStore := &SearchStore{ 25 Store: baseStore, 26 searchEngine: searchEngine, 27 config: cfg, 28 } 29 searchStore.channel = &SearchChannelStore{ChannelStore: baseStore.Channel(), rootStore: searchStore} 30 searchStore.post = &SearchPostStore{PostStore: baseStore.Post(), rootStore: searchStore} 31 searchStore.team = &SearchTeamStore{TeamStore: baseStore.Team(), rootStore: searchStore} 32 searchStore.user = &SearchUserStore{UserStore: baseStore.User(), rootStore: searchStore} 33 34 return searchStore 35 } 36 37 func (s *SearchStore) UpdateConfig(cfg *model.Config) { 38 s.config = cfg 39 } 40 41 func (s *SearchStore) Channel() store.ChannelStore { 42 return s.channel 43 } 44 45 func (s *SearchStore) Post() store.PostStore { 46 return s.post 47 } 48 49 func (s *SearchStore) Team() store.TeamStore { 50 return s.team 51 } 52 53 func (s *SearchStore) User() store.UserStore { 54 return s.user 55 } 56 57 func (s *SearchStore) indexUserFromID(userId string) { 58 user, err := s.User().Get(userId) 59 if err != nil { 60 return 61 } 62 s.indexUser(user) 63 } 64 65 func (s *SearchStore) indexUser(user *model.User) { 66 for _, engine := range s.searchEngine.GetActiveEngines() { 67 if engine.IsIndexingEnabled() { 68 runIndexFn(engine, func(engineCopy searchengine.SearchEngineInterface) { 69 userTeams, err := s.Team().GetTeamsByUserId(user.Id) 70 if err != nil { 71 mlog.Error("Encountered error indexing user", mlog.String("user_id", user.Id), mlog.String("search_engine", engineCopy.GetName()), mlog.Err(err)) 72 return 73 } 74 75 userTeamsIds := []string{} 76 for _, team := range userTeams { 77 userTeamsIds = append(userTeamsIds, team.Id) 78 } 79 80 userChannelMembers, err := s.Channel().GetAllChannelMembersForUser(user.Id, false, true) 81 if err != nil { 82 mlog.Error("Encountered error indexing user", mlog.String("user_id", user.Id), mlog.String("search_engine", engineCopy.GetName()), mlog.Err(err)) 83 return 84 } 85 86 userChannelsIds := []string{} 87 for channelId := range userChannelMembers { 88 userChannelsIds = append(userChannelsIds, channelId) 89 } 90 91 if err := engineCopy.IndexUser(user, userTeamsIds, userChannelsIds); err != nil { 92 mlog.Error("Encountered error indexing user", mlog.String("user_id", user.Id), mlog.String("search_engine", engineCopy.GetName()), mlog.Err(err)) 93 return 94 } 95 mlog.Debug("Indexed user in search engine", mlog.String("search_engine", engineCopy.GetName()), mlog.String("user_id", user.Id)) 96 }) 97 } 98 } 99 } 100 101 // Runs an indexing function synchronously or asynchronously depending on the engine 102 func runIndexFn(engine searchengine.SearchEngineInterface, indexFn func(searchengine.SearchEngineInterface)) { 103 if engine.IsIndexingSync() { 104 indexFn(engine) 105 if err := engine.RefreshIndexes(); err != nil { 106 mlog.Error("Encountered error refresh the indexes", mlog.Err(err)) 107 } 108 } else { 109 go (func(engineCopy searchengine.SearchEngineInterface) { 110 indexFn(engineCopy) 111 })(engine) 112 } 113 }