diff options
author | George Goldberg <george@gberg.me> | 2018-03-27 22:36:55 +0100 |
---|---|---|
committer | George Goldberg <george@gberg.me> | 2018-03-27 22:36:55 +0100 |
commit | 71c9dff7662868770f66ab876ad66b354133c2c1 (patch) | |
tree | e2d5d8c5ad203b42af868ee18399c42a9ab08385 /store/local_cache_supplier_roles.go | |
parent | 2af4c7e6496d4c5192fedf5001817f6f1eb3664b (diff) | |
parent | e13e64711f7a7e8ceadb8cbc6af72c4022c95b36 (diff) | |
download | chat-71c9dff7662868770f66ab876ad66b354133c2c1.tar.gz chat-71c9dff7662868770f66ab876ad66b354133c2c1.tar.bz2 chat-71c9dff7662868770f66ab876ad66b354133c2c1.zip |
Merge branch 'advanced-permissions-phase-1'
Diffstat (limited to 'store/local_cache_supplier_roles.go')
-rw-r--r-- | store/local_cache_supplier_roles.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/store/local_cache_supplier_roles.go b/store/local_cache_supplier_roles.go new file mode 100644 index 000000000..8cbde0a23 --- /dev/null +++ b/store/local_cache_supplier_roles.go @@ -0,0 +1,70 @@ +// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package store + +import ( + "context" + + "github.com/mattermost/mattermost-server/model" +) + +func (s *LocalCacheSupplier) handleClusterInvalidateRole(msg *model.ClusterMessage) { + if msg.Data == CLEAR_CACHE_MESSAGE_DATA { + s.roleCache.Purge() + } else { + s.roleCache.Remove(msg.Data) + } +} + +func (s *LocalCacheSupplier) RoleSave(ctx context.Context, role *model.Role, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { + if len(role.Id) != 0 { + defer s.doInvalidateCacheCluster(s.roleCache, role.Name) + } + return s.Next().RoleSave(ctx, role, hints...) +} + +func (s *LocalCacheSupplier) RoleGet(ctx context.Context, roleId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { + // Roles are cached by name, as that is most commonly how they are looked up. + // This means that no caching is supported on roles being looked up by ID. + return s.Next().RoleGet(ctx, roleId, hints...) +} + +func (s *LocalCacheSupplier) RoleGetByName(ctx context.Context, name string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { + if result := s.doStandardReadCache(ctx, s.roleCache, name, hints...); result != nil { + return result + } + + result := s.Next().RoleGetByName(ctx, name, hints...) + + s.doStandardAddToCache(ctx, s.roleCache, name, result, hints...) + + return result +} + +func (s *LocalCacheSupplier) RoleGetByNames(ctx context.Context, roleNames []string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { + var foundRoles []*model.Role + var rolesToQuery []string + + for _, roleName := range roleNames { + if result := s.doStandardReadCache(ctx, s.roleCache, roleName, hints...); result != nil { + foundRoles = append(foundRoles, result.Data.(*model.Role)) + } else { + rolesToQuery = append(rolesToQuery, roleName) + } + } + + result := s.Next().RoleGetByNames(ctx, rolesToQuery, hints...) + + if result.Data != nil { + rolesFound := result.Data.([]*model.Role) + for _, role := range rolesFound { + res := NewSupplierResult() + res.Data = role + s.doStandardAddToCache(ctx, s.roleCache, role.Name, res, hints...) + } + result.Data = append(foundRoles, result.Data.([]*model.Role)...) + } + + return result +} |