/
banned_user.go
87 lines (79 loc) · 2.94 KB
/
banned_user.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
package types
import (
"database/sql"
"time"
sq "github.com/Masterminds/squirrel"
"github.com/gbl08ma/sqalx"
"github.com/palantir/stacktrace"
)
// BannedUser is a user ban
type BannedUser struct {
BanID string `dbKey:"true"`
BannedAt time.Time
BannedUntil sql.NullTime
Address string
RemoteAddress string
FromChat bool
FromEnqueuing bool
FromRewards bool
Reason string
UnbanReason string
ModeratorAddress string
ModeratorName string
}
// GetBannedUsers returns all registered user bans, starting with the most recent one
func GetBannedUsers(node sqalx.Node, filter string, pagParams *PaginationParams) ([]*BannedUser, uint64, error) {
s := sdb.Select().
OrderBy("banned_user.banned_at DESC, banned_user.ban_id ASC")
if filter != "" {
s = s.Where(sq.Or{
sq.Eq{"banned_user.ban_id": filter},
sq.Expr("UPPER(banned_user.address) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.remote_address) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.reason) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.unban_reason) LIKE '%' || UPPER(?) || '%'", filter),
})
}
s = applyPaginationParameters(s, pagParams)
return GetWithSelectAndCount[*BannedUser](node, s)
}
// GetBannedUserWithIDs returns the user bans with the specified IDs
func GetBannedUserWithIDs(node sqalx.Node, ids []string) (map[string]*BannedUser, error) {
s := sdb.Select().
Where(sq.Eq{"banned_user.ban_id": ids})
items, err := GetWithSelect[*BannedUser](node, s)
if err != nil {
return map[string]*BannedUser{}, stacktrace.Propagate(err, "")
}
result := make(map[string]*BannedUser, len(items))
for i := range items {
result[items[i].BanID] = items[i]
}
return result, nil
}
// GetBannedUsersAtInstant returns a slice with all user bans in effect at the specified instant, starting with the most recent one
func GetBannedUsersAtInstant(node sqalx.Node, instant time.Time, filter string, pagParams *PaginationParams) ([]*BannedUser, uint64, error) {
s := sdb.Select().
From("banned_user").
Where(sq.Lt{"banned_user.banned_at": instant}).
Where(sq.Or{
sq.Expr("banned_user.banned_until IS NULL"),
sq.GtOrEq{"banned_user.banned_until": instant},
}).
OrderBy("banned_user.banned_at DESC, banned_user.ban_id ASC")
if filter != "" {
s = s.Where(sq.Or{
sq.Eq{"banned_user.ban_id": filter},
sq.Expr("UPPER(banned_user.address) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.remote_address) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.reason) LIKE '%' || UPPER(?) || '%'", filter),
sq.Expr("UPPER(banned_user.unban_reason) LIKE '%' || UPPER(?) || '%'", filter),
})
}
s = applyPaginationParameters(s, pagParams)
return GetWithSelectAndCount[*BannedUser](node, s)
}
// Update updates or inserts the BannedUser
func (obj *BannedUser) Update(node sqalx.Node) error {
return Update(node, obj)
}