···
func NewIssue(tx *sql.Tx, issue *Issue) error {
174
-
defer tx.Rollback()
174
+
// ensure sequence exists
insert or ignore into repo_issue_seqs (repo_at, next_issue_id)
183
+
// check if issue already exists
184
+
var existingRowId, existingIssueId sql.NullInt64
186
-
update repo_issue_seqs
187
-
set next_issue_id = next_issue_id + 1
189
-
returning next_issue_id - 1
190
-
`, issue.RepoAt).Scan(&nextId)
186
+
select rowid, issue_id from issues
187
+
where did = ? and rkey = ?
188
+
`, issue.Did, issue.Rkey).Scan(&existingRowId, &existingIssueId)
195
-
issue.IssueId = nextId
191
+
case err == sql.ErrNoRows:
192
+
return createNewIssue(tx, issue)
197
-
res, err := tx.Exec(`
198
-
insert into issues (repo_at, owner_did, rkey, issue_at, issue_id, title, body)
199
-
values (?, ?, ?, ?, ?, ?, ?)
200
-
`, issue.RepoAt, issue.OwnerDid, issue.Rkey, issue.AtUri(), issue.IssueId, issue.Title, issue.Body)
198
+
// Case 3: Issue exists - update it
199
+
return updateIssue(tx, issue, existingRowId.Int64, int(existingIssueId.Int64))
205
-
lastID, err := res.LastInsertId()
203
+
func createNewIssue(tx *sql.Tx, issue *Issue) error {
204
+
// get next issue_id
206
+
err := tx.QueryRow(`
207
+
update repo_issue_seqs
208
+
set next_issue_id = next_issue_id + 1
210
+
returning next_issue_id - 1
211
+
`, issue.RepoAt).Scan(&newIssueId)
216
+
// insert new issue
217
+
row := tx.QueryRow(`
218
+
insert into issues (repo_at, did, rkey, issue_id, title, body)
219
+
values (?, ?, ?, ?, ?, ?)
220
+
returning rowid, issue_id
221
+
`, issue.RepoAt, issue.Did, issue.Rkey, newIssueId, issue.Title, issue.Body)
211
-
if err := tx.Commit(); err != nil {
223
+
return row.Scan(&issue.Id, &issue.IssueId)
226
+
func updateIssue(tx *sql.Tx, issue *Issue, existingRowId int64, existingIssueId int) error {
227
+
// update existing issue
228
+
_, err := tx.Exec(`
230
+
set title = ?, body = ?
231
+
where did = ? and rkey = ?
232
+
`, issue.Title, issue.Body, issue.Did, issue.Rkey)
237
+
// set the values from existing record
238
+
issue.Id = existingRowId
239
+
issue.IssueId = existingIssueId