1package db
2
3import "github.com/bluesky-social/indigo/atproto/syntax"
4
5type Repo struct {
6 Did syntax.DID
7 Rkey syntax.RecordKey
8 Name string
9 Knot string
10}
11
12type RepoCollaborator struct {
13 Did syntax.DID
14 Rkey syntax.RecordKey
15 Repo syntax.ATURI
16 Subject syntax.DID
17}
18
19func (d *DB) PutRepo(repo *Repo) error {
20 _, err := d.Exec(
21 `insert or ignore into repos (did, rkey, name, knot)
22 values (?, ?, ?, ?)
23 on conflict(did, rkey) do update set
24 name = excluded.name
25 knot = excluded.knot`,
26 repo.Did,
27 repo.Rkey,
28 repo.Name,
29 repo.Knot,
30 )
31 return err
32}
33
34func (d *DB) DeleteRepo(did syntax.DID, rkey syntax.RecordKey) error {
35 _, err := d.Exec(
36 `delete from repos where did = ? and rkey = ?`,
37 did,
38 rkey,
39 )
40 return err
41}
42
43func (d *DB) Knots() ([]string, error) {
44 rows, err := d.Query(`select knot from repos`)
45 if err != nil {
46 return nil, err
47 }
48 defer rows.Close()
49
50 var knots []string
51 for rows.Next() {
52 var knot string
53 if err := rows.Scan(&knot); err != nil {
54 return nil, err
55 }
56 knots = append(knots, knot)
57 }
58
59 if err = rows.Err(); err != nil {
60 return nil, err
61 }
62
63 return knots, nil
64}
65
66func (d *DB) GetRepo(did syntax.DID, rkey syntax.RecordKey) (*Repo, error) {
67 var repo Repo
68 err := d.DB.QueryRow(
69 `select
70 did,
71 rkey,
72 name,
73 knot
74 from repos where did = ? and rkey = ?`,
75 did,
76 rkey,
77 ).Scan(
78 &repo.Did,
79 &repo.Rkey,
80 &repo.Name,
81 &repo.Knot,
82 )
83 if err != nil {
84 return nil, err
85 }
86 return &repo, nil
87}
88
89func (d *DB) GetRepoWithName(did syntax.DID, name string) (*Repo, error) {
90 var repo Repo
91 err := d.DB.QueryRow(
92 `select
93 did,
94 rkey,
95 name,
96 knot
97 from repos where did = ? and name = ?`,
98 did,
99 name,
100 ).Scan(
101 &repo.Did,
102 &repo.Rkey,
103 &repo.Name,
104 &repo.Knot,
105 )
106 if err != nil {
107 return nil, err
108 }
109 return &repo, nil
110}
111
112func (d *DB) PutRepoCollaborator(collaborator *RepoCollaborator) error {
113 _, err := d.Exec(
114 `insert into repo_collaborators (did, rkey, repo, subject)
115 values (?, ?, ?, ?)
116 on conflict(did, rkey) do update set
117 repo = excluded.repo
118 subject = excluded.subject`,
119 collaborator.Did,
120 collaborator.Rkey,
121 collaborator.Repo,
122 collaborator.Subject,
123 )
124 return err
125}
126
127func (d *DB) RemoveRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) error {
128 _, err := d.Exec(
129 `delete from repo_collaborators where did = ? and rkey = ?`,
130 did,
131 rkey,
132 )
133 return err
134}
135
136func (d *DB) GetRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) (*RepoCollaborator, error) {
137 var collaborator RepoCollaborator
138 err := d.DB.QueryRow(
139 `select
140 did,
141 rkey,
142 repo,
143 subject
144 from repo_collaborators
145 where did = ? and rkey = ?`,
146 did,
147 rkey,
148 ).Scan(
149 &collaborator.Did,
150 &collaborator.Rkey,
151 &collaborator.Repo,
152 &collaborator.Subject,
153 )
154 if err != nil {
155 return nil, err
156 }
157 return &collaborator, nil
158}