an app.bsky.* indexer

add FeedLike

Changed files
+76 -1
cmd
monarch
models
+9
cmd/monarch/handlers.go
···
&models.ActorStatus_Embed{},
&models.FeedGenerator{},
&models.FeedGenerator_Label{},
+
&models.FeedLike{},
+
&models.FeedLike_Subject{},
+
&models.FeedLike_Via{},
&models.GraphBlock{},
&models.GraphList{},
&models.GraphListblock{},
···
feedgen := models.NewFeedGenerator(uri, *rec)
if err := hs.store.Where(models.FeedGenerator{ID: string(uri)}).Assign(feedgen).FirstOrCreate(&models.FeedGenerator{}).Error; err != nil {
return fmt.Errorf("error upserting feed generator: %w", err)
+
}
+
+
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.graph.block"):
+66
models/feed_like.go
···
+
package models
+
+
import (
+
"bytes"
+
"log/slog"
+
"time"
+
+
appbsky "github.com/bluesky-social/indigo/api/bsky"
+
"github.com/bluesky-social/indigo/atproto/syntax"
+
)
+
+
type FeedLike struct {
+
ID string `gorm:"primaryKey"`
+
+
CreatedAt string
+
Subject FeedLike_Subject
+
Via FeedLike_Via
+
+
AutoCreatedAt time.Time `gorm:"autoCreateTime"`
+
AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
+
}
+
+
type FeedLike_Subject struct {
+
FeedLikeID string
+
StrongRef
+
}
+
+
type FeedLike_Via struct {
+
FeedLikeID string
+
StrongRef
+
}
+
+
func NewFeedLike(uri syntax.ATURI, rec []byte) *FeedLike {
+
var out appbsky.FeedLike
+
if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
+
slog.Error("could not unmarshal feed like CBOR", "err", err)
+
return nil
+
}
+
+
like := FeedLike{
+
ID: string(uri),
+
CreatedAt: out.CreatedAt,
+
}
+
+
if out.Subject != nil {
+
like.Subject = FeedLike_Subject{
+
FeedLikeID: like.ID,
+
StrongRef: StrongRef{
+
Uri: out.Subject.Uri,
+
Cid: out.Subject.Cid,
+
},
+
}
+
}
+
+
if out.Via != nil {
+
like.Via = FeedLike_Via{
+
FeedLikeID: like.ID,
+
StrongRef: StrongRef{
+
Uri: out.Via.Uri,
+
Cid: out.Via.Cid,
+
},
+
}
+
}
+
+
return &like
+
}
+1 -1
models/models.go
···
// - [X] ActorProfile *
// - [X] ActorStatus *
// - [X] FeedGenerator *
-
// - [ ] FeedLike
+
// - [X] FeedLike
// - [ ] FeedPost
// - [ ] FeedPostgate
// - [ ] FeedRepost