sp2-verify-1770324794/services/api/internal/service/job.go
rdev-worker 154c535204
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature async-jobs --requirements 'API: POST /jobs pushes ...
2026-02-05 21:04:47 +00:00

53 lines
1.3 KiB
Go

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)
}