boosty
1package auth
2
3import (
4"encoding/json"
5"fmt"
6"os"
7)
8
9type Callback func(info Info)
10
11type Info struct {
12AccessToken string `json:"accessToken"`
13RefreshToken string `json:"refreshToken"`
14ExpiresAt int64 `json:"expiresAt"`
15DeviceId string `json:"deviceId"`
16}
17
18type Auth struct {
19file string
20info Info
21callback Callback
22}
23
24func New(options ...Option) (*Auth, error) {
25auth := &Auth{
26file: "",
27info: Info{},
28}
29
30for _, o := range options {
31if err := o(auth); err != nil {
32return nil, err
33}
34}
35
36return auth, nil
37}
38
39func (a *Auth) Info() Info {
40return a.info
41}
42
43func (a *Auth) Update(info Info) {
44a.info = info
45if a.callback != nil {
46a.callback(info)
47}
48}
49
50func (a *Auth) BearerHeader() string {
51return "Bearer " + a.info.AccessToken
52}
53
54func (a *Auth) RefreshToken() string {
55return a.info.RefreshToken
56}
57
58func (a *Auth) DeviceId() string {
59return a.info.DeviceId
60}
61
62func (a *Auth) Save() error {
63if a.file == "" {
64return nil
65}
66
67data, err := json.Marshal(a.info)
68if err != nil {
69return fmt.Errorf("error on marshal auth data: %w", err)
70}
71return os.WriteFile(a.file, data, 0644)
72}
73