package onboarding import ( "context" "data-terminal-cloud/internal/outbox" "encoding/json" "github.com/google/uuid" "time" ) // Recover durable jobs after an outbox retry budget was exhausted during a // pause. ProcessActivation owns the device lock and the no-repeat fence. func (s *Service) RunMaintenance(ctx context.Context) { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { if err := s.MaintainOnce(ctx); err != nil && ctx.Err() == nil { s.options.Logger.Error("onboarding recovery scan failed") } select { case <-ctx.Done(): return case <-ticker.C: } } } func (s *Service) MaintainOnce(ctx context.Context) error { rows, err := s.pool.Query(ctx, `SELECT j.device_id::text,j.id::text,j.binding_generation FROM device_activation_job j JOIN device d ON d.id=j.device_id JOIN device_binding b ON b.device_id=d.id AND b.unbound_at IS NULL AND b.generation=j.binding_generation WHERE d.status='registered' AND d.activation_state NOT IN ('LOST','REVOKED') AND j.binding_generation=d.binding_generation AND j.updated_at