package db import "github.com/bluesky-social/indigo/atproto/syntax" type Repo struct { Did syntax.DID Rkey syntax.RecordKey Name string Knot string } type RepoCollaborator struct { Did syntax.DID Rkey syntax.RecordKey Repo syntax.ATURI Subject syntax.DID } func (d *DB) PutRepo(repo *Repo) error { _, err := d.Exec( `insert or ignore into repos (did, rkey, name, knot) values (?, ?, ?, ?) on conflict(did, rkey) do update set name = excluded.name, knot = excluded.knot`, repo.Did, repo.Rkey, repo.Name, repo.Knot, ) return err } func (d *DB) DeleteRepo(did syntax.DID, rkey syntax.RecordKey) error { _, err := d.Exec( `delete from repos where did = ? and rkey = ?`, did, rkey, ) return err } func (d *DB) Knots() ([]string, error) { rows, err := d.Query(`select knot from repos`) if err != nil { return nil, err } defer rows.Close() var knots []string for rows.Next() { var knot string if err := rows.Scan(&knot); err != nil { return nil, err } knots = append(knots, knot) } if err = rows.Err(); err != nil { return nil, err } return knots, nil } func (d *DB) GetRepo(repoAt syntax.ATURI) (*Repo, error) { var repo Repo err := d.DB.QueryRow( `select did, rkey, name, knot from repos where at_uri = ?`, repoAt, ).Scan( &repo.Did, &repo.Rkey, &repo.Name, &repo.Knot, ) if err != nil { return nil, err } return &repo, nil } func (d *DB) GetRepoWithName(did syntax.DID, name string) (*Repo, error) { var repo Repo err := d.DB.QueryRow( `select did, rkey, name, knot from repos where did = ? and name = ?`, did, name, ).Scan( &repo.Did, &repo.Rkey, &repo.Name, &repo.Knot, ) if err != nil { return nil, err } return &repo, nil } func (d *DB) PutRepoCollaborator(collaborator *RepoCollaborator) error { _, err := d.Exec( `insert into repo_collaborators (did, rkey, repo, subject) values (?, ?, ?, ?) on conflict(did, rkey) do update set repo = excluded.repo, subject = excluded.subject`, collaborator.Did, collaborator.Rkey, collaborator.Repo, collaborator.Subject, ) return err } func (d *DB) RemoveRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) error { _, err := d.Exec( `delete from repo_collaborators where did = ? and rkey = ?`, did, rkey, ) return err } func (d *DB) GetRepoCollaborator(did syntax.DID, rkey syntax.RecordKey) (*RepoCollaborator, error) { var collaborator RepoCollaborator err := d.DB.QueryRow( `select did, rkey, repo, subject from repo_collaborators where did = ? and rkey = ?`, did, rkey, ).Scan( &collaborator.Did, &collaborator.Rkey, &collaborator.Repo, &collaborator.Subject, ) if err != nil { return nil, err } return &collaborator, nil }