forked from tangled.org/core
Monorepo for Tangled
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}