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