Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview: ingest issue comment records

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

authored by

Anirudh Oppiliappan and committed by
Tangled
a3950990 f1bdf70b

+120 -6
+40 -6
appview/db/issues.go
··· 3 3 import ( 4 4 "database/sql" 5 5 "fmt" 6 + mathrand "math/rand/v2" 6 7 "strings" 7 8 "time" 8 9 ··· 110 109 } 111 110 112 111 comment := Comment{ 113 - OwnerDid: ownerDid, 114 - RepoAt: repoAt, 115 - Rkey: rkey, 116 - Body: record.Body, 117 - Issue: issueId, 118 - Created: &created, 112 + OwnerDid: ownerDid, 113 + RepoAt: repoAt, 114 + Rkey: rkey, 115 + Body: record.Body, 116 + Issue: issueId, 117 + CommentId: mathrand.IntN(1000000), 118 + Created: &created, 119 119 } 120 120 121 121 return comment, nil ··· 623 621 deleted = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') 624 622 where repo_at = ? and issue_id = ? and comment_id = ? 625 623 `, repoAt, issueId, commentId) 624 + return err 625 + } 626 + 627 + func UpdateCommentByRkey(e Execer, ownerDid, rkey, newBody string) error { 628 + _, err := e.Exec( 629 + ` 630 + update comments 631 + set body = ?, 632 + edited = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') 633 + where owner_did = ? and rkey = ? 634 + `, newBody, ownerDid, rkey) 635 + return err 636 + } 637 + 638 + func DeleteCommentByRkey(e Execer, ownerDid, rkey string) error { 639 + _, err := e.Exec( 640 + ` 641 + update comments 642 + set body = "", 643 + deleted = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') 644 + where owner_did = ? and rkey = ? 645 + `, ownerDid, rkey) 646 + return err 647 + } 648 + 649 + func UpdateIssueByRkey(e Execer, ownerDid, rkey, title, body string) error { 650 + _, err := e.Exec(`update issues set title = ?, body = ? where owner_did = ? and rkey = ?`, title, body, ownerDid, rkey) 651 + return err 652 + } 653 + 654 + func DeleteIssueByRkey(e Execer, ownerDid, rkey string) error { 655 + _, err := e.Exec(`delete from issues where owner_did = ? and rkey = ?`, ownerDid, rkey) 626 656 return err 627 657 } 628 658
+79
appview/ingester.go
··· 74 74 err = i.ingestString(e) 75 75 case tangled.RepoIssueNSID: 76 76 err = i.ingestIssue(ctx, e) 77 + case tangled.RepoIssueCommentNSID: 78 + err = i.ingestIssueComment(e) 77 79 } 78 80 l = i.Logger.With("nsid", e.Commit.Collection) 79 81 } ··· 857 855 if err := db.DeleteIssueByRkey(ddb, did, rkey); err != nil { 858 856 l.Error("failed to delete", "err", err) 859 857 return fmt.Errorf("failed to delete issue record: %w", err) 858 + } 859 + 860 + return nil 861 + } 862 + 863 + return fmt.Errorf("unknown operation: %s", e.Commit.Operation) 864 + } 865 + 866 + func (i *Ingester) ingestIssueComment(e *models.Event) error { 867 + did := e.Did 868 + rkey := e.Commit.RKey 869 + 870 + var err error 871 + 872 + l := i.Logger.With("handler", "ingestIssueComment", "nsid", e.Commit.Collection, "did", did, "rkey", rkey) 873 + l.Info("ingesting record") 874 + 875 + ddb, ok := i.Db.Execer.(*db.DB) 876 + if !ok { 877 + return fmt.Errorf("failed to index issue comment record, invalid db cast") 878 + } 879 + 880 + switch e.Commit.Operation { 881 + case models.CommitOperationCreate: 882 + raw := json.RawMessage(e.Commit.Record) 883 + record := tangled.RepoIssueComment{} 884 + err = json.Unmarshal(raw, &record) 885 + if err != nil { 886 + l.Error("invalid record", "err", err) 887 + return err 888 + } 889 + 890 + comment, err := db.IssueCommentFromRecord(ddb, did, rkey, record) 891 + if err != nil { 892 + l.Error("failed to parse comment from record", "err", err) 893 + return err 894 + } 895 + 896 + sanitizer := markup.NewSanitizer() 897 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(comment.Body)); sb == "" { 898 + return fmt.Errorf("body is empty after HTML sanitization") 899 + } 900 + 901 + err = db.NewIssueComment(ddb, &comment) 902 + if err != nil { 903 + l.Error("failed to create issue comment", "err", err) 904 + return err 905 + } 906 + 907 + return nil 908 + 909 + case models.CommitOperationUpdate: 910 + raw := json.RawMessage(e.Commit.Record) 911 + record := tangled.RepoIssueComment{} 912 + err = json.Unmarshal(raw, &record) 913 + if err != nil { 914 + l.Error("invalid record", "err", err) 915 + return err 916 + } 917 + 918 + sanitizer := markup.NewSanitizer() 919 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(record.Body)); sb == "" { 920 + return fmt.Errorf("body is empty after HTML sanitization") 921 + } 922 + 923 + err = db.UpdateCommentByRkey(ddb, did, rkey, record.Body) 924 + if err != nil { 925 + l.Error("failed to update issue comment", "err", err) 926 + return err 927 + } 928 + 929 + return nil 930 + 931 + case models.CommitOperationDelete: 932 + if err := db.DeleteCommentByRkey(ddb, did, rkey); err != nil { 933 + l.Error("failed to delete", "err", err) 934 + return fmt.Errorf("failed to delete issue comment record: %w", err) 860 935 } 861 936 862 937 return nil
+1
appview/state/state.go
··· 100 100 tangled.SpindleNSID, 101 101 tangled.StringNSID, 102 102 tangled.RepoIssueNSID, 103 + tangled.RepoIssueCommentNSID, 103 104 }, 104 105 nil, 105 106 slog.Default(),