gito/services/core/internal/worker/runner.go
toki 3ed8797b28 feat(m-operation-event-outbox): operation pick task completion and worker fixes
- Move operation pick artifacts to archive
- Fix worker runner with outbox pattern support
- Update storage tests for postgres integration
- Add worker runner tests
2026-06-14 05:18:10 +09:00

74 lines
1.4 KiB
Go

package worker
import (
"context"
"fmt"
"log/slog"
"time"
"git.toki-labs.com/toki/gito/services/core/internal/config"
"git.toki-labs.com/toki/gito/services/core/internal/core"
)
type OperationPicker interface {
PickQueuedOperation(ctx context.Context, now time.Time) (core.Operation, bool, error)
}
type Clock interface {
Now() time.Time
}
type realClock struct{}
func (realClock) Now() time.Time {
return time.Now()
}
type Runner struct {
cfg config.Config
logger *slog.Logger
picker OperationPicker
clock Clock
}
func NewRunner(cfg config.Config, logger *slog.Logger, picker OperationPicker, clock Clock) *Runner {
if clock == nil {
clock = realClock{}
}
return &Runner{
cfg: cfg,
logger: logger,
picker: picker,
clock: clock,
}
}
func (r *Runner) Run() error {
return r.RunOnce(context.Background())
}
func (r *Runner) RunOnce(ctx context.Context) error {
if !r.cfg.WorkerEnabled {
r.logger.Info("worker disabled")
return nil
}
if r.picker == nil {
r.logger.Warn("worker picker not configured")
return nil
}
op, ok, err := r.picker.PickQueuedOperation(ctx, r.clock.Now())
if err != nil {
r.logger.Error("failed to pick operation", "error", err)
return fmt.Errorf("pick operation: %w", err)
}
if !ok {
r.logger.Debug("no pending operation found")
return nil
}
r.logger.Info("picked operation", "operation_id", op.ID, "type", op.Type)
return nil
}