-
Notifications
You must be signed in to change notification settings - Fork 1
/
manager.go
82 lines (66 loc) · 1.5 KB
/
manager.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
79
80
81
82
package manager
//go:generate mockgen -source=manager.go -destination=../mocks/manager.go -package=mocks
import (
"context"
"time"
)
var _ TokenManager = new(manager)
// KeyToken is the key to be used for storing the token.
const KeyToken = "manager:token:valuefirst"
// TokenManager is the contract of the token manager.
type TokenManager interface {
// Get gets the token from the storage.Hub.
Get(ctx context.Context) (token string, err error)
}
// Manager is a token manager.
type manager struct {
opt *Option
}
// Assign assigns the option to the manager.
func (m *manager) Assign(o *Option) *manager {
if o == nil {
return m
}
m.opt = o
return m
}
// New creates a new token manager.
func New(opts ...FnOption) (tm TokenManager) {
return (new(manager)).Assign(
(new(Option)).
Assign(opts...).
Default().
Clone(),
)
}
// Get gets the token from the storage.
func (m *manager) Get(ctx context.Context) (token string, err error) {
err = m.opt.Validate()
if err != nil {
return
}
now := time.Now()
res, err := m.opt.Storage.Get(ctx, m.opt.Key)
if !(err != nil || res == nil || res.IsExpired(now)) {
token = res.Data
return
}
tokenResp, err := m.opt.Client.GenerateToken(ctx)
if err != nil {
return
}
_, err = m.opt.Client.EnableToken(ctx, tokenResp.Token)
if err != nil {
return
}
res, err = tokenResp.ToToken()
if err != nil {
return
}
err = m.opt.Storage.Save(ctx, m.opt.Key, res.SetHalfExpiredDate(now))
if err != nil {
return
}
token = res.Data
return
}