an app.bsky.* indexer

add FeedThreadgate

Changed files
+98 -2
cmd
monarch
models
+10 -1
cmd/monarch/handlers.go
···
&models.FeedPostgate_DetachedEmbeddingUri{},
&models.FeedPostgate_EmbeddingRule{},
&models.FeedRepost{},
+
&models.FeedThreadgate{},
+
&models.FeedThreadgate_AllowRule{},
+
&models.FeedThreadgate_HiddenReply{},
&models.GraphBlock{},
&models.GraphList{},
···
case syntax.NSID("app.bsky.feed.repost"):
repost := models.NewFeedRepost(uri, *rec)
-
if err := hs.store.Where(models.FeedRepost{ID: string(uri)}).Assign(repost).FirstOrCreate(repost).Error; err != nil {
+
if err := hs.store.Where(models.FeedRepost{ID: string(uri)}).Assign(repost).FirstOrCreate(&models.FeedRepost{}).Error; err != nil {
return fmt.Errorf("error upserting feed repost: %w", err)
+
}
+
+
case syntax.NSID("app.bsky.feed.threadgate"):
+
threadgate := models.NewFeedThreadgate(uri, *rec)
+
if err := hs.store.Where(models.FeedThreadgate{ID: string(uri)}).Assign(threadgate).FirstOrCreate(&models.FeedThreadgate{}).Error; err != nil {
+
return fmt.Errorf("error upserting feed threadgate: %w", err)
}
case syntax.NSID("app.bsky.graph.block"):
+87
models/feed_threadgate.go
···
+
package models
+
+
import (
+
"bytes"
+
"log/slog"
+
"time"
+
+
appbsky "github.com/bluesky-social/indigo/api/bsky"
+
"github.com/bluesky-social/indigo/atproto/syntax"
+
)
+
+
type FeedThreadgate struct {
+
ID string `gorm:"primaryKey"`
+
+
AllowRules []FeedThreadgate_AllowRule
+
CreatedAt string
+
HiddenReplies []FeedThreadgate_HiddenReply
+
Post string
+
+
AutoCreatedAt time.Time `gorm:"autoCreateTime"`
+
AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
+
}
+
+
type FeedThreadgate_AllowRule struct {
+
FeedThreadgateID string
+
Rule string
+
}
+
+
type FeedThreadgate_HiddenReply struct {
+
FeedThreadgateID string
+
Uri string
+
}
+
+
func NewFeedThreadgate(uri syntax.ATURI, rec []byte) *FeedThreadgate {
+
var out appbsky.FeedThreadgate
+
if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
+
slog.Error("could not unmarshal feed threadgate CBOR", "err", err)
+
return nil
+
}
+
+
threadgate := FeedThreadgate{
+
ID: string(uri),
+
CreatedAt: out.CreatedAt,
+
Post: out.Post,
+
}
+
+
for _, hidden := range out.HiddenReplies {
+
threadgate.HiddenReplies = append(threadgate.HiddenReplies, FeedThreadgate_HiddenReply{
+
FeedThreadgateID: threadgate.ID,
+
Uri: hidden,
+
})
+
}
+
+
if out.Allow != nil {
+
for _, rule := range out.Allow {
+
if rule.FeedThreadgate_MentionRule != nil {
+
threadgate.AllowRules = append(threadgate.AllowRules, FeedThreadgate_AllowRule{
+
FeedThreadgateID: threadgate.ID,
+
Rule: rule.FeedThreadgate_MentionRule.LexiconTypeID,
+
})
+
}
+
+
if rule.FeedThreadgate_FollowerRule != nil {
+
threadgate.AllowRules = append(threadgate.AllowRules, FeedThreadgate_AllowRule{
+
FeedThreadgateID: threadgate.ID,
+
Rule: rule.FeedThreadgate_FollowerRule.LexiconTypeID,
+
})
+
}
+
+
if rule.FeedThreadgate_FollowingRule != nil {
+
threadgate.AllowRules = append(threadgate.AllowRules, FeedThreadgate_AllowRule{
+
FeedThreadgateID: threadgate.ID,
+
Rule: rule.FeedThreadgate_FollowingRule.LexiconTypeID,
+
})
+
}
+
+
if rule.FeedThreadgate_ListRule != nil {
+
threadgate.AllowRules = append(threadgate.AllowRules, FeedThreadgate_AllowRule{
+
FeedThreadgateID: threadgate.ID,
+
Rule: rule.FeedThreadgate_ListRule.LexiconTypeID,
+
})
+
}
+
}
+
}
+
+
return &threadgate
+
}
+1 -1
models/models.go
···
// - [X] FeedPost
// - [X] FeedPostgate
// - [X] FeedRepost
-
// - [ ] FeedThreadgate
+
// - [X] FeedThreadgate
// - [X] GraphBlock *
// - [ ] GraphFollow
// - [X] GraphList *