Live video on the AT Protocol
79
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v0.8.3 77 lines 2.2 kB view raw
1package model 2 3import ( 4 "context" 5 "errors" 6 "fmt" 7 "time" 8 9 "github.com/bluesky-social/indigo/api/bsky" 10 lexutil "github.com/bluesky-social/indigo/lex/util" 11 "gorm.io/gorm" 12 "stream.place/streamplace/pkg/streamplace" 13) 14 15type Block struct { 16 RKey string `gorm:"primaryKey;column:rkey"` 17 CID string `gorm:"column:cid"` 18 RepoDID string `json:"repoDID" gorm:"column:repo_did;index:idx_repo_did_subject_did,priority:1"` 19 Repo *Repo `json:"repo,omitempty" gorm:"foreignKey:DID;references:RepoDID"` 20 SubjectDID string `gorm:"column:subject_did;index:idx_repo_did_subject_did,priority:2"` 21 Record []byte 22 CreatedAt time.Time 23} 24 25func (b *Block) ToStreamplaceBlock() (*streamplace.Defs_BlockView, error) { 26 rec, err := lexutil.CborDecodeValue(b.Record) 27 if err != nil { 28 return nil, fmt.Errorf("error decoding feed post: %w", err) 29 } 30 block, ok := rec.(*bsky.GraphBlock) 31 if !ok { 32 return nil, fmt.Errorf("record is not a GraphBlock") 33 } 34 return &streamplace.Defs_BlockView{ 35 LexiconTypeID: "place.stream.defs#blockView", 36 Blocker: &bsky.ActorDefs_ProfileViewBasic{ 37 Did: b.RepoDID, 38 Handle: b.Repo.Handle, 39 }, 40 Cid: b.CID, 41 IndexedAt: b.CreatedAt.Format(time.RFC3339), 42 Record: block, 43 Uri: fmt.Sprintf(`at://%s/app.bsky.graph.block/%s`, b.RepoDID, b.RKey), 44 }, nil 45} 46 47func (m *DBModel) CreateBlock(ctx context.Context, block *Block) error { 48 return m.DB.Create(block).Error 49} 50 51func (m *DBModel) DeleteBlock(ctx context.Context, rkey string) error { 52 return m.DB.Where("rkey = ?", rkey).Delete(&Block{}).Error 53} 54 55func (m *DBModel) GetBlock(ctx context.Context, rkey string) (*Block, error) { 56 var block Block 57 err := m.DB.Preload("Repo").Where("rkey = ?", rkey).First(&block).Error 58 if errors.Is(err, gorm.ErrRecordNotFound) { 59 return nil, nil 60 } 61 if err != nil { 62 return nil, err 63 } 64 return &block, nil 65} 66 67func (m *DBModel) GetUserBlock(ctx context.Context, userDID, subjectDID string) (*Block, error) { 68 var block Block 69 err := m.DB.Where("repo_did = ? AND subject_did = ?", userDID, subjectDID).First(&block).Error 70 if errors.Is(err, gorm.ErrRecordNotFound) { 71 return nil, nil 72 } 73 if err != nil { 74 return nil, err 75 } 76 return &block, nil 77}