package search import ( "context" "fmt" "tercul/internal/app/localization" "tercul/internal/domain" "tercul/internal/platform/log" "tercul/internal/platform/search" ) // IndexService pushes localized snapshots into Weaviate for search type IndexService interface { IndexWork(ctx context.Context, work domain.Work) error } type indexService struct { localization localization.Service weaviate search.WeaviateWrapper } func NewIndexService(localization localization.Service, weaviate search.WeaviateWrapper) IndexService { return &indexService{localization: localization, weaviate: weaviate} } func (s *indexService) IndexWork(ctx context.Context, work domain.Work) error { log.LogDebug("Indexing work", log.F("work_id", work.ID)) // Choose best content snapshot for indexing content, err := s.localization.GetWorkContent(ctx, work.ID, work.Language) if err != nil { log.LogError("Failed to get work content for indexing", log.F("work_id", work.ID), log.F("error", err)) return err } err = s.weaviate.IndexWork(ctx, &work, content) if err != nil { log.LogError("Failed to index work in Weaviate", log.F("work_id", work.ID), log.F("error", err)) return err } log.LogInfo("Successfully indexed work", log.F("work_id", work.ID)) return nil } func formatID(id uint) string { return fmt.Sprintf("%d", id) }