Monorepo for Tangled
0
fork

Configure Feed

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

appview/indexer: reindex repo upon stat change

when the count of issues/pulls/stars changes, we reindex repo because it
is dependent on these fields.

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by tangled.org 7277bfae b79a9bdd

+61 -7
+7 -5
appview/indexer/indexer.go
··· 17 17 Pulls *pulls_indexer.Indexer 18 18 Repos *repos_indexer.Indexer 19 19 logger *slog.Logger 20 + Db *db.DB 20 21 notify.BaseNotifier 21 22 } 22 23 23 - func New(logger *slog.Logger) *Indexer { 24 + func New(logger *slog.Logger, db *db.DB) *Indexer { 24 25 return &Indexer{ 25 26 issues_indexer.NewIndexer("indexes/issues.bleve"), 26 27 pulls_indexer.NewIndexer("indexes/pulls.bleve"), 27 28 repos_indexer.NewIndexer("indexes/repos.bleve"), 28 29 logger, 30 + db, 29 31 notify.BaseNotifier{}, 30 32 } 31 33 } 32 34 33 35 // Init initializes all indexers 34 - func (ix *Indexer) Init(ctx context.Context, db *db.DB) error { 36 + func (ix *Indexer) Init(ctx context.Context) error { 35 37 ctx = tlog.IntoContext(ctx, ix.logger) 36 - ix.Issues.Init(ctx, db) 37 - ix.Pulls.Init(ctx, db) 38 - ix.Repos.Init(ctx, db) 38 + ix.Issues.Init(ctx, ix.Db) 39 + ix.Pulls.Init(ctx, ix.Db) 40 + ix.Repos.Init(ctx, ix.Db) 39 41 return nil 40 42 }
+52
appview/indexer/notifier.go
··· 4 4 "context" 5 5 6 6 "github.com/bluesky-social/indigo/atproto/syntax" 7 + "tangled.org/core/api/tangled" 8 + "tangled.org/core/appview/db" 7 9 "tangled.org/core/appview/models" 8 10 "tangled.org/core/appview/notify" 9 11 "tangled.org/core/log" 12 + "tangled.org/core/orm" 10 13 ) 11 14 12 15 var _ notify.Notifier = &Indexer{} 13 16 17 + func (ix *Indexer) getAndReindexRepo(ctx context.Context, repoAt syntax.ATURI) { 18 + l := log.FromContext(ctx).With("notifier", "indexer", "repo_at", repoAt) 19 + 20 + repo, err := db.GetRepo(ix.Db, orm.FilterEq("at_uri", repoAt.String())) 21 + if err != nil { 22 + l.Error("failed to get repo for reindexing", "err", err) 23 + return 24 + } 25 + 26 + err = ix.Repos.Index(ctx, *repo) 27 + if err != nil { 28 + l.Error("failed to reindex repo", "err", err) 29 + } 30 + } 31 + 14 32 func (ix *Indexer) NewIssue(ctx context.Context, issue *models.Issue, mentions []syntax.DID) { 15 33 l := log.FromContext(ctx).With("notifier", "indexer", "issue", issue) 16 34 l.Debug("indexing new issue") 35 + 17 36 err := ix.Issues.Index(ctx, *issue) 18 37 if err != nil { 19 38 l.Error("failed to index an issue", "err", err) 20 39 } 40 + 41 + l.Debug("reindexing repo after new issue") 42 + ix.getAndReindexRepo(ctx, issue.RepoAt) 21 43 } 22 44 23 45 func (ix *Indexer) NewIssueState(ctx context.Context, actor syntax.DID, issue *models.Issue) { ··· 32 54 func (ix *Indexer) DeleteIssue(ctx context.Context, issue *models.Issue) { 33 55 l := log.FromContext(ctx).With("notifier", "indexer", "issue", issue) 34 56 l.Debug("deleting an issue") 57 + 35 58 err := ix.Issues.Delete(ctx, issue.Id) 36 59 if err != nil { 37 60 l.Error("failed to delete an issue", "err", err) 38 61 } 62 + 63 + l.Debug("reindexing repo after issue deletion") 64 + ix.getAndReindexRepo(ctx, issue.RepoAt) 39 65 } 40 66 41 67 func (ix *Indexer) NewIssueLabelOp(ctx context.Context, issue *models.Issue) { ··· 59 85 func (ix *Indexer) NewPull(ctx context.Context, pull *models.Pull) { 60 86 l := log.FromContext(ctx).With("notifier", "indexer", "pull", pull) 61 87 l.Debug("indexing new pr") 88 + 62 89 err := ix.Pulls.Index(ctx, pull) 63 90 if err != nil { 64 91 l.Error("failed to index a pr", "err", err) 65 92 } 93 + 94 + l.Debug("reindexing repo after new pull") 95 + ix.getAndReindexRepo(ctx, pull.RepoAt) 66 96 } 67 97 68 98 func (ix *Indexer) NewPullState(ctx context.Context, actor syntax.DID, pull *models.Pull) { ··· 82 112 l.Error("failed to index a repo", "err", err) 83 113 } 84 114 } 115 + 116 + func (ix *Indexer) NewStar(ctx context.Context, star *models.Star) { 117 + l := log.FromContext(ctx).With("notifier", "indexer", "star", star) 118 + 119 + if star.RepoAt.Collection().String() != tangled.RepoNSID { 120 + return 121 + } 122 + 123 + l.Debug("reindexing repo after new star") 124 + ix.getAndReindexRepo(ctx, star.RepoAt) 125 + } 126 + 127 + func (ix *Indexer) DeleteStar(ctx context.Context, star *models.Star) { 128 + l := log.FromContext(ctx).With("notifier", "indexer", "star", star) 129 + 130 + if star.RepoAt.Collection().String() != tangled.RepoNSID { 131 + return 132 + } 133 + 134 + l.Debug("reindexing repo after star deletion") 135 + ix.getAndReindexRepo(ctx, star.RepoAt) 136 + }
+2 -2
appview/state/state.go
··· 77 77 return nil, fmt.Errorf("failed to create db: %w", err) 78 78 } 79 79 80 - indexer := indexer.New(log.SubLogger(logger, "indexer")) 81 - err = indexer.Init(ctx, d) 80 + indexer := indexer.New(log.SubLogger(logger, "indexer"), d) 81 + err = indexer.Init(ctx) 82 82 if err != nil { 83 83 return nil, fmt.Errorf("failed to create indexer: %w", err) 84 84 }