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 records

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

authored by

Anirudh Oppiliappan and committed by
Tangled
f1bdf70b 8aabf0c4

+100 -6
+99 -6
appview/ingester.go
··· 5 5 "encoding/json" 6 6 "fmt" 7 7 "log/slog" 8 + "strings" 8 9 "time" 9 10 10 11 "github.com/bluesky-social/indigo/atproto/syntax" ··· 15 14 "tangled.sh/tangled.sh/core/api/tangled" 16 15 "tangled.sh/tangled.sh/core/appview/config" 17 16 "tangled.sh/tangled.sh/core/appview/db" 17 + "tangled.sh/tangled.sh/core/appview/pages/markup" 18 18 "tangled.sh/tangled.sh/core/appview/serververify" 19 19 "tangled.sh/tangled.sh/core/idresolver" 20 20 "tangled.sh/tangled.sh/core/rbac" ··· 63 61 case tangled.ActorProfileNSID: 64 62 err = i.ingestProfile(e) 65 63 case tangled.SpindleMemberNSID: 66 - err = i.ingestSpindleMember(e) 64 + err = i.ingestSpindleMember(ctx, e) 67 65 case tangled.SpindleNSID: 68 - err = i.ingestSpindle(e) 66 + err = i.ingestSpindle(ctx, e) 69 67 case tangled.KnotMemberNSID: 70 68 err = i.ingestKnotMember(e) 71 69 case tangled.KnotNSID: 72 70 err = i.ingestKnot(e) 73 71 case tangled.StringNSID: 74 72 err = i.ingestString(e) 73 + case tangled.RepoIssueNSID: 74 + err = i.ingestIssue(ctx, e) 75 75 } 76 76 l = i.Logger.With("nsid", e.Commit.Collection) 77 77 } ··· 344 340 return nil 345 341 } 346 342 347 - func (i *Ingester) ingestSpindleMember(e *models.Event) error { 343 + func (i *Ingester) ingestSpindleMember(ctx context.Context, e *models.Event) error { 348 344 did := e.Did 349 345 var err error 350 346 ··· 367 363 return fmt.Errorf("failed to enforce permissions: %w", err) 368 364 } 369 365 370 - memberId, err := i.IdResolver.ResolveIdent(context.Background(), record.Subject) 366 + memberId, err := i.IdResolver.ResolveIdent(ctx, record.Subject) 371 367 if err != nil { 372 368 return err 373 369 } ··· 450 446 return nil 451 447 } 452 448 453 - func (i *Ingester) ingestSpindle(e *models.Event) error { 449 + func (i *Ingester) ingestSpindle(ctx context.Context, e *models.Event) error { 454 450 did := e.Did 455 451 var err error 456 452 ··· 483 479 return err 484 480 } 485 481 486 - err = serververify.RunVerification(context.Background(), instance, did, i.Config.Core.Dev) 482 + err = serververify.RunVerification(ctx, instance, did, i.Config.Core.Dev) 487 483 if err != nil { 488 484 l.Error("failed to add spindle to db", "err", err, "instance", instance) 489 485 return err ··· 772 768 } 773 769 774 770 return nil 771 + } 772 + func (i *Ingester) ingestIssue(ctx context.Context, e *models.Event) error { 773 + did := e.Did 774 + rkey := e.Commit.RKey 775 + 776 + var err error 777 + 778 + l := i.Logger.With("handler", "ingestIssue", "nsid", e.Commit.Collection, "did", did, "rkey", rkey) 779 + l.Info("ingesting record") 780 + 781 + ddb, ok := i.Db.Execer.(*db.DB) 782 + if !ok { 783 + return fmt.Errorf("failed to index issue record, invalid db cast") 784 + } 785 + 786 + switch e.Commit.Operation { 787 + case models.CommitOperationCreate: 788 + raw := json.RawMessage(e.Commit.Record) 789 + record := tangled.RepoIssue{} 790 + err = json.Unmarshal(raw, &record) 791 + if err != nil { 792 + l.Error("invalid record", "err", err) 793 + return err 794 + } 795 + 796 + issue := db.IssueFromRecord(did, rkey, record) 797 + 798 + sanitizer := markup.NewSanitizer() 799 + if st := strings.TrimSpace(sanitizer.SanitizeDescription(issue.Title)); st == "" { 800 + return fmt.Errorf("title is empty after HTML sanitization") 801 + } 802 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(issue.Body)); sb == "" { 803 + return fmt.Errorf("body is empty after HTML sanitization") 804 + } 805 + 806 + tx, err := ddb.BeginTx(ctx, nil) 807 + if err != nil { 808 + l.Error("failed to begin transaction", "err", err) 809 + return err 810 + } 811 + 812 + err = db.NewIssue(tx, &issue) 813 + if err != nil { 814 + l.Error("failed to create issue", "err", err) 815 + return err 816 + } 817 + 818 + return nil 819 + 820 + case models.CommitOperationUpdate: 821 + raw := json.RawMessage(e.Commit.Record) 822 + record := tangled.RepoIssue{} 823 + err = json.Unmarshal(raw, &record) 824 + if err != nil { 825 + l.Error("invalid record", "err", err) 826 + return err 827 + } 828 + 829 + body := "" 830 + if record.Body != nil { 831 + body = *record.Body 832 + } 833 + 834 + sanitizer := markup.NewSanitizer() 835 + if st := strings.TrimSpace(sanitizer.SanitizeDescription(record.Title)); st == "" { 836 + return fmt.Errorf("title is empty after HTML sanitization") 837 + } 838 + if sb := strings.TrimSpace(sanitizer.SanitizeDefault(body)); sb == "" { 839 + return fmt.Errorf("body is empty after HTML sanitization") 840 + } 841 + 842 + err = db.UpdateIssueByRkey(ddb, did, rkey, record.Title, body) 843 + if err != nil { 844 + l.Error("failed to update issue", "err", err) 845 + return err 846 + } 847 + 848 + return nil 849 + 850 + case models.CommitOperationDelete: 851 + if err := db.DeleteIssueByRkey(ddb, did, rkey); err != nil { 852 + l.Error("failed to delete", "err", err) 853 + return fmt.Errorf("failed to delete issue record: %w", err) 854 + } 855 + 856 + return nil 857 + } 858 + 859 + return fmt.Errorf("unknown operation: %s", e.Commit.Operation) 775 860 }
+1
appview/state/state.go
··· 99 99 tangled.SpindleMemberNSID, 100 100 tangled.SpindleNSID, 101 101 tangled.StringNSID, 102 + tangled.RepoIssueNSID, 102 103 }, 103 104 nil, 104 105 slog.Default(),