forked from keybase/client
/
trackstorage.go
83 lines (73 loc) · 2.12 KB
/
trackstorage.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
package maps
import (
"context"
"github.com/keybase/client/go/chat/globals"
"github.com/keybase/client/go/chat/storage"
"github.com/keybase/client/go/encrypteddb"
"github.com/keybase/client/go/libkb"
"github.com/keybase/client/go/protocol/chat1"
"github.com/keybase/client/go/protocol/gregor1"
)
const diskTrackStorageVersion = 1
type diskLocationTrack struct {
ConvID chat1.ConversationID `codec:"C"`
MsgID chat1.MessageID `codec:"M"`
EndTime gregor1.Time `codec:"E"`
Coords []chat1.Coordinate `codec:"O"`
GetCurrentPosition bool `codec:"P"`
MaxCoords int `codec:"MC"`
Stopped bool `codec:"S"`
}
type diskTrackStorage struct {
Version int `codec:"V"`
Trackers []diskLocationTrack `codec:"T"`
}
type trackStorage struct {
globals.Contextified
encryptedDB *encrypteddb.EncryptedDB
}
func newTrackStorage(g *globals.Context) *trackStorage {
keyFn := func(ctx context.Context) ([32]byte, error) {
return storage.GetSecretBoxKey(ctx, g.ExternalG())
}
dbFn := func(g *libkb.GlobalContext) *libkb.JSONLocalDb {
return g.LocalChatDb
}
return &trackStorage{
Contextified: globals.NewContextified(g),
encryptedDB: encrypteddb.New(g.ExternalG(), dbFn, keyFn),
}
}
func (t *trackStorage) dbKey() libkb.DbKey {
return libkb.DbKey{
Typ: libkb.DBChatLocation,
Key: "tracks",
}
}
func (t *trackStorage) Save(ctx context.Context, trackers []*locationTrack) error {
var dat []diskLocationTrack
for _, t := range trackers {
dat = append(dat, t.ToDisk())
}
return t.encryptedDB.Put(ctx, t.dbKey(), diskTrackStorage{
Version: diskTrackStorageVersion,
Trackers: dat,
})
}
func (t *trackStorage) Restore(ctx context.Context) (res []*locationTrack, err error) {
var dat diskTrackStorage
found, err := t.encryptedDB.Get(ctx, t.dbKey(), &dat)
if err != nil {
return res, err
}
if !found {
return nil, nil
}
if dat.Version != diskTrackStorageVersion {
return nil, nil
}
for _, dt := range dat.Trackers {
res = append(res, newLocationTrackFromDisk(dt))
}
return res, nil
}