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}