an app.bsky.* indexer

add FeedPostgate

Changed files
+74 -1
cmd
monarch
models
+9
cmd/monarch/handlers.go
···
&models.FeedPost_Lang{},
&models.FeedPost_Reply{},
&models.FeedPost_Tag{},
+
&models.FeedPostgate{},
+
&models.FeedPostgate_DetachedEmbeddingUri{},
+
&models.FeedPostgate_EmbeddingRule{},
&models.GraphBlock{},
&models.GraphList{},
···
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)
+
}
+
+
case syntax.NSID("app.bsky.feed.postgate"):
+
postgate := models.NewFeedPostgate(uri, *rec)
+
if err := hs.store.Where(models.FeedPostgate{ID: string(uri)}).Assign(postgate).FirstOrCreate(&models.FeedPostgate{}).Error; err != nil {
+
return fmt.Errorf("error upserting feed postgate: %w", err)
}
case syntax.NSID("app.bsky.graph.block"):
+64
models/feed_postgate.go
···
+
package models
+
+
import (
+
"bytes"
+
"log/slog"
+
"time"
+
+
appbsky "github.com/bluesky-social/indigo/api/bsky"
+
"github.com/bluesky-social/indigo/atproto/syntax"
+
)
+
+
type FeedPostgate struct {
+
ID string `gorm:"primaryKey"`
+
+
CreatedAt string
+
DetachedEmbeddingUris []FeedPostgate_DetachedEmbeddingUri
+
EmbeddingRules []FeedPostgate_EmbeddingRule
+
Post string
+
+
AutoCreatedAt time.Time `gorm:"autoCreateTime"`
+
AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
+
}
+
+
type FeedPostgate_DetachedEmbeddingUri struct {
+
FeedPostgateID string
+
Value string
+
}
+
+
type FeedPostgate_EmbeddingRule struct {
+
FeedPostgateID string
+
DisableRule string
+
}
+
+
func NewFeedPostgate(uri syntax.ATURI, rec []byte) *FeedPostgate {
+
var out appbsky.FeedPostgate
+
if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
+
slog.Error("could not unmarshal feed post CBOR", "err", err)
+
return nil
+
}
+
+
postgate := FeedPostgate{
+
ID: string(uri),
+
CreatedAt: out.CreatedAt,
+
Post: out.Post,
+
}
+
+
for _, uri := range out.DetachedEmbeddingUris {
+
postgate.DetachedEmbeddingUris = append(postgate.DetachedEmbeddingUris, FeedPostgate_DetachedEmbeddingUri{
+
FeedPostgateID: postgate.ID,
+
Value: uri,
+
})
+
}
+
+
if out.EmbeddingRules != nil {
+
for _, rule := range out.EmbeddingRules {
+
postgate.EmbeddingRules = append(postgate.EmbeddingRules, FeedPostgate_EmbeddingRule{
+
FeedPostgateID: postgate.ID,
+
DisableRule: rule.FeedPostgate_DisableRule.LexiconTypeID,
+
})
+
}
+
}
+
+
return &postgate
+
}
+1 -1
models/models.go
···
// - [X] FeedGenerator *
// - [X] FeedLike
// - [X] FeedPost
-
// - [ ] FeedPostgate
+
// - [X] FeedPostgate
// - [ ] FeedRepost
// - [ ] FeedThreadgate
// - [X] GraphBlock *