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, query string, page, pageSize int, filters domain.SearchFilters) (*domain.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, query string, page, pageSize int, filters domain.SearchFilters) (*domain.SearchResults, error) { // For now, this is a mock implementation that returns empty results. // TODO: Implement the actual search logic. return &domain.SearchResults{ Works: []domain.Work{}, Translations: []domain.Translation{}, Authors: []domain.Author{}, Total: 0, }, nil } 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 }