this repo has no description
1package db
2
3import (
4 "database/sql"
5 "time"
6)
7
8type Repo struct {
9 Did string
10 Name string
11 Knot string
12 Created *time.Time
13 Rkey string
14}
15
16func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {
17 var repos []Repo
18
19 rows, err := d.db.Query(`select did, name, knot, created from repos where did = ?`, did)
20 if err != nil {
21 return nil, err
22 }
23 defer rows.Close()
24
25 for rows.Next() {
26 repo, err := scanRepo(rows)
27 if err != nil {
28 return nil, err
29 }
30 repos = append(repos, *repo)
31 }
32
33 if err := rows.Err(); err != nil {
34 return nil, err
35 }
36
37 return repos, nil
38}
39
40func (d *DB) GetRepo(did, name string) (*Repo, error) {
41 var repo Repo
42
43 row := d.db.QueryRow(`select did, name, knot, created from repos where did = ? and name = ?`, did, name)
44
45 var createdAt string
46 if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
47 return nil, err
48 }
49 createdAtTime, _ := time.Parse(time.RFC3339, createdAt)
50 repo.Created = &createdAtTime
51
52 return &repo, nil
53}
54
55func (d *DB) AddRepo(repo *Repo) error {
56 _, err := d.db.Exec(`insert into repos (did, name, knot, rkey) values (?, ?, ?, ?)`, repo.Did, repo.Name, repo.Knot, repo.Rkey)
57 return err
58}
59
60func (d *DB) RemoveRepo(did, name, rkey string) error {
61 _, err := d.db.Exec(`delete from repos where did = ? and name = ? and rkey = ?`, did, name, rkey)
62 return err
63}
64
65func (d *DB) AddCollaborator(collaborator, repoOwnerDid, repoName, repoKnot string) error {
66 _, err := d.db.Exec(
67 `insert into collaborators (did, repo)
68 values (?, (select id from repos where did = ? and name = ? and knot = ?));`,
69 collaborator, repoOwnerDid, repoName, repoKnot)
70 return err
71}
72
73func (d *DB) CollaboratingIn(collaborator string) ([]Repo, error) {
74 var repos []Repo
75
76 rows, err := d.db.Query(`select r.* from repos r join collaborators c on r.id = c.repo where c.did = ?;`, collaborator)
77 if err != nil {
78 return nil, err
79 }
80 defer rows.Close()
81
82 for rows.Next() {
83 repo, err := scanRepo(rows)
84 if err != nil {
85 return nil, err
86 }
87 repos = append(repos, *repo)
88 }
89
90 if err := rows.Err(); err != nil {
91 return nil, err
92 }
93
94 return repos, nil
95}
96
97func scanRepo(rows *sql.Rows) (*Repo, error) {
98 var repo Repo
99 var createdAt string
100 if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
101 return nil, err
102 }
103
104 createdAtTime, err := time.Parse(time.RFC3339, createdAt)
105 if err != nil {
106 now := time.Now()
107 repo.Created = &now
108 }
109
110 repo.Created = &createdAtTime
111
112 return &repo, nil
113}