119 lines
3.2 KiB
Go
119 lines
3.2 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/paramah/ai_devs4/s01e02/internal/domain"
|
|
)
|
|
|
|
// ProcessPersonsUseCase handles the processing of persons
|
|
type ProcessPersonsUseCase struct {
|
|
personRepo domain.PersonRepository
|
|
apiClient domain.APIClient
|
|
apiKey string
|
|
outputDir string
|
|
}
|
|
|
|
// NewProcessPersonsUseCase creates a new use case instance
|
|
func NewProcessPersonsUseCase(
|
|
personRepo domain.PersonRepository,
|
|
apiClient domain.APIClient,
|
|
apiKey string,
|
|
outputDir string,
|
|
) *ProcessPersonsUseCase {
|
|
return &ProcessPersonsUseCase{
|
|
personRepo: personRepo,
|
|
apiClient: apiClient,
|
|
apiKey: apiKey,
|
|
outputDir: outputDir,
|
|
}
|
|
}
|
|
|
|
// Execute processes all persons from the input file
|
|
func (uc *ProcessPersonsUseCase) Execute(ctx context.Context, inputFile string) error {
|
|
// Load persons from file
|
|
log.Printf("Loading persons from: %s", inputFile)
|
|
persons, err := uc.personRepo.LoadPersons(ctx, inputFile)
|
|
if err != nil {
|
|
return fmt.Errorf("loading persons: %w", err)
|
|
}
|
|
log.Printf("Loaded %d persons", len(persons))
|
|
|
|
// Process each person
|
|
for i, person := range persons {
|
|
log.Printf("\n[%d/%d] Processing: %s %s", i+1, len(persons), person.Name, person.Surname)
|
|
|
|
// Get location information
|
|
if err := uc.processLocation(ctx, person); err != nil {
|
|
log.Printf("Error getting location for %s %s: %v", person.Name, person.Surname, err)
|
|
continue
|
|
}
|
|
|
|
// Get access level information
|
|
if err := uc.processAccessLevel(ctx, person); err != nil {
|
|
log.Printf("Error getting access level for %s %s: %v", person.Name, person.Surname, err)
|
|
continue
|
|
}
|
|
}
|
|
|
|
log.Printf("\nProcessing completed!")
|
|
return nil
|
|
}
|
|
|
|
// processLocation gets and saves location information for a person
|
|
func (uc *ProcessPersonsUseCase) processLocation(ctx context.Context, person domain.Person) error {
|
|
req := domain.LocationRequest{
|
|
APIKey: uc.apiKey,
|
|
Name: person.Name,
|
|
Surname: person.Surname,
|
|
}
|
|
|
|
log.Printf(" → Getting location...")
|
|
response, err := uc.apiClient.GetLocation(ctx, req)
|
|
if err != nil {
|
|
return fmt.Errorf("getting location: %w", err)
|
|
}
|
|
|
|
// Save to file
|
|
fileName := fmt.Sprintf("%s_%s.json", person.Name, person.Surname)
|
|
filePath := filepath.Join(uc.outputDir, "locations", fileName)
|
|
|
|
if err := os.WriteFile(filePath, response, 0644); err != nil {
|
|
return fmt.Errorf("saving location response: %w", err)
|
|
}
|
|
|
|
log.Printf(" ✓ Location saved to: %s", filePath)
|
|
return nil
|
|
}
|
|
|
|
// processAccessLevel gets and saves access level information for a person
|
|
func (uc *ProcessPersonsUseCase) processAccessLevel(ctx context.Context, person domain.Person) error {
|
|
req := domain.AccessLevelRequest{
|
|
APIKey: uc.apiKey,
|
|
Name: person.Name,
|
|
Surname: person.Surname,
|
|
BirthYear: person.Born,
|
|
}
|
|
|
|
log.Printf(" → Getting access level...")
|
|
response, err := uc.apiClient.GetAccessLevel(ctx, req)
|
|
if err != nil {
|
|
return fmt.Errorf("getting access level: %w", err)
|
|
}
|
|
|
|
// Save to file
|
|
fileName := fmt.Sprintf("%s_%s.json", person.Name, person.Surname)
|
|
filePath := filepath.Join(uc.outputDir, "accesslevel", fileName)
|
|
|
|
if err := os.WriteFile(filePath, response, 0644); err != nil {
|
|
return fmt.Errorf("saving access level response: %w", err)
|
|
}
|
|
|
|
log.Printf(" ✓ Access level saved to: %s", filePath)
|
|
return nil
|
|
}
|