Monorepo for Tangled
tangled.org
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(repoAt syntax.ATURI) (*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 at_uri = ?`,
75 repoAt,
76 ).Scan(
77 &repo.Did,
78 &repo.Rkey,
79 &repo.Name,
80 &repo.Knot,
81 )
82 if err != nil {
83 return nil, err
84 }
85 return &repo, nil
86}
87
88func (d *DB) GetRepoWithName(did syntax.DID, name string) (*Repo, error) {
89 var repo Repo
90 err := d.DB.QueryRow(
91 `select
92 did,
93 rkey,
94 name,
95 knot
96 from repos where did = ? and name = ?`,
97 did,
98 name,
99 ).Scan(
100 &repo.Did,
101 &repo.Rkey,
102 &repo.Name,
103 &repo.Knot,
104 )
105 if err != nil {
106 return nil, err
107 }
108 return &repo, nil
109}
110
111func (d *DB) PutRepoCollaborator(collaborator *RepoCollaborator) error {
112 _, err := d.Exec(
113 `insert into repo_collaborators (did, rkey, repo, subject)
114 values (?, ?, ?, ?)
115 on conflict(did, rkey) do update set
116 repo = excluded.repo,
117 subject = excluded.subject`,
118 collaborator.Did,
119 collaborator.Rkey,
120 collaborator.Repo,
121 collaborator.Subject,
122 )
123 return err
124}
125
126func (d *DB) RemoveRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) error {
127 _, err := d.Exec(
128 `delete from repo_collaborators where did = ? and rkey = ?`,
129 did,
130 rkey,
131 )
132 return err
133}
134
135func (d *DB) GetRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) (*RepoCollaborator, error) {
136 var collaborator RepoCollaborator
137 err := d.DB.QueryRow(
138 `select
139 did,
140 rkey,
141 repo,
142 subject
143 from repo_collaborators
144 where did = ? and rkey = ?`,
145 did,
146 rkey,
147 ).Scan(
148 &collaborator.Did,
149 &collaborator.Rkey,
150 &collaborator.Repo,
151 &collaborator.Subject,
152 )
153 if err != nil {
154 return nil, err
155 }
156 return &collaborator, nil
157}