this repo has no description
1package db
2
3import "time"
4
5type Issue struct {
6 RepoAt string
7 OwnerDid string
8 IssueId int
9 Created *time.Time
10 Title string
11 Body string
12 Open bool
13}
14
15type Comment struct {
16 OwnerDid string
17 RepoAt string
18 Issue int
19 CommentId int
20 Body string
21 Created *time.Time
22}
23
24func (d *DB) NewIssue(issue *Issue) (int, error) {
25 tx, err := d.db.Begin()
26 if err != nil {
27 return 0, err
28 }
29 defer tx.Rollback()
30
31 _, err = tx.Exec(`
32 insert or ignore into repo_issue_seqs (repo_at, next_issue_id)
33 values (?, 1)
34 `, issue.RepoAt)
35 if err != nil {
36 return 0, err
37 }
38
39 var nextId int
40 err = tx.QueryRow(`
41 update repo_issue_seqs
42 set next_issue_id = next_issue_id + 1
43 where repo_at = ?
44 returning next_issue_id - 1
45 `, issue.RepoAt).Scan(&nextId)
46 if err != nil {
47 return 0, err
48 }
49
50 issue.IssueId = nextId
51
52 _, err = tx.Exec(`
53 insert into issues (repo_at, owner_did, issue_id, title, body)
54 values (?, ?, ?, ?, ?)
55 `, issue.RepoAt, issue.OwnerDid, issue.IssueId, issue.Title, issue.Body)
56 if err != nil {
57 return 0, err
58 }
59
60 if err := tx.Commit(); err != nil {
61 return 0, err
62 }
63
64 return nextId, nil
65}
66
67func (d *DB) GetIssues(repoAt string) ([]Issue, error) {
68 var issues []Issue
69
70 rows, err := d.db.Query(`select owner_did, issue_id, created, title, body, open from issues where repo_at = ?`, repoAt)
71 if err != nil {
72 return nil, err
73 }
74 defer rows.Close()
75
76 for rows.Next() {
77 var issue Issue
78 var createdAt string
79 err := rows.Scan(&issue.OwnerDid, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open)
80 if err != nil {
81 return nil, err
82 }
83
84 createdTime, err := time.Parse(time.RFC3339, createdAt)
85 if err != nil {
86 return nil, err
87 }
88 issue.Created = &createdTime
89
90 issues = append(issues, issue)
91 }
92
93 if err := rows.Err(); err != nil {
94 return nil, err
95 }
96
97 return issues, nil
98}
99
100func (d *DB) GetIssueWithComments(repoAt string, issueId int) (*Issue, []Comment, error) {
101 query := `select owner_did, issue_id, created, title, body, open from issues where repo_at = ? and issue_id = ?`
102 row := d.db.QueryRow(query, repoAt, issueId)
103
104 var issue Issue
105 var createdAt string
106 err := row.Scan(&issue.OwnerDid, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open)
107 if err != nil {
108 return nil, nil, err
109 }
110
111 createdTime, err := time.Parse(time.RFC3339, createdAt)
112 if err != nil {
113 return nil, nil, err
114 }
115 issue.Created = &createdTime
116
117 comments, err := d.GetComments(repoAt, issueId)
118 if err != nil {
119 return nil, nil, err
120 }
121
122 return &issue, comments, nil
123}
124
125func (d *DB) NewComment(comment *Comment) error {
126 query := `insert into comments (owner_did, repo_at, issue_id, comment_id, body) values (?, ?, ?, ?, ?)`
127 _, err := d.db.Exec(
128 query,
129 comment.OwnerDid,
130 comment.RepoAt,
131 comment.Issue,
132 comment.CommentId,
133 comment.Body,
134 )
135 return err
136}
137
138func (d *DB) GetComments(repoAt string, issueId int) ([]Comment, error) {
139 var comments []Comment
140
141 rows, err := d.db.Query(`select owner_did, issue_id, comment_id, body, created from comments where repo_at = ? and issue_id = ? order by created asc`, repoAt, issueId)
142 if err != nil {
143 return nil, err
144 }
145 defer rows.Close()
146
147 for rows.Next() {
148 var comment Comment
149 var createdAt string
150 err := rows.Scan(&comment.OwnerDid, &comment.Issue, &comment.CommentId, &comment.Body, &createdAt)
151 if err != nil {
152 return nil, err
153 }
154
155 createdAtTime, err := time.Parse(time.RFC3339, createdAt)
156 if err != nil {
157 return nil, err
158 }
159 comment.Created = &createdAtTime
160
161 comments = append(comments, comment)
162 }
163
164 if err := rows.Err(); err != nil {
165 return nil, err
166 }
167
168 return comments, nil
169}
170
171func (d *DB) CloseIssue(repoAt string, issueId int) error {
172 _, err := d.db.Exec(`update issues set open = 0 where repo_at = ? and issue_id = ?`, repoAt, issueId)
173 return err
174}
175
176func (d *DB) ReopenIssue(repoAt string, issueId int) error {
177 _, err := d.db.Exec(`update issues set open = 1 where repo_at = ? and issue_id = ?`, repoAt, issueId)
178 return err
179}