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