// Package staff provides university staff and publication crawling functionality package staff import ( "context" "log" "time" "github.com/google/uuid" "github.com/breakpilot/edu-search-service/internal/database" "github.com/breakpilot/edu-search-service/internal/orchestrator" ) // PublicationOrchestratorAdapter adapts publication crawling to the orchestrator interface // Note: This is a stub for now - publication crawling is a future feature type PublicationOrchestratorAdapter struct { repo *database.Repository } // NewPublicationOrchestratorAdapter creates a new publication crawler adapter func NewPublicationOrchestratorAdapter(repo *database.Repository) *PublicationOrchestratorAdapter { return &PublicationOrchestratorAdapter{ repo: repo, } } // CrawlPublicationsForUniversity crawls publications for all staff at a university // This is Phase 4: Publication discovery (future implementation) func (a *PublicationOrchestratorAdapter) CrawlPublicationsForUniversity(ctx context.Context, universityID uuid.UUID) (*orchestrator.CrawlProgress, error) { start := time.Now() progress := &orchestrator.CrawlProgress{ Phase: orchestrator.PhasePublications, StartedAt: start, } log.Printf("[PublicationAdapter] Publications phase for university %s", universityID) // Get staff members for this university staffList, err := a.repo.SearchStaff(ctx, database.StaffSearchParams{ UniversityID: &universityID, Limit: 10000, }) if err != nil { progress.Errors = append(progress.Errors, err.Error()) return progress, err } log.Printf("[PublicationAdapter] Found %d staff members for publication crawling", staffList.Total) // TODO: Implement actual publication crawling // - For each staff member with ORCID/Google Scholar ID: // - Fetch publications from ORCID API // - Fetch publications from Google Scholar // - Match and deduplicate // - Store in database // // For now, we mark this phase as complete (no-op) pubCount := 0 // Count existing publications for this university for _, staff := range staffList.Staff { pubs, err := a.repo.GetStaffPublications(ctx, staff.ID) if err == nil { pubCount += len(pubs) } } progress.ItemsFound = pubCount progress.ItemsProcessed = staffList.Total now := time.Now() progress.CompletedAt = &now log.Printf("[PublicationAdapter] Publications phase completed for university %s: %d existing publications found", universityID, pubCount) return progress, nil }