Live video on the AT Protocol
79
fork

Configure Feed

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

at v0.9.4 60 lines 1.8 kB view raw
1package model 2 3import ( 4 "context" 5 "fmt" 6 "time" 7 8 "github.com/bluesky-social/indigo/api/bsky" 9 "stream.place/streamplace/pkg/aqtime" 10) 11 12type Follow struct { 13 UserDID string `gorm:"primaryKey;index:user_idx;column:user_did"` 14 SubjectDID string `gorm:"primaryKey;index:subject_idx;column:subject_did"` 15 RKey string `gorm:"index;column:rkey"` 16 CreatedAt time.Time 17} 18 19func (m *DBModel) CreateFollow(ctx context.Context, userDID, rkey string, follow *bsky.GraphFollow) error { 20 at, err := aqtime.FromString(follow.CreatedAt) 21 if err != nil { 22 return fmt.Errorf("failed to parse follow createdAt: %w", err) 23 } 24 return m.DB.Save(&Follow{ 25 UserDID: userDID, 26 SubjectDID: follow.Subject, 27 RKey: rkey, 28 CreatedAt: at.Time(), 29 }).Error 30} 31 32func (m *DBModel) DeleteFollow(ctx context.Context, userDID, rkey string) error { 33 res := m.DB.Where("user_did = ? AND rkey = ?", userDID, rkey).Delete(&Follow{}) 34 if res.Error != nil { 35 return fmt.Errorf("failed to delete follow: %w", res.Error) 36 } 37 if res.RowsAffected == 0 { 38 return fmt.Errorf("no follow found for userDID %s and rkey %s", userDID, rkey) 39 } 40 return nil 41} 42 43func (m *DBModel) GetUserFollowing(ctx context.Context, userDID string) ([]Follow, error) { 44 var follows []Follow 45 return follows, m.DB.Where("user_did = ?", userDID).Find(&follows).Error 46} 47 48func (m *DBModel) GetUserFollowers(ctx context.Context, userDID string) ([]Follow, error) { 49 var follows []Follow 50 return follows, m.DB.Where("subject_did = ?", userDID).Find(&follows).Error 51} 52 53func (m *DBModel) GetUserFollowingUser(ctx context.Context, userDID, subjectDID string) (*Follow, error) { 54 var follow Follow 55 result := m.DB.Where("user_did = ? AND subject_did = ?", userDID, subjectDID).First(&follow) 56 if result.RowsAffected == 0 { 57 return nil, nil 58 } 59 return &follow, result.Error 60}