appview: ingest issue/comment update and delete #526

merged
opened by anirudh.fi targeting master from push-wnotmtoqlnvl

Also adds the relevant DB helpers for this.

Signed-off-by: Anirudh Oppiliappan anirudh@tangled.sh

Changed files
+72 -3
appview
+21
appview/db/issues.go
···
return err
}
+
func UpdateCommentByRkey(e Execer, ownerDid, rkey, newBody string) error {
+
_, err := e.Exec(
+
`
+
update comments
+
set body = ?,
+
edited = strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
+
where owner_did = ? and rkey = ?
+
`, newBody, ownerDid, rkey)
+
return err
+
}
+
func DeleteCommentByRkey(e Execer, ownerDid, rkey string) error {
_, err := e.Exec(
`
···
return err
}
+
func UpdateIssueByRkey(e Execer, ownerDid, rkey, title, body string) error {
+
_, err := e.Exec(`update issues set title = ?, body = ? where owner_did = ? and rkey = ?`, title, body, ownerDid, rkey)
+
return err
+
}
+
+
func DeleteIssueByRkey(e Execer, ownerDid, rkey string) error {
+
_, err := e.Exec(`delete from issues where owner_did = ? and rkey = ?`, ownerDid, rkey)
+
return err
+
}
+
func CloseIssue(e Execer, repoAt syntax.ATURI, issueId int) error {
_, err := e.Exec(`update issues set open = 0 where repo_at = ? and issue_id = ?`, repoAt, issueId)
return err
+51 -3
appview/ingester.go
···
return nil
case models.CommitOperationUpdate:
-
// TODO: implement updates
+
raw := json.RawMessage(e.Commit.Record)
+
record := tangled.RepoIssue{}
+
err = json.Unmarshal(raw, &record)
+
if err != nil {
+
l.Error("invalid record", "err", err)
+
return err
+
}
+
+
body := ""
+
if record.Body != nil {
+
body = *record.Body
+
}
+
+
sanitizer := markup.NewSanitizer()
+
if st := strings.TrimSpace(sanitizer.SanitizeDescription(record.Title)); st == "" {
+
return fmt.Errorf("title is empty after HTML sanitization")
+
}
+
if sb := strings.TrimSpace(sanitizer.SanitizeDefault(body)); sb == "" {
+
return fmt.Errorf("body is empty after HTML sanitization")
+
}
+
+
err = db.UpdateIssueByRkey(ddb, did, rkey, record.Title, body)
+
if err != nil {
+
l.Error("failed to update issue", "err", err)
+
return err
+
}
+
return nil
case models.CommitOperationDelete:
-
// TODO: implement issue deletion
+
if err := db.DeleteIssueByRkey(ddb, did, rkey); err != nil {
+
l.Error("failed to delete", "err", err)
+
return fmt.Errorf("failed to delete issue record: %w", err)
+
}
+
return nil
}
···
return nil
case models.CommitOperationUpdate:
-
// TODO: implement comment updates
+
raw := json.RawMessage(e.Commit.Record)
+
record := tangled.RepoIssueComment{}
+
err = json.Unmarshal(raw, &record)
+
if err != nil {
+
l.Error("invalid record", "err", err)
+
return err
+
}
+
+
sanitizer := markup.NewSanitizer()
+
if sb := strings.TrimSpace(sanitizer.SanitizeDefault(record.Body)); sb == "" {
+
return fmt.Errorf("body is empty after HTML sanitization")
+
}
+
+
err = db.UpdateCommentByRkey(ddb, did, rkey, record.Body)
+
if err != nil {
+
l.Error("failed to update issue comment", "err", err)
+
return err
+
}
+
return nil
case models.CommitOperationDelete: