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