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  }