113 lines
2.5 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
Created *time.Time
13
Rkey string
14
}
15
16
func (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
40
func (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
55
func (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
60
func (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
65
func (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
73
func (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
97
func 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
}
114