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) GetAllRepos() ([]Repo, error) {
17 var repos []Repo
18
19 rows, err := d.db.Query(`select did, name, knot, created from repos`)
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) GetAllReposByDid(did string) ([]Repo, error) {
41 var repos []Repo
42
43 rows, err := d.db.Query(`select did, name, knot, created from repos where did = ?`, did)
44 if err != nil {
45 return nil, err
46 }
47 defer rows.Close()
48
49 for rows.Next() {
50 repo, err := scanRepo(rows)
51 if err != nil {
52 return nil, err
53 }
54 repos = append(repos, *repo)
55 }
56
57 if err := rows.Err(); err != nil {
58 return nil, err
59 }
60
61 return repos, nil
62}
63
64func (d *DB) GetRepo(did, name string) (*Repo, error) {
65 var repo Repo
66
67 row := d.db.QueryRow(`select did, name, knot, created from repos where did = ? and name = ?`, did, name)
68
69 var createdAt string
70 if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
71 return nil, err
72 }
73 createdAtTime, _ := time.Parse(time.RFC3339, createdAt)
74 repo.Created = &createdAtTime
75
76 return &repo, nil
77}
78
79func (d *DB) AddRepo(repo *Repo) error {
80 _, err := d.db.Exec(`insert into repos (did, name, knot, rkey) values (?, ?, ?, ?)`, repo.Did, repo.Name, repo.Knot, repo.Rkey)
81 return err
82}
83
84func (d *DB) RemoveRepo(did, name, rkey string) error {
85 _, err := d.db.Exec(`delete from repos where did = ? and name = ? and rkey = ?`, did, name, rkey)
86 return err
87}
88
89func (d *DB) AddCollaborator(collaborator, repoOwnerDid, repoName, repoKnot string) error {
90 _, err := d.db.Exec(
91 `insert into collaborators (did, repo)
92 values (?, (select id from repos where did = ? and name = ? and knot = ?));`,
93 collaborator, repoOwnerDid, repoName, repoKnot)
94 return err
95}
96
97func (d *DB) CollaboratingIn(collaborator string) ([]Repo, error) {
98 var repos []Repo
99
100 rows, err := d.db.Query(`select r.* from repos r join collaborators c on r.id = c.repo where c.did = ?;`, collaborator)
101 if err != nil {
102 return nil, err
103 }
104 defer rows.Close()
105
106 for rows.Next() {
107 repo, err := scanRepo(rows)
108 if err != nil {
109 return nil, err
110 }
111 repos = append(repos, *repo)
112 }
113
114 if err := rows.Err(); err != nil {
115 return nil, err
116 }
117
118 return repos, nil
119}
120
121func scanRepo(rows *sql.Rows) (*Repo, error) {
122 var repo Repo
123 var createdAt string
124 if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
125 return nil, err
126 }
127
128 createdAtTime, err := time.Parse(time.RFC3339, createdAt)
129 if err != nil {
130 now := time.Now()
131 repo.Created = &now
132 }
133
134 repo.Created = &createdAtTime
135
136 return &repo, nil
137}