an app.bsky.* indexer

add FeedPost

Changed files
+115 -1
cmd
monarch
models
+14
cmd/monarch/handlers.go
···
&models.ActorProfile_PinnedPost{},
&models.ActorStatus{},
&models.ActorStatus_Embed{},
+
&models.FeedGenerator{},
&models.FeedGenerator_Label{},
&models.FeedLike{},
&models.FeedLike_Subject{},
&models.FeedLike_Via{},
+
&models.FeedPost{},
+
&models.FeedPost_Label{},
+
&models.FeedPost_Lang{},
+
&models.FeedPost_Reply{},
+
&models.FeedPost_Tag{},
+
&models.GraphBlock{},
&models.GraphList{},
&models.GraphListblock{},
···
&models.GraphStarterpack{},
&models.GraphStarterpack_Feed{},
&models.GraphVerification{},
+
&models.LabelerService{},
&models.LabelerService_Label{},
&models.LabelerService_Policy{},
···
case syntax.NSID("app.bsky.feed.like"):
like := models.NewFeedLike(uri, *rec)
if err := hs.store.Where(models.FeedLike{ID: string(uri)}).Assign(like).FirstOrCreate(&models.FeedLike{}).Error; err != nil {
+
return fmt.Errorf("error upserting feed like: %w", err)
+
}
+
+
case syntax.NSID("app.bsky.feed.post"):
+
post := models.NewFeedPost(uri, *rec)
+
if err := hs.store.Where(models.FeedPost{ID: string(uri)}).Assign(post).FirstOrCreate(&models.FeedPost{}).Error; err != nil {
return fmt.Errorf("error upserting feed like: %w", err)
}
+100
models/feed_post.go
···
+
package models
+
+
import (
+
"bytes"
+
"log/slog"
+
"time"
+
+
appbsky "github.com/bluesky-social/indigo/api/bsky"
+
"github.com/bluesky-social/indigo/atproto/syntax"
+
)
+
+
type FeedPost struct {
+
ID string `gorm:"primaryKey"`
+
+
// TODO: Embed, Facets
+
+
CreatedAt string
+
Labels []FeedPost_Label
+
Langs []FeedPost_Lang
+
Reply FeedPost_Reply
+
Tags []FeedPost_Tag
+
Text string
+
+
AutoCreatedAt time.Time `gorm:"autoCreateTime"`
+
AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
+
}
+
+
type FeedPost_Label struct {
+
FeedPostID string
+
Value string
+
}
+
+
type FeedPost_Lang struct {
+
FeedPostID string
+
Value string
+
}
+
+
type FeedPost_Reply struct {
+
FeedPostID string
+
Parent StrongRef `gorm:"embedded;embeddedPrefix:parent_"`
+
Root StrongRef `gorm:"embedded;embeddedPrefix:root_"`
+
}
+
+
type FeedPost_Tag struct {
+
FeedPostID string
+
Value string
+
}
+
+
func NewFeedPost(uri syntax.ATURI, rec []byte) *FeedPost {
+
var out appbsky.FeedPost
+
if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
+
slog.Error("could not unmarshal feed post CBOR", "err", err)
+
return nil
+
}
+
+
post := FeedPost{
+
ID: string(uri),
+
CreatedAt: out.CreatedAt,
+
Text: out.Text,
+
}
+
+
if out.Labels != nil && out.Labels.LabelDefs_SelfLabels != nil && out.Labels.LabelDefs_SelfLabels.Values != nil {
+
for _, label := range out.Labels.LabelDefs_SelfLabels.Values {
+
post.Labels = append(post.Labels, FeedPost_Label{
+
FeedPostID: post.ID,
+
Value: label.Val,
+
})
+
}
+
}
+
+
for _, lang := range out.Langs {
+
post.Langs = append(post.Langs, FeedPost_Lang{
+
FeedPostID: post.ID,
+
Value: lang,
+
})
+
}
+
+
if out.Reply != nil {
+
post.Reply = FeedPost_Reply{
+
FeedPostID: post.ID,
+
Parent: StrongRef{
+
Uri: out.Reply.Parent.Uri,
+
Cid: out.Reply.Parent.Cid,
+
},
+
Root: StrongRef{
+
Uri: out.Reply.Root.Uri,
+
Cid: out.Reply.Root.Cid,
+
},
+
}
+
}
+
+
for _, tag := range out.Tags {
+
post.Tags = append(post.Tags, FeedPost_Tag{
+
FeedPostID: post.ID,
+
Value: tag,
+
})
+
}
+
+
return &post
+
}
+1 -1
models/models.go
···
// - [X] ActorStatus *
// - [X] FeedGenerator *
// - [X] FeedLike
-
// - [ ] FeedPost
+
// - [X] FeedPost
// - [ ] FeedPostgate
// - [ ] FeedRepost
// - [ ] FeedThreadgate