package search import ( "context" "tercul/internal/app/localization" "tercul/internal/domain" domainsearch "tercul/internal/domain/search" "tercul/internal/platform/log" ) // Service is the application service for searching. type Service interface { Search(ctx context.Context, params domainsearch.SearchParams) (*domainsearch.SearchResults, error) IndexWork(ctx context.Context, work domain.Work) error } type service struct { searchClient domainsearch.SearchClient localization *localization.Service } // NewService creates a new search Service. func NewService(searchClient domainsearch.SearchClient, localization *localization.Service) Service { return &service{ searchClient: searchClient, localization: localization, } } // Search performs a search across all searchable entities. func (s *service) Search(ctx context.Context, params domainsearch.SearchParams) (*domainsearch.SearchResults, error) { return s.searchClient.Search(ctx, params) } func (s *service) IndexWork(ctx context.Context, work domain.Work) error { logger := log.FromContext(ctx).With("work_id", work.ID) logger.Debug("Indexing work") // Get content from translation service content, err := s.localization.Queries.GetWorkContent(ctx, work.ID, work.Language) if err != nil { logger.Error(err, "Failed to get work content for indexing") // We can choose to index without content or return an error. // For now, we'll log the error and continue indexing with empty content. content = "" } err = s.searchClient.IndexWork(ctx, &work, content) if err != nil { logger.Error(err, "Failed to index work in Weaviate") return err } logger.Info("Successfully indexed work") return nil }