From 59874c717ddb0ce6045d15c589f8bfaea86b3c19 Mon Sep 17 00:00:00 2001 From: Quick <31828688+Quick104@users.noreply.github.com> Date: Fri, 29 May 2026 10:49:01 -0400 Subject: [PATCH] feat: wire trending refresh task and snapshot reader --- cmd/silo/main.go | 17 +++++++++++++++++ internal/api/router.go | 21 ++++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/cmd/silo/main.go b/cmd/silo/main.go index 1305fed6..907145fb 100644 --- a/cmd/silo/main.go +++ b/cmd/silo/main.go @@ -1234,6 +1234,7 @@ func main() { // Construct collection service for both the router and the collection sync scheduler. var collectionSyncScheduler *catalog.CollectionSyncScheduler var userCollectionScheduler *usercollections.Scheduler + var trendingRefresher *sections.TrendingRefresher if needsWorkers && deps.DB != nil { collectionRepo := catalog.NewLibraryCollectionRepository(deps.DB) collItemRepo := catalog.NewItemRepository(deps.DB) @@ -1243,6 +1244,19 @@ func main() { deps.CollectionService = collectionService collectionSyncScheduler = catalog.NewCollectionSyncScheduler(collectionRepo, collectionService, slog.Default()) + // The trending refresher reuses the section repo (to find used source/ + // window combos), a snapshot repo, an item repo (external-ID matching), + // and the TMDB fetcher. The Trakt fetcher needs settingsRepo and is + // propagated onto deps.TrendingRefresher later in router.go. + trendingRefresher = sections.NewTrendingRefresher( + sectionRepo, + sections.NewTrendingSnapshotRepository(pool), + catalog.NewItemRepository(deps.DB), + collectionService.TMDBCollections, + collectionService.TraktCollections, + ) + deps.TrendingRefresher = trendingRefresher + if deps.UserStoreProvider != nil { userSync := usercollections.NewService(deps.UserStoreProvider, collItemRepo, libraryItemRepo, nil, slog.Default()) userSync.TMDBCollections = collectionService.TMDBCollections @@ -1287,6 +1301,9 @@ func main() { if collectionSyncScheduler != nil { taskMgr.Register(tasks.NewSyncCollectionsTask(collectionSyncScheduler)) } + if trendingRefresher != nil { + taskMgr.Register(tasks.NewRefreshTrendingDiscoverTask(trendingRefresher)) + } if userCollectionScheduler != nil { taskMgr.Register(tasks.NewSyncUserCollectionsTask(userCollectionScheduler)) } diff --git a/internal/api/router.go b/internal/api/router.go index 9125eedf..9888ea68 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -141,6 +141,11 @@ type Dependencies struct { UserCollectionSync *usercollections.Service UserCollectionScheduler *usercollections.Scheduler + // TrendingRefresher refreshes the persisted trending_discover snapshots. + // Built in main.go with TMDB wired; its Trakt fetcher is propagated here in + // router.go once the Trakt adapter exists (mirrors UserCollectionSync). + TrendingRefresher *sections.TrendingRefresher + // MDBListClient is used by user-facing list discovery endpoints // (search/top). May be nil; the handlers report "not configured" in // that case rather than failing. @@ -878,11 +883,17 @@ func NewRouter(deps Dependencies) chi.Router { } } - // Wire external-trending fetchers into the section fetcher so the - // trending_discover home section can pull TMDB/Trakt trending. - sectionFetcher.ItemRepo = itemRepo - sectionFetcher.TMDBTrending = libraryCollectionService.TMDBCollections - sectionFetcher.TraktTrending = libraryCollectionService.TraktCollections + // Propagate the now-wired Trakt fetcher to the trending refresher (built + // in main.go with TMDB only, before the Trakt adapter existed). + if deps.TrendingRefresher != nil && deps.TrendingRefresher.TraktTrending == nil { + deps.TrendingRefresher.TraktTrending = libraryCollectionService.TraktCollections + } + + // Wire the trending snapshot reader into the section fetcher. The + // trending_discover home section reads its list from the persisted + // snapshot table; the upstream fetch happens out-of-band in the refresh + // task, so the read path never calls the provider. + sectionFetcher.TrendingSnapshots = sections.NewTrendingSnapshotRepository(deps.DB) libraryCollectionHandler = handlers.NewLibraryCollectionHandler( libraryCollectionRepo,