-
Notifications
You must be signed in to change notification settings - Fork 390
/
accountfreezeevents.go
139 lines (115 loc) · 4.26 KB
/
accountfreezeevents.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright (C) 2022 Storj Labs, Inc.
// See LICENSE for copying information.
package satellitedb
import (
"context"
"encoding/json"
"storj.io/common/uuid"
"storj.io/storj/satellite/console"
"storj.io/storj/satellite/satellitedb/dbx"
)
// Ensure that accountFreezeEvents implements console.AccountFreezeEvents.
var _ console.AccountFreezeEvents = (*accountFreezeEvents)(nil)
// accountFreezeEvents is an implementation of console.AccountFreezeEvents.
type accountFreezeEvents struct {
db dbx.Methods
}
// Upsert is a method for updating an account freeze event if it exists and inserting it otherwise.
func (events *accountFreezeEvents) Upsert(ctx context.Context, event *console.AccountFreezeEvent) (_ *console.AccountFreezeEvent, err error) {
defer mon.Task()(&ctx)(&err)
if event == nil {
return nil, Error.New("event is nil")
}
createFields := dbx.AccountFreezeEvent_Create_Fields{}
if event.Limits != nil {
limitBytes, err := json.Marshal(event.Limits)
if err != nil {
return nil, err
}
createFields.Limits = dbx.AccountFreezeEvent_Limits(limitBytes)
}
dbxEvent, err := events.db.Replace_AccountFreezeEvent(ctx,
dbx.AccountFreezeEvent_UserId(event.UserID.Bytes()),
dbx.AccountFreezeEvent_Event(int(event.Type)),
createFields,
)
if err != nil {
return nil, err
}
return fromDBXAccountFreezeEvent(dbxEvent)
}
// Get is a method for querying account freeze event from the database by user ID and event type.
func (events *accountFreezeEvents) Get(ctx context.Context, userID uuid.UUID, eventType console.AccountFreezeEventType) (event *console.AccountFreezeEvent, err error) {
defer mon.Task()(&ctx)(&err)
dbxEvent, err := events.db.Get_AccountFreezeEvent_By_UserId_And_Event(ctx,
dbx.AccountFreezeEvent_UserId(userID.Bytes()),
dbx.AccountFreezeEvent_Event(int(eventType)),
)
if err != nil {
return nil, err
}
return fromDBXAccountFreezeEvent(dbxEvent)
}
// GetAll is a method for querying all account freeze events from the database by user ID.
func (events *accountFreezeEvents) GetAll(ctx context.Context, userID uuid.UUID) (freeze *console.AccountFreezeEvent, warning *console.AccountFreezeEvent, err error) {
defer mon.Task()(&ctx)(&err)
// dbxEvents will have a max length of 2.
// because there's at most 1 instance each of 2 types of events for a user.
dbxEvents, err := events.db.All_AccountFreezeEvent_By_UserId(ctx,
dbx.AccountFreezeEvent_UserId(userID.Bytes()),
)
if err != nil {
return nil, nil, err
}
for _, event := range dbxEvents {
if console.AccountFreezeEventType(event.Event) == console.Freeze {
freeze, err = fromDBXAccountFreezeEvent(event)
if err != nil {
return nil, nil, err
}
continue
}
warning, err = fromDBXAccountFreezeEvent(event)
if err != nil {
return nil, nil, err
}
}
return freeze, warning, nil
}
// DeleteAllByUserID is a method for deleting all account freeze events from the database by user ID.
func (events *accountFreezeEvents) DeleteAllByUserID(ctx context.Context, userID uuid.UUID) (err error) {
defer mon.Task()(&ctx)(&err)
_, err = events.db.Delete_AccountFreezeEvent_By_UserId(ctx, dbx.AccountFreezeEvent_UserId(userID.Bytes()))
return err
}
// DeleteByUserIDAndEvent is a method for deleting all account `eventType` events from the database by user ID.
func (events *accountFreezeEvents) DeleteByUserIDAndEvent(ctx context.Context, userID uuid.UUID, eventType console.AccountFreezeEventType) (err error) {
defer mon.Task()(&ctx)(&err)
_, err = events.db.Delete_AccountFreezeEvent_By_UserId_And_Event(ctx,
dbx.AccountFreezeEvent_UserId(userID.Bytes()),
dbx.AccountFreezeEvent_Event(int(eventType)),
)
return err
}
// fromDBXAccountFreezeEvent converts *dbx.AccountFreezeEvent to *console.AccountFreezeEvent.
func fromDBXAccountFreezeEvent(dbxEvent *dbx.AccountFreezeEvent) (_ *console.AccountFreezeEvent, err error) {
if dbxEvent == nil {
return nil, Error.New("dbx event is nil")
}
userID, err := uuid.FromBytes(dbxEvent.UserId)
if err != nil {
return nil, err
}
event := &console.AccountFreezeEvent{
UserID: userID,
Type: console.AccountFreezeEventType(dbxEvent.Event),
CreatedAt: dbxEvent.CreatedAt,
}
if dbxEvent.Limits != nil {
err := json.Unmarshal(dbxEvent.Limits, &event.Limits)
if err != nil {
return nil, err
}
}
return event, nil
}