diff --git a/appview/indexer/indexer.go b/appview/indexer/indexer.go --- a/appview/indexer/indexer.go +++ b/appview/indexer/indexer.go @@ -17,24 +17,26 @@ Pulls *pulls_indexer.Indexer Repos *repos_indexer.Indexer logger *slog.Logger + Db *db.DB notify.BaseNotifier } -func New(logger *slog.Logger) *Indexer { +func New(logger *slog.Logger, db *db.DB) *Indexer { return &Indexer{ issues_indexer.NewIndexer("indexes/issues.bleve"), pulls_indexer.NewIndexer("indexes/pulls.bleve"), repos_indexer.NewIndexer("indexes/repos.bleve"), logger, + db, notify.BaseNotifier{}, } } // Init initializes all indexers -func (ix *Indexer) Init(ctx context.Context, db *db.DB) error { +func (ix *Indexer) Init(ctx context.Context) error { ctx = tlog.IntoContext(ctx, ix.logger) - ix.Issues.Init(ctx, db) - ix.Pulls.Init(ctx, db) - ix.Repos.Init(ctx, db) + ix.Issues.Init(ctx, ix.Db) + ix.Pulls.Init(ctx, ix.Db) + ix.Repos.Init(ctx, ix.Db) return nil } diff --git a/appview/indexer/notifier.go b/appview/indexer/notifier.go --- a/appview/indexer/notifier.go +++ b/appview/indexer/notifier.go @@ -4,20 +4,42 @@ "context" "github.com/bluesky-social/indigo/atproto/syntax" + "tangled.org/core/api/tangled" + "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/notify" "tangled.org/core/log" + "tangled.org/core/orm" ) var _ notify.Notifier = &Indexer{} +func (ix *Indexer) getAndReindexRepo(ctx context.Context, repoAt syntax.ATURI) { + l := log.FromContext(ctx).With("notifier", "indexer", "repo_at", repoAt) + + repo, err := db.GetRepo(ix.Db, orm.FilterEq("at_uri", repoAt.String())) + if err != nil { + l.Error("failed to get repo for reindexing", "err", err) + return + } + + err = ix.Repos.Index(ctx, *repo) + if err != nil { + l.Error("failed to reindex repo", "err", err) + } +} + func (ix *Indexer) NewIssue(ctx context.Context, issue *models.Issue, mentions []syntax.DID) { l := log.FromContext(ctx).With("notifier", "indexer", "issue", issue) l.Debug("indexing new issue") + err := ix.Issues.Index(ctx, *issue) if err != nil { l.Error("failed to index an issue", "err", err) } + + l.Debug("reindexing repo after new issue") + ix.getAndReindexRepo(ctx, issue.RepoAt) } func (ix *Indexer) NewIssueState(ctx context.Context, actor syntax.DID, issue *models.Issue) { @@ -32,10 +54,14 @@ func (ix *Indexer) DeleteIssue(ctx context.Context, issue *models.Issue) { l := log.FromContext(ctx).With("notifier", "indexer", "issue", issue) l.Debug("deleting an issue") + err := ix.Issues.Delete(ctx, issue.Id) if err != nil { l.Error("failed to delete an issue", "err", err) } + + l.Debug("reindexing repo after issue deletion") + ix.getAndReindexRepo(ctx, issue.RepoAt) } func (ix *Indexer) NewIssueLabelOp(ctx context.Context, issue *models.Issue) { @@ -59,10 +85,14 @@ func (ix *Indexer) NewPull(ctx context.Context, pull *models.Pull) { l := log.FromContext(ctx).With("notifier", "indexer", "pull", pull) l.Debug("indexing new pr") + err := ix.Pulls.Index(ctx, pull) if err != nil { l.Error("failed to index a pr", "err", err) } + + l.Debug("reindexing repo after new pull") + ix.getAndReindexRepo(ctx, pull.RepoAt) } func (ix *Indexer) NewPullState(ctx context.Context, actor syntax.DID, pull *models.Pull) { @@ -81,4 +111,26 @@ if err != nil { l.Error("failed to index a repo", "err", err) } +} + +func (ix *Indexer) NewStar(ctx context.Context, star *models.Star) { + l := log.FromContext(ctx).With("notifier", "indexer", "star", star) + + if star.RepoAt.Collection().String() != tangled.RepoNSID { + return + } + + l.Debug("reindexing repo after new star") + ix.getAndReindexRepo(ctx, star.RepoAt) +} + +func (ix *Indexer) DeleteStar(ctx context.Context, star *models.Star) { + l := log.FromContext(ctx).With("notifier", "indexer", "star", star) + + if star.RepoAt.Collection().String() != tangled.RepoNSID { + return + } + + l.Debug("reindexing repo after star deletion") + ix.getAndReindexRepo(ctx, star.RepoAt) } diff --git a/appview/state/state.go b/appview/state/state.go --- a/appview/state/state.go +++ b/appview/state/state.go @@ -77,8 +77,8 @@ return nil, fmt.Errorf("failed to create db: %w", err) } - indexer := indexer.New(log.SubLogger(logger, "indexer")) - err = indexer.Init(ctx, d) + indexer := indexer.New(log.SubLogger(logger, "indexer"), d) + err = indexer.Init(ctx) if err != nil { return nil, fmt.Errorf("failed to create indexer: %w", err) }