package service import ( "context" "fmt" "git.threesix.ai/jordan/sp2-verify-1770324794/pkg/logging" "git.threesix.ai/jordan/sp2-verify-1770324794/pkg/redisqueue" "git.threesix.ai/jordan/sp2-verify-1770324794/services/api/internal/port" ) // JobService handles job-related business logic. type JobService struct { queue port.JobQueue logger *logging.Logger } // NewJobService creates a new job service. func NewJobService(queue port.JobQueue, logger *logging.Logger) *JobService { return &JobService{ queue: queue, logger: logger.WithService("JobService"), } } // CreateInput contains the data needed to create a job. type CreateJobInput struct { Type string Payload map[string]any } // Create creates a new async job. // Returns an error if the job type is empty. func (s *JobService) Create(ctx context.Context, input CreateJobInput) (*redisqueue.Job, error) { if input.Type == "" { return nil, fmt.Errorf("job type is required") } job, err := s.queue.Enqueue(ctx, input.Type, input.Payload) if err != nil { return nil, err } s.logger.Info("job created", "job_id", job.ID, "type", job.Type) return job, nil } // Get retrieves a job by ID. // Returns redisqueue.ErrJobNotFound if the job doesn't exist. func (s *JobService) Get(ctx context.Context, jobID string) (*redisqueue.Job, error) { return s.queue.GetJob(ctx, jobID) }