github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/redis_supplier_roles.go (about) 1 // Copyright (c) 2016-present Xenia, 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/xzl8028/xenia-server/mlog" 11 "github.com/xzl8028/xenia-server/model" 12 ) 13 14 func (s *RedisSupplier) RoleSave(ctx context.Context, role *model.Role, hints ...LayeredStoreHint) (*model.Role, *model.AppError) { 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) (*model.Role, *model.AppError) { 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) RoleGetAll(ctx context.Context, hints ...LayeredStoreHint) ([]*model.Role, *model.AppError) { 33 // Roles are cached by name, as that is most commonly how they are looked up. 34 // This means that no caching is supported on roles being listed. 35 return s.Next().RoleGetAll(ctx, hints...) 36 } 37 38 func (s *RedisSupplier) RoleGetByName(ctx context.Context, name string, hints ...LayeredStoreHint) (*model.Role, *model.AppError) { 39 key := buildRedisKeyForRoleName(name) 40 41 var role *model.Role 42 found, err := s.load(key, &role) 43 if err != nil { 44 mlog.Error("Redis encountered an error on read: " + err.Error()) 45 } else if found { 46 return role, nil 47 } 48 49 role, appErr := s.Next().RoleGetByName(ctx, name, hints...) 50 51 if appErr == nil { 52 if err := s.save(key, role, REDIS_EXPIRY_TIME); err != nil { 53 mlog.Error("Redis encountered and error on write: " + err.Error()) 54 } 55 } 56 57 return role, appErr 58 } 59 60 func (s *RedisSupplier) RoleGetByNames(ctx context.Context, roleNames []string, hints ...LayeredStoreHint) ([]*model.Role, *model.AppError) { 61 var foundRoles []*model.Role 62 var rolesToQuery []string 63 64 for _, roleName := range roleNames { 65 var role *model.Role 66 found, err := s.load(buildRedisKeyForRoleName(roleName), &role) 67 if err == nil && found { 68 foundRoles = append(foundRoles, role) 69 } else { 70 rolesToQuery = append(rolesToQuery, roleName) 71 if err != nil { 72 mlog.Error("Redis encountered an error on read: " + err.Error()) 73 } 74 } 75 } 76 77 rolesFound, appErr := s.Next().RoleGetByNames(ctx, rolesToQuery, hints...) 78 79 if appErr == nil { 80 for _, role := range rolesFound { 81 if err := s.save(buildRedisKeyForRoleName(role.Name), role, REDIS_EXPIRY_TIME); err != nil { 82 mlog.Error("Redis encountered and error on write: " + err.Error()) 83 } 84 } 85 foundRoles = append(foundRoles, rolesFound...) 86 } 87 88 return foundRoles, appErr 89 } 90 91 func (s *RedisSupplier) RoleDelete(ctx context.Context, roleId string, hints ...LayeredStoreHint) (*model.Role, *model.AppError) { 92 role, appErr := s.Next().RoleGet(ctx, roleId, hints...) 93 94 if appErr == nil { 95 defer func() { 96 key := buildRedisKeyForRoleName(role.Name) 97 98 if err := s.client.Del(key).Err(); err != nil { 99 mlog.Error("Redis failed to remove key " + key + " Error: " + err.Error()) 100 } 101 }() 102 } 103 104 return s.Next().RoleDelete(ctx, roleId, hints...) 105 } 106 107 func (s *RedisSupplier) RolePermanentDeleteAll(ctx context.Context, hints ...LayeredStoreHint) *model.AppError { 108 defer func() { 109 if keys, err := s.client.Keys("roles:*").Result(); err != nil { 110 mlog.Error("Redis encountered an error on read: " + err.Error()) 111 } else { 112 if err := s.client.Del(keys...).Err(); err != nil { 113 mlog.Error("Redis encountered an error on delete: " + err.Error()) 114 } 115 } 116 }() 117 118 return s.Next().RolePermanentDeleteAll(ctx, hints...) 119 } 120 121 func buildRedisKeyForRoleName(roleName string) string { 122 return fmt.Sprintf("roles:%s", roleName) 123 }