redis_storage.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package dingtalk
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "time"
  7. redisLib "github.com/go-redis/redis/v8"
  8. )
  9. // redisTokenStorage 用 go-redis 实现的 TokenStorage
  10. type redisTokenStorage struct {
  11. cli *redisLib.Client
  12. keyPrefix string
  13. }
  14. // NewRedisTokenStorage 基于 *redisLib.Client 构造 TokenStorage
  15. // keyPrefix 默认:"dingtalk:access_token:"
  16. func NewRedisTokenStorage(cli *redisLib.Client, keyPrefix string) TokenStorage {
  17. if keyPrefix == "" {
  18. keyPrefix = "dingtalk:access_token:"
  19. }
  20. return &redisTokenStorage{cli: cli, keyPrefix: keyPrefix}
  21. }
  22. func (r *redisTokenStorage) key(clientID string) string {
  23. return fmt.Sprintf("%s%s", r.keyPrefix, clientID)
  24. }
  25. // GetToken 从 Redis 读取 token;未命中返回 ("", nil)
  26. func (r *redisTokenStorage) GetToken(ctx context.Context, clientID string) (string, error) {
  27. if r.cli == nil {
  28. return "", nil
  29. }
  30. val, err := r.cli.Get(ctx, r.key(clientID)).Result()
  31. if err != nil {
  32. if errors.Is(err, redisLib.Nil) {
  33. return "", nil
  34. }
  35. return "", err
  36. }
  37. return val, nil
  38. }
  39. // SetToken 写入 Redis,ttl<=0 时删除该 key
  40. func (r *redisTokenStorage) SetToken(ctx context.Context, clientID, token string, ttl time.Duration) error {
  41. if r.cli == nil {
  42. return nil
  43. }
  44. if token == "" || ttl <= 0 {
  45. return r.cli.Del(ctx, r.key(clientID)).Err()
  46. }
  47. return r.cli.Set(ctx, r.key(clientID), token, ttl).Err()
  48. }