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  }