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 Created *time.Time
13}
14
15func (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
39func (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
54func (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
59func (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
64func (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
72func (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
96func 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}