-
Notifications
You must be signed in to change notification settings - Fork 0
/
relay_repository.go
89 lines (73 loc) · 1.97 KB
/
relay_repository.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
package sqlite
import (
"context"
"database/sql"
"github.com/boreq/errors"
"github.com/planetary-social/nos-event-service/service/domain"
)
type RelayRepository struct {
tx *sql.Tx
}
func NewRelayRepository(tx *sql.Tx) *RelayRepository {
return &RelayRepository{tx: tx}
}
func (r *RelayRepository) Save(ctx context.Context, eventID domain.EventId, relayAddress domain.MaybeRelayAddress) error {
_, err := r.tx.Exec(`
INSERT OR IGNORE INTO relays(address)
VALUES($1)`,
relayAddress.String(),
)
if err != nil {
return errors.Wrap(err, "error inserting the relay address")
}
row := r.tx.QueryRow(`
SELECT id FROM relays
WHERE address=$1`,
relayAddress.String(),
)
var dbRelayId int
if err := row.Scan(&dbRelayId); err != nil {
return errors.Wrap(err, "error getting the relay id")
}
row = r.tx.QueryRow(`
SELECT id FROM events
WHERE event_id=$1`,
eventID.Hex(),
)
var dbEventId int
if err := row.Scan(&dbEventId); err != nil {
return errors.Wrap(err, "error getting the event id")
}
_, err = r.tx.Exec(`
INSERT OR IGNORE INTO events_to_relays(event_id, relay_id)
VALUES($1, $2)`,
dbEventId, dbRelayId,
)
if err != nil {
return errors.Wrap(err, "error inserting the relationship")
}
return nil
}
func (r *RelayRepository) List(ctx context.Context) ([]domain.MaybeRelayAddress, error) {
rows, err := r.tx.Query(`SELECT address FROM relays`)
if err != nil {
return nil, errors.Wrap(err, "error selecting addresses")
}
var result []domain.MaybeRelayAddress
for rows.Next() {
var addressString string
if err := rows.Scan(&addressString); err != nil {
return nil, errors.Wrap(err, "error scanning")
}
result = append(result, domain.NewMaybeRelayAddress(addressString))
}
return result, nil
}
func (r *RelayRepository) Count(ctx context.Context) (int, error) {
row := r.tx.QueryRow(`SELECT COUNT(*) FROM relays`)
var count int
if err := row.Scan(&count); err != nil {
return 0, errors.Wrap(err, "error scanning")
}
return count, nil
}