This repository has no description
1package db
2
3import (
4 "context"
5 "database/sql"
6 "errors"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9)
10
11func (d *DB) ListAllowedMembers() ([]syntax.DID, error) {
12 rows, err := d.Query(`select did from members where blocked = 0`)
13 if err != nil {
14 return nil, err
15 }
16 defer rows.Close()
17
18 var dids []syntax.DID
19 for rows.Next() {
20 var did syntax.DID
21 if err := rows.Scan(&did); err != nil {
22 return nil, err
23 }
24 dids = append(dids, did)
25 }
26
27 return dids, rows.Err()
28}
29
30// IsAllowedMember reports whether did is known and unblocked. Unknown DIDs get fallback.
31func (d *DB) IsAllowedMember(ctx context.Context, did syntax.DID, fallback bool) (bool, error) {
32 var blocked bool
33 err := d.QueryRowContext(ctx, `select blocked from members where did = ?`, did).Scan(&blocked)
34 if errors.Is(err, sql.ErrNoRows) {
35 return fallback, nil
36 }
37 if err != nil {
38 return false, err
39 }
40 return !blocked, nil
41}
42
43func (d *DB) AllowMember(ctx context.Context, did syntax.DID) error {
44 return d.UpsertMember(ctx, did, false)
45}
46
47func (d *DB) BlockMember(ctx context.Context, did syntax.DID) error {
48 return d.UpsertMember(ctx, did, true)
49}
50
51func (d *DB) UpsertMember(ctx context.Context, did syntax.DID, block bool) error {
52 _, err := d.ExecContext(ctx, `
53 insert into members (did, blocked) values (?, ?)
54 on conflict(did) do update set blocked = excluded.blocked
55 `, did, block)
56 return err
57}