appview: ingest issue comment records #525

merged
opened by anirudh.fi targeting master from push-wnotmtoqlnvl
Changed files
+81 -6
appview
+19 -6
appview/db/issues.go
···
import (
"database/sql"
"fmt"
+
mathrand "math/rand/v2"
"time"
"github.com/bluesky-social/indigo/atproto/syntax"
···
}
comment := Comment{
-
OwnerDid: ownerDid,
-
RepoAt: repoAt,
-
Rkey: rkey,
-
Body: record.Body,
-
Issue: issueId,
-
Created: &created,
+
OwnerDid: ownerDid,
+
RepoAt: repoAt,
+
Rkey: rkey,
+
Body: record.Body,
+
Issue: issueId,
+
CommentId: mathrand.IntN(1000000),
+
Created: &created,
}
return comment, nil
···
return err
}
+
func DeleteCommentByRkey(e Execer, ownerDid, rkey string) error {
+
_, err := e.Exec(
+
`
+
update comments
+
set body = "",
+
deleted = strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
+
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
+61
appview/ingester.go
···
err = i.ingestString(e)
case tangled.RepoIssueNSID:
err = i.ingestIssue(ctx, e)
+
case tangled.RepoIssueCommentNSID:
+
err = i.ingestIssueComment(e)
}
l = i.Logger.With("nsid", e.Commit.Collection)
}
···
return fmt.Errorf("unknown operation: %s", e.Commit.Operation)
}
+
+
func (i *Ingester) ingestIssueComment(e *models.Event) error {
+
did := e.Did
+
rkey := e.Commit.RKey
+
+
var err error
+
+
l := i.Logger.With("handler", "ingestIssueComment", "nsid", e.Commit.Collection, "did", did, "rkey", rkey)
+
l.Info("ingesting record")
+
+
ddb, ok := i.Db.Execer.(*db.DB)
+
if !ok {
+
return fmt.Errorf("failed to index issue comment record, invalid db cast")
+
}
+
+
switch e.Commit.Operation {
+
case models.CommitOperationCreate:
+
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
+
}
+
+
comment, err := db.IssueCommentFromRecord(ddb, did, rkey, record)
+
if err != nil {
+
l.Error("failed to parse comment from record", "err", err)
+
return err
+
}
+
+
sanitizer := markup.NewSanitizer()
+
if sb := strings.TrimSpace(sanitizer.SanitizeDefault(comment.Body)); sb == "" {
+
return fmt.Errorf("body is empty after HTML sanitization")
+
}
+
+
err = db.NewIssueComment(ddb, &comment)
+
if err != nil {
+
l.Error("failed to create issue comment", "err", err)
+
return err
+
}
+
+
return nil
+
+
case models.CommitOperationUpdate:
+
// TODO: implement comment updates
+
return nil
+
+
case models.CommitOperationDelete:
+
if err := db.DeleteCommentByRkey(ddb, did, rkey); err != nil {
+
l.Error("failed to delete", "err", err)
+
return fmt.Errorf("failed to delete issue comment record: %w", err)
+
}
+
+
return nil
+
}
+
+
return fmt.Errorf("unknown operation: %s", e.Commit.Operation)
+
}
+1
appview/state/state.go
···
tangled.SpindleNSID,
tangled.StringNSID,
tangled.RepoIssueNSID,
+
tangled.RepoIssueCommentNSID,
},
nil,
slog.Default(),