package indexer import ( "fmt" "github.com/jackc/pgx/v5" "github.com/riverqueue/river" "github.com/rs/zerolog/log" pb "homelab.lan/music-agregator/gen/music_agregator/indexer/v1" "homelab.lan/music-agregator/internal/config" ) type Searcher interface { Search(query string, limit int32, indexer string) (*SearchResponse, error) } type IndexerService struct { indexer Indexer } func NewIndexerService(cfg config.Config, riverClient *river.Client[pgx.Tx], cacheWorker *CacheRefreshWorker) (*IndexerService, error) { var idx Indexer switch cfg.Indexer.Type { case config.IndexerTypeJackett: idx = NewIndexer(cfg) default: return nil, fmt.Errorf("unable to create the indexer for type: %v", cfg.Indexer.Type) } if cfg.Indexer.Cache.Enabled && riverClient != nil { cache := NewIndexerCache() idx = NewCachedIndexer(idx, cache, riverClient, cfg.Indexer.Cache) if cacheWorker != nil { cacheWorker.Cache = cache cacheWorker.Indexer = idx } log.Info().Dur("ttl", cfg.Indexer.Cache.TTL).Dur("refresh", cfg.Indexer.Cache.RefreshInterval).Msg("indexer cache enabled") } return &IndexerService{indexer: idx}, nil } func (service *IndexerService) Search(query string, limit int32, indexer string) (*SearchResponse, error) { searchResult, err := service.indexer.Search(query, limit, indexer) if err != nil { log.Error().Err(err).Msg("failed to search in indexer") return nil, err } log.Trace().Int("raw_items", len(searchResult.Items)).Msg("indexer returned results") return searchResult.ToSearchResponse(), nil } func (service *IndexerService) Capabilities(req *pb.CapabilitiesRequest) (*pb.CapabilitiesResponse, error) { capabilities, err := service.indexer.Capabilities(req.GetIndexer()) if err != nil { log.Error().Err(err).Msg("Failed to get capabilities from indexer") return nil, err } return capabilities.ToProto(), nil }