-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathstore.go
104 lines (81 loc) · 2.01 KB
/
store.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
package memory
import (
"context"
"sync"
"github.com/google/uuid"
"github.com/code-payments/code-server/pkg/code/data/messaging"
)
type store struct {
mu sync.Mutex
records []*messaging.Record
}
// New returns a memory backed messaging.Store.
func New() messaging.Store {
return &store{
records: make([]*messaging.Record, 0),
}
}
// Insert implements messaging.Store.Insert.
func (s *store) Insert(_ context.Context, record *messaging.Record) error {
if err := record.Validate(); err != nil {
return err
}
s.mu.Lock()
defer s.mu.Unlock()
_, item := s.findByAccountAndMessageID(record.Account, record.MessageID)
if item != nil {
return messaging.ErrDuplicateMessageID
}
cloned := record.Clone()
s.records = append(s.records, &cloned)
return nil
}
// Delete implements messaging.Store.Delete.
func (s *store) Delete(_ context.Context, account string, messageID uuid.UUID) error {
s.mu.Lock()
defer s.mu.Unlock()
i, item := s.findByAccountAndMessageID(account, messageID)
if item == nil {
return nil
}
s.records = append(s.records[:i], s.records[i+1:]...)
return nil
}
// Get implements messaging.Store.Get.
func (s *store) Get(_ context.Context, account string) ([]*messaging.Record, error) {
s.mu.Lock()
defer s.mu.Unlock()
items := s.findByAccount(account)
var copied []*messaging.Record
for _, item := range items {
cloned := item.Clone()
copied = append(copied, &cloned)
}
return copied, nil
}
func (s *store) findByAccountAndMessageID(account string, messageID uuid.UUID) (int, *messaging.Record) {
for i, item := range s.records {
if item.Account != account {
continue
}
if item.MessageID != messageID {
continue
}
return i, item
}
return 0, nil
}
func (s *store) findByAccount(account string) []*messaging.Record {
var res []*messaging.Record
for _, item := range s.records {
if item.Account == account {
res = append(res, item)
}
}
return res
}
func (s *store) reset() {
s.mu.Lock()
defer s.mu.Unlock()
s.records = make([]*messaging.Record, 0)
}