This repository has no description
2.9 kB
134 lines
1package db
2
3import (
4 "context"
5 "database/sql"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8 "tangled.org/core/orm"
9)
10
11type KnotMember struct {
12 Id int
13 Did syntax.DID
14 Rkey string
15 Subject syntax.DID
16 Created string
17}
18
19func (d *DB) IsMigrationApplied(name string) (bool, error) {
20 var exists bool
21 err := d.db.QueryRow(
22 `select exists (select 1 from migrations where name = ?)`,
23 name,
24 ).Scan(&exists)
25 return exists, err
26}
27
28func (d *DB) ApplyKnotMemberBackfill(ctx context.Context, rows []KnotMember, migrationName string) error {
29 conn, err := d.db.Conn(ctx)
30 if err != nil {
31 return err
32 }
33 defer conn.Close()
34
35 return orm.RunMigration(conn, d.logger, migrationName, func(tx *sql.Tx) error {
36 for _, m := range rows {
37 if err := AddDid(tx, m.Subject.String()); err != nil {
38 return err
39 }
40 if err := AddKnotMemberDirect(tx, m.Did, m.Subject); err != nil {
41 return err
42 }
43 }
44 return nil
45 })
46}
47
48func AddKnotMemberDirect(q DBTX, addedBy, subject syntax.DID) error {
49 _, err := q.Exec(
50 `insert or ignore into knot_members (did, rkey, subject) values (?, NULL, ?)`,
51 addedBy,
52 subject,
53 )
54 return err
55}
56
57func RemoveKnotMemberBySubject(q DBTX, subject syntax.DID) error {
58 _, err := q.Exec(
59 "delete from knot_members where subject = ?",
60 subject,
61 )
62 return err
63}
64
65func RemoveKnotMemberDirect(q DBTX, subject syntax.DID) error {
66 _, err := q.Exec(
67 "delete from knot_members where subject = ? and rkey is null",
68 subject,
69 )
70 return err
71}
72
73func CountKnotMembersBySubject(q DBTX, subject string) (int, error) {
74 var count int
75 err := q.QueryRow(
76 `select count(*) from knot_members where subject = ?`,
77 subject,
78 ).Scan(&count)
79 return count, err
80}
81
82func ListKnotMembers(q DBTX, p ListPage) ([]KnotMember, *int, error) {
83 return listPaged(q,
84 `select id, did, subject, created
85 from knot_members
86 where id in (select min(id) from knot_members group by subject)`,
87 nil, p,
88 func(r *sql.Rows) (KnotMember, error) {
89 var m KnotMember
90 err := r.Scan(&m.Id, &m.Did, &m.Subject, &m.Created)
91 return m, err
92 },
93 func(m KnotMember) int { return m.Id },
94 )
95}
96
97func AddKnotMember(q DBTX, member KnotMember) error {
98 _, err := q.Exec(
99 `insert or ignore into knot_members (did, rkey, subject) values (?, ?, ?)`,
100 member.Did,
101 member.Rkey,
102 member.Subject,
103 )
104 return err
105}
106
107func RemoveKnotMember(q DBTX, ownerDid, rkey string) error {
108 _, err := q.Exec(
109 "delete from knot_members where did = ? and rkey = ?",
110 ownerDid,
111 rkey,
112 )
113 return err
114}
115
116func GetKnotMember(q DBTX, did, rkey string) (*KnotMember, error) {
117 query :=
118 `select id, did, rkey, subject
119 from knot_members
120 where did = ? and rkey = ?`
121
122 var member KnotMember
123 err := q.QueryRow(query, did, rkey).Scan(
124 &member.Id,
125 &member.Did,
126 &member.Rkey,
127 &member.Subject,
128 )
129 if err != nil {
130 return nil, err
131 }
132
133 return &member, nil
134}