-
Notifications
You must be signed in to change notification settings - Fork 16
/
token.go
107 lines (99 loc) · 2.93 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-License-Identifier: Apache-2.0
package firestore
import (
"cloud.google.com/go/firestore"
"context"
"fmt"
"github.com/thoughtworks/maeve-csms/manager/store"
"google.golang.org/api/iterator"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"time"
)
type token struct {
CountryCode string `firestore:"country"`
PartyId string `firestore:"partyId"`
Type string `firestore:"type"`
Uid string `firestore:"uid"`
ContractId string `firestore:"contractId"`
VisualNumber *string `firestore:"visual"`
Issuer string `firestore:"issuer"`
GroupId *string `firestore:"group"`
Valid bool `firestore:"valid"`
LanguageCode *string `firestore:"lang"`
CacheMode string `firestore:"cache"`
}
func (s *Store) SetToken(ctx context.Context, tok *store.Token) error {
tokenRef := s.client.Doc(fmt.Sprintf("Token/%s", tok.Uid))
tokenData := &token{
CountryCode: tok.CountryCode,
PartyId: tok.PartyId,
Type: tok.Type,
Uid: tok.Uid,
ContractId: tok.ContractId,
VisualNumber: tok.VisualNumber,
Issuer: tok.Issuer,
GroupId: tok.GroupId,
Valid: tok.Valid,
LanguageCode: tok.LanguageCode,
CacheMode: tok.CacheMode,
}
_, err := tokenRef.Set(ctx, tokenData)
if err != nil {
return fmt.Errorf("setting token: %s: %w", tok.Uid, err)
}
return nil
}
func (s *Store) LookupToken(ctx context.Context, tokenUid string) (*store.Token, error) {
tokenRef := s.client.Doc(fmt.Sprintf("Token/%s", tokenUid))
snap, err := tokenRef.Get(ctx)
if err != nil {
if status.Code(err) == codes.NotFound {
return nil, nil
}
return nil, fmt.Errorf("lookup token %s: %w", tokenUid, err)
}
return newToken(snap, tokenUid)
}
func newToken(snap *firestore.DocumentSnapshot, tokenUid string) (*store.Token, error) {
var tok token
if err := snap.DataTo(&tok); err != nil {
return nil, fmt.Errorf("map token: %s: %w", tokenUid, err)
}
return &store.Token{
CountryCode: tok.CountryCode,
PartyId: tok.PartyId,
Type: tok.Type,
Uid: tok.Uid,
ContractId: tok.ContractId,
VisualNumber: tok.VisualNumber,
Issuer: tok.Issuer,
GroupId: tok.GroupId,
Valid: tok.Valid,
LanguageCode: tok.LanguageCode,
CacheMode: tok.CacheMode,
LastUpdated: snap.UpdateTime.Format(time.RFC3339),
}, nil
}
func (s *Store) ListTokens(context context.Context, offset int, limit int) ([]*store.Token, error) {
var tokens []*store.Token
iter := s.client.Collection("Token").OrderBy("uid", firestore.Asc).Offset(offset).Limit(limit).Documents(context)
for {
doc, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
return nil, fmt.Errorf("next token: %w", err)
}
tok, err := newToken(doc, doc.Ref.ID)
if err != nil {
return nil, fmt.Errorf("map token: %w", err)
}
tokens = append(tokens, tok)
}
if tokens == nil {
tokens = make([]*store.Token, 0)
}
return tokens, nil
}