diff options
-rw-r--r-- | api/channel.go | 2 | ||||
-rw-r--r-- | api/user.go | 3 | ||||
-rw-r--r-- | api/web_hub.go | 1 | ||||
-rw-r--r-- | store/sql_user_store.go | 13 | ||||
-rw-r--r-- | store/store.go | 1 |
5 files changed, 20 insertions, 0 deletions
diff --git a/api/channel.go b/api/channel.go index 81220a503..ea39ee398 100644 --- a/api/channel.go +++ b/api/channel.go @@ -1176,6 +1176,8 @@ func updateNotifyProps(c *Context, w http.ResponseWriter, r *http.Request) { c.Err = result.Err return } else { + InvalidateCacheForUser(userId) + // return the updated notify properties including any unchanged ones w.Write([]byte(model.MapToJson(member.NotifyProps))) } diff --git a/api/user.go b/api/user.go index b961aa609..e78b5be03 100644 --- a/api/user.go +++ b/api/user.go @@ -1398,6 +1398,8 @@ func updateUser(c *Context, w http.ResponseWriter, r *http.Request) { go sendEmailChangeUsername(c, rusers[1].Username, rusers[0].Username, rusers[0].Email, c.GetSiteURL()) } + InvalidateCacheForUser(user.Id) + updatedUser := rusers[0] updatedUser = sanitizeProfile(c, updatedUser) @@ -1955,6 +1957,7 @@ func updateUserNotify(c *Context, w http.ResponseWriter, r *http.Request) { return } else { c.LogAuditWithUserId(user.Id, "") + InvalidateCacheForUser(user.Id) ruser := result.Data.([2]*model.User)[0] options := utils.Cfg.GetSanitizeOptions() diff --git a/api/web_hub.go b/api/web_hub.go index 73b94bf1d..b607703f2 100644 --- a/api/web_hub.go +++ b/api/web_hub.go @@ -112,6 +112,7 @@ func InvalidateCacheForUser(userId string) { func InvalidateCacheForUserSkipClusterSend(userId string) { Srv.Store.Channel().InvalidateAllChannelMembersForUser(userId) + Srv.Store.User().InvalidateProfilesInChannelCacheByUser(userId) GetHubForUserId(userId).InvalidateUser(userId) } diff --git a/store/sql_user_store.go b/store/sql_user_store.go index 984b544d7..aa3bb4380 100644 --- a/store/sql_user_store.go +++ b/store/sql_user_store.go @@ -555,6 +555,19 @@ func (us SqlUserStore) GetProfiles(teamId string, offset int, limit int) StoreCh return storeChannel } +func (us SqlUserStore) InvalidateProfilesInChannelCacheByUser(userId string) { + keys := profilesInChannelCache.Keys() + + for _, key := range keys { + if cacheItem, ok := profilesInChannelCache.Get(key); ok { + userMap := cacheItem.(map[string]*model.User) + if _, userInCache := userMap[userId]; userInCache { + profilesInChannelCache.Remove(key) + } + } + } +} + func (us SqlUserStore) InvalidateProfilesInChannelCache(channelId string) { profilesInChannelCache.Remove(channelId) } diff --git a/store/store.go b/store/store.go index 83a077c10..d0790263a 100644 --- a/store/store.go +++ b/store/store.go @@ -143,6 +143,7 @@ type UserStore interface { UpdateMfaActive(userId string, active bool) StoreChannel Get(id string) StoreChannel GetAll() StoreChannel + InvalidateProfilesInChannelCacheByUser(userId string) InvalidateProfilesInChannelCache(channelId string) GetProfilesInChannel(channelId string, offset int, limit int, allowFromCache bool) StoreChannel GetProfilesNotInChannel(teamId string, channelId string, offset int, limit int) StoreChannel |