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 AtUri string
15}
16
17func GetAllRepos(e Execer) ([]Repo, error) {
18 var repos []Repo
19
20 rows, err := e.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
42func GetAllReposByDid(e Execer, did string) ([]Repo, error) {
43 var repos []Repo
44
45 rows, err := e.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
67func GetRepo(e Execer, did, name string) (*Repo, error) {
68 var repo Repo
69
70 row := e.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
82func AddRepo(e Execer, repo *Repo) error {
83 _, err := e.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
87func RemoveRepo(e Execer, did, name, rkey string) error {
88 _, err := e.Exec(`delete from repos where did = ? and name = ? and rkey = ?`, did, name, rkey)
89 return err
90}
91
92func AddCollaborator(e Execer, collaborator, repoOwnerDid, repoName, repoKnot string) error {
93 _, err := e.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
100func CollaboratingIn(e Execer, collaborator string) ([]Repo, error) {
101 var repos []Repo
102
103 rows, err := e.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
125func 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}