github.com/levb/mattermost-server@v5.3.1+incompatible/store/redis_supplier_roles.go (about) 1 // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package store 5 6 import ( 7 "context" 8 "fmt" 9 10 "github.com/mattermost/mattermost-server/mlog" 11 "github.com/mattermost/mattermost-server/model" 12 ) 13 14 func (s *RedisSupplier) RoleSave(ctx context.Context, role *model.Role, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 15 key := buildRedisKeyForRoleName(role.Name) 16 17 defer func() { 18 if err := s.client.Del(key).Err(); err != nil { 19 mlog.Error("Redis failed to remove key " + key + " Error: " + err.Error()) 20 } 21 }() 22 23 return s.Next().RoleSave(ctx, role, hints...) 24 } 25 26 func (s *RedisSupplier) RoleGet(ctx context.Context, roleId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 27 // Roles are cached by name, as that is most commonly how they are looked up. 28 // This means that no caching is supported on roles being looked up by ID. 29 return s.Next().RoleGet(ctx, roleId, hints...) 30 } 31 32 func (s *RedisSupplier) RoleGetByName(ctx context.Context, name string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 33 key := buildRedisKeyForRoleName(name) 34 35 var role *model.Role 36 found, err := s.load(key, &role) 37 if err != nil { 38 mlog.Error("Redis encountered an error on read: " + err.Error()) 39 } else if found { 40 result := NewSupplierResult() 41 result.Data = role 42 return result 43 } 44 45 result := s.Next().RoleGetByName(ctx, name, hints...) 46 47 if result.Err == nil { 48 if err := s.save(key, result.Data, REDIS_EXPIRY_TIME); err != nil { 49 mlog.Error("Redis encountered and error on write: " + err.Error()) 50 } 51 } 52 53 return result 54 } 55 56 func (s *RedisSupplier) RoleGetByNames(ctx context.Context, roleNames []string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 57 var foundRoles []*model.Role 58 var rolesToQuery []string 59 60 for _, roleName := range roleNames { 61 var role *model.Role 62 found, err := s.load(buildRedisKeyForRoleName(roleName), &role) 63 if err == nil && found { 64 foundRoles = append(foundRoles, role) 65 } else { 66 rolesToQuery = append(rolesToQuery, roleName) 67 if err != nil { 68 mlog.Error("Redis encountered an error on read: " + err.Error()) 69 } 70 } 71 } 72 73 result := s.Next().RoleGetByNames(ctx, rolesToQuery, hints...) 74 75 if result.Err == nil { 76 rolesFound := result.Data.([]*model.Role) 77 for _, role := range rolesFound { 78 if err := s.save(buildRedisKeyForRoleName(role.Name), role, REDIS_EXPIRY_TIME); err != nil { 79 mlog.Error("Redis encountered and error on write: " + err.Error()) 80 } 81 } 82 result.Data = append(foundRoles, result.Data.([]*model.Role)...) 83 } 84 85 return result 86 } 87 88 func (s *RedisSupplier) RoleDelete(ctx context.Context, roleId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 89 result := s.Next().RoleGet(ctx, roleId, hints...) 90 91 if result.Err == nil { 92 defer func() { 93 role := result.Data.(*model.Role) 94 key := buildRedisKeyForRoleName(role.Name) 95 96 if err := s.client.Del(key).Err(); err != nil { 97 mlog.Error("Redis failed to remove key " + key + " Error: " + err.Error()) 98 } 99 }() 100 } 101 102 return s.Next().RoleDelete(ctx, roleId, hints...) 103 } 104 105 func (s *RedisSupplier) RolePermanentDeleteAll(ctx context.Context, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { 106 defer func() { 107 if keys, err := s.client.Keys("roles:*").Result(); err != nil { 108 mlog.Error("Redis encountered an error on read: " + err.Error()) 109 } else { 110 if err := s.client.Del(keys...).Err(); err != nil { 111 mlog.Error("Redis encountered an error on delete: " + err.Error()) 112 } 113 } 114 }() 115 116 return s.Next().RolePermanentDeleteAll(ctx, hints...) 117 } 118 119 func buildRedisKeyForRoleName(roleName string) string { 120 return fmt.Sprintf("roles:%s", roleName) 121 }