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
··· 626 626 return err 627 627 } 628 628 629 + func UpdateCommentByRkey(e Execer, ownerDid, rkey, newBody string) error { 630 + _, err := e.Exec( 631 + ` 632 + update comments 633 + set body = ?, 634 + edited = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') 635 + where owner_did = ? and rkey = ? 636 + `, newBody, ownerDid, rkey) 637 + return err 638 + } 639 + 629 640 func DeleteCommentByRkey(e Execer, ownerDid, rkey string) error { 630 641 _, err := e.Exec( 631 642 ` ··· 637 648 return err 638 649 } 639 650 651 + func UpdateIssueByRkey(e Execer, ownerDid, rkey, title, body string) error { 652 + _, err := e.Exec(`update issues set title = ?, body = ? where owner_did = ? and rkey = ?`, title, body, ownerDid, rkey) 653 + return err 654 + } 655 + 656 + func DeleteIssueByRkey(e Execer, ownerDid, rkey string) error { 657 + _, err := e.Exec(`delete from issues where owner_did = ? and rkey = ?`, ownerDid, rkey) 658 + return err 659 + } 660 + 640 661 func CloseIssue(e Execer, repoAt syntax.ATURI, issueId int) error { 641 662 _, err := e.Exec(`update issues set open = 0 where repo_at = ? and issue_id = ?`, repoAt, issueId) 642 663 return err
+51 -3
appview/ingester.go
··· 824 824 return nil 825 825 826 826 case models.CommitOperationUpdate: 827 - // TODO: implement updates 827 + raw := json.RawMessage(e.Commit.Record) 828 + record := tangled.RepoIssue{} 829 + err = json.Unmarshal(raw, &record) 830 + if err != nil { 831 + l.Error("invalid record", "err", err) 832 + return err 833 + } 834 + 835 + body := "" 836 + if record.Body != nil { 837 + body = *record.Body 838 + } 839 + 840 + sanitizer := markup.NewSanitizer() 841 + if st := strings.TrimSpace(sanitizer.SanitizeDescription(record.Title)); st == "" { 842 + return fmt.Errorf("title is empty after HTML sanitization") 843 + } 844 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(body)); sb == "" { 845 + return fmt.Errorf("body is empty after HTML sanitization") 846 + } 847 + 848 + err = db.UpdateIssueByRkey(ddb, did, rkey, record.Title, body) 849 + if err != nil { 850 + l.Error("failed to update issue", "err", err) 851 + return err 852 + } 853 + 828 854 return nil 829 855 830 856 case models.CommitOperationDelete: 831 - // TODO: implement issue deletion 857 + if err := db.DeleteIssueByRkey(ddb, did, rkey); err != nil { 858 + l.Error("failed to delete", "err", err) 859 + return fmt.Errorf("failed to delete issue record: %w", err) 860 + } 861 + 832 862 return nil 833 863 } 834 864 ··· 879 909 return nil 880 910 881 911 case models.CommitOperationUpdate: 882 - // TODO: implement comment updates 912 + raw := json.RawMessage(e.Commit.Record) 913 + record := tangled.RepoIssueComment{} 914 + err = json.Unmarshal(raw, &record) 915 + if err != nil { 916 + l.Error("invalid record", "err", err) 917 + return err 918 + } 919 + 920 + sanitizer := markup.NewSanitizer() 921 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(record.Body)); sb == "" { 922 + return fmt.Errorf("body is empty after HTML sanitization") 923 + } 924 + 925 + err = db.UpdateCommentByRkey(ddb, did, rkey, record.Body) 926 + if err != nil { 927 + l.Error("failed to update issue comment", "err", err) 928 + return err 929 + } 930 + 883 931 return nil 884 932 885 933 case models.CommitOperationDelete: