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}