/
token.go
78 lines (68 loc) · 1.66 KB
/
token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package redis
import (
"strconv"
"github.com/go-redis/redis"
"github.com/elojah/game_01/pkg/account"
"github.com/elojah/game_01/pkg/storage"
"github.com/elojah/game_01/pkg/ulid"
)
const (
tokenKey = "token:"
tokenHCKey = "token_hc:"
)
// GetToken redis implementation.
func (s *Service) GetToken(subset account.TokenSubset) (account.Token, error) {
val, err := s.Get(tokenKey + subset.ID.String()).Result()
if err != nil {
if err != redis.Nil {
return account.Token{}, err
}
return account.Token{}, storage.ErrNotFound
}
var token storage.Token
if _, err := token.Unmarshal([]byte(val)); err != nil {
return account.Token{}, err
}
return token.Domain()
}
// SetToken redis implementation.
func (s *Service) SetToken(token account.Token) error {
raw, err := storage.NewToken(token).Marshal(nil)
if err != nil {
return err
}
return s.Set(tokenKey+token.ID.String(), raw, 0).Err()
}
// DelToken redis implementation.
func (s *Service) DelToken(subset account.TokenSubset) error {
return s.Del(tokenKey + subset.ID.String()).Err()
}
// SetTokenHC redis implementation.
func (s *Service) SetTokenHC(id ulid.ID, hc int64) error {
return s.ZAddNX(
tokenHCKey,
redis.Z{
Score: float64(hc),
Member: id.String(),
},
).Err()
}
// ListTokenHC redis implementation.
func (s *Service) ListTokenHC(subset account.TokenHCSubset) ([]ulid.ID, error) {
cmd := s.ZRangeByScore(
tokenHCKey,
redis.ZRangeBy{
Min: "-inf",
Max: strconv.FormatInt(subset.MaxTS, 10),
},
)
vals, err := cmd.Result()
if err != nil {
return nil, err
}
ids := make([]ulid.ID, len(vals))
for i, val := range vals {
ids[i] = ulid.MustParse(val)
}
return ids, nil
}