this repo has no description
0
fork

Configure Feed

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

add admin route to disable new subscriptions

+86 -34
+26 -1
bgs/admin.go
··· 1 1 package bgs 2 2 3 - import "github.com/labstack/echo/v4" 3 + import ( 4 + "strconv" 5 + 6 + "github.com/bluesky-social/indigo/util" 7 + "github.com/labstack/echo/v4" 8 + ) 4 9 5 10 func (bgs *BGS) handleAdminDeleteRecord(e echo.Context) error { 11 + puri, err := util.ParseAtUri(e.QueryParam("uri")) 12 + if err != nil { 13 + return err 14 + } 15 + 16 + _ = puri 17 + 6 18 panic("TODO") 7 19 } 8 20 9 21 func (bgs *BGS) handleAdminBlockRepoStream(e echo.Context) error { 10 22 panic("TODO") 11 23 } 24 + 25 + func (bgs *BGS) handleAdminDisableNewSlurps(e echo.Context) error { 26 + enabled, err := strconv.ParseBool(e.QueryParam("enabled")) 27 + if err != nil { 28 + return err 29 + } 30 + 31 + return bgs.slurper.SetNewSubsDisabled(!enabled) 32 + } 33 + 34 + func (bgs *BGS) handleAdminTakedownRepo(e echo.Context) error { 35 + panic("TODO") 36 + }
+6 -1
bgs/bgs.go
··· 74 74 } 75 75 76 76 ix.CreateExternalUser = bgs.createExternalUser 77 - bgs.slurper = NewSlurper(db, bgs.handleFedEvent, ssl) 77 + s, err := NewSlurper(db, bgs.handleFedEvent, ssl) 78 + if err != nil { 79 + return nil, err 80 + } 81 + 82 + bgs.slurper = s 78 83 79 84 if err := bgs.slurper.RestartAll(); err != nil { 80 85 return nil, err
+50 -3
bgs/fedmgr.go
··· 27 27 lk sync.Mutex 28 28 active map[string]*models.PDS 29 29 30 + newSubsDisabled bool 31 + 30 32 ssl bool 31 33 } 32 34 33 - func NewSlurper(db *gorm.DB, cb IndexCallback, ssl bool) *Slurper { 34 - return &Slurper{ 35 + func NewSlurper(db *gorm.DB, cb IndexCallback, ssl bool) (*Slurper, error) { 36 + s := &Slurper{ 35 37 cb: cb, 36 38 db: db, 37 39 active: make(map[string]*models.PDS), 38 40 ssl: ssl, 39 41 } 42 + if err := s.loadConfig(); err != nil { 43 + return nil, err 44 + } 45 + 46 + return s, nil 40 47 } 41 48 49 + func (s *Slurper) loadConfig() error { 50 + var sc SlurpConfig 51 + if err := s.db.Find(&sc).Error; err != nil { 52 + return err 53 + } 54 + 55 + if sc.ID == 0 { 56 + if err := s.db.Create(&SlurpConfig{}).Error; err != nil { 57 + return err 58 + } 59 + } 60 + 61 + s.newSubsDisabled = sc.NewSubsDisabled 62 + 63 + return nil 64 + } 65 + 66 + type SlurpConfig struct { 67 + gorm.Model 68 + 69 + NewSubsDisabled bool 70 + } 71 + 72 + func (s *Slurper) SetNewSubsDisabled(dis bool) error { 73 + s.lk.Lock() 74 + defer s.lk.Unlock() 75 + 76 + if err := s.db.Model(SlurpConfig{}).Where("id = 1").Update("new_subs_disabled", dis).Error; err != nil { 77 + return err 78 + } 79 + 80 + s.newSubsDisabled = dis 81 + return nil 82 + } 83 + 84 + var ErrNewSubsDisabled = fmt.Errorf("new subscriptions temporarily disabled") 85 + 42 86 func (s *Slurper) SubscribeToPds(ctx context.Context, host string, reg bool) error { 43 87 // TODO: for performance, lock on the hostname instead of global 44 88 s.lk.Lock() 45 89 defer s.lk.Unlock() 90 + if s.newSubsDisabled { 91 + return ErrNewSubsDisabled 92 + } 46 93 47 94 _, ok := s.active[host] 48 95 if ok { ··· 87 134 defer s.lk.Unlock() 88 135 89 136 var all []models.PDS 90 - if err := s.db.Find(&all).Error; err != nil { 137 + if err := s.db.Find(&all, "registered = true").Error; err != nil { 91 138 return err 92 139 } 93 140
+4 -29
indexer/indexer.go
··· 5 5 "context" 6 6 "errors" 7 7 "fmt" 8 - "strings" 9 8 "time" 10 9 11 10 comatproto "github.com/bluesky-social/indigo/api/atproto" ··· 310 309 } 311 310 312 311 func (ix *Indexer) crawlAtUriRef(ctx context.Context, uri string) error { 313 - puri, err := parseAtUri(uri) 312 + puri, err := util.ParseAtUri(uri) 314 313 if err != nil { 315 314 return err 316 315 } else { ··· 538 537 } 539 538 540 539 func (ix *Indexer) GetPostOrMissing(ctx context.Context, uri string) (*models.FeedPost, error) { 541 - puri, err := parseAtUri(uri) 540 + puri, err := util.ParseAtUri(uri) 542 541 if err != nil { 543 542 return nil, err 544 543 } ··· 643 642 return ix.createMissingUserRecord(ctx, did) 644 643 } 645 644 646 - func (ix *Indexer) createMissingPostRecord(ctx context.Context, puri *parsedUri) (*models.FeedPost, error) { 645 + func (ix *Indexer) createMissingPostRecord(ctx context.Context, puri *util.ParsedUri) (*models.FeedPost, error) { 647 646 log.Warn("creating missing post record") 648 647 ai, err := ix.GetUserOrMissing(ctx, puri.Did) 649 648 if err != nil { ··· 793 792 } 794 793 795 794 func (ix *Indexer) GetPost(ctx context.Context, uri string) (*models.FeedPost, error) { 796 - puri, err := parseAtUri(uri) 795 + puri, err := util.ParseAtUri(uri) 797 796 if err != nil { 798 797 return nil, err 799 798 } ··· 804 803 } 805 804 806 805 return &post, nil 807 - } 808 - 809 - type parsedUri struct { 810 - Did string 811 - Collection string 812 - Rkey string 813 - } 814 - 815 - func parseAtUri(uri string) (*parsedUri, error) { 816 - if !strings.HasPrefix(uri, "at://") { 817 - return nil, fmt.Errorf("AT uris must be prefixed with 'at://'") 818 - } 819 - 820 - trimmed := strings.TrimPrefix(uri, "at://") 821 - parts := strings.Split(trimmed, "/") 822 - if len(parts) != 3 { 823 - return nil, fmt.Errorf("AT uris must have three parts: did, collection, tid") 824 - } 825 - 826 - return &parsedUri{ 827 - Did: parts[0], 828 - Collection: parts[1], 829 - Rkey: parts[2], 830 - }, nil 831 806 } 832 807 833 808 // TODO: since this function is the only place we depend on the repomanager, i wonder if this should be wired some other way?