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