an app.bsky.* indexer

add FeedRepost

Changed files
+58 -1
cmd
monarch
models
+7
cmd/monarch/handlers.go
··· 37 37 &models.FeedPostgate{}, 38 38 &models.FeedPostgate_DetachedEmbeddingUri{}, 39 39 &models.FeedPostgate_EmbeddingRule{}, 40 + &models.FeedRepost{}, 40 41 41 42 &models.GraphBlock{}, 42 43 &models.GraphList{}, ··· 104 105 postgate := models.NewFeedPostgate(uri, *rec) 105 106 if err := hs.store.Where(models.FeedPostgate{ID: string(uri)}).Assign(postgate).FirstOrCreate(&models.FeedPostgate{}).Error; err != nil { 106 107 return fmt.Errorf("error upserting feed postgate: %w", err) 108 + } 109 + 110 + case syntax.NSID("app.bsky.feed.repost"): 111 + repost := models.NewFeedRepost(uri, *rec) 112 + if err := hs.store.Where(models.FeedRepost{ID: string(uri)}).Assign(repost).FirstOrCreate(repost).Error; err != nil { 113 + return fmt.Errorf("error upserting feed repost: %w", err) 107 114 } 108 115 109 116 case syntax.NSID("app.bsky.graph.block"):
+50
models/feed_repost.go
··· 1 + package models 2 + 3 + import ( 4 + "bytes" 5 + "log/slog" 6 + "time" 7 + 8 + appbsky "github.com/bluesky-social/indigo/api/bsky" 9 + "github.com/bluesky-social/indigo/atproto/syntax" 10 + ) 11 + 12 + type FeedRepost struct { 13 + ID string `gorm:"primaryKey"` 14 + 15 + CreatedAt string 16 + Subject *StrongRef `gorm:"embedded;embeddedPrefix:subject_"` 17 + Via *StrongRef `gorm:"embedded;embeddedPrefix:via_"` 18 + 19 + AutoCreatedAt time.Time `gorm:"autoCreateTime"` 20 + AutoUpdatedAt time.Time `gorm:"autoUpdateTime"` 21 + } 22 + 23 + func NewFeedRepost(uri syntax.ATURI, rec []byte) *FeedRepost { 24 + var out appbsky.FeedRepost 25 + if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil { 26 + slog.Error("could not unmarshal feed repost CBOR", "err", err) 27 + return nil 28 + } 29 + 30 + repost := FeedRepost{ 31 + ID: string(uri), 32 + CreatedAt: out.CreatedAt, 33 + } 34 + 35 + if out.Subject != nil { 36 + repost.Subject = &StrongRef{ 37 + Uri: out.Subject.Uri, 38 + Cid: out.Subject.Cid, 39 + } 40 + } 41 + 42 + if out.Via != nil { 43 + repost.Via = &StrongRef{ 44 + Uri: out.Via.Uri, 45 + Cid: out.Via.Cid, 46 + } 47 + } 48 + 49 + return &repost 50 + }
+1 -1
models/models.go
··· 6 6 // - [X] FeedLike 7 7 // - [X] FeedPost 8 8 // - [X] FeedPostgate 9 - // - [ ] FeedRepost 9 + // - [X] FeedRepost 10 10 // - [ ] FeedThreadgate 11 11 // - [X] GraphBlock * 12 12 // - [ ] GraphFollow