57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
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 IndexerService struct {
|
|
indexer Indexer
|
|
}
|
|
|
|
func NewIndexerService(cfg config.Config, riverClient *river.Client[pgx.Tx]) (*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)
|
|
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
|
|
}
|