package worker import ( "context" "time" "github.com/rs/zerolog/log" "github.com/TelegramExchange/tgex-parser/internal/usecase" ) type ViewsConfig struct { Interval time.Duration `envconfig:"WORKER__VIEWS_INTERVAL" default:"30s"` RequestTimeout time.Duration `envconfig:"WORKER__REQUEST_TIMEOUT" default:"10s"` } type ViewsWorker struct { usecase *usecase.UseCase config ViewsConfig stop chan struct{} done chan struct{} } func NewViewsWorker(uc *usecase.UseCase, cfg ViewsConfig) *ViewsWorker { w := &ViewsWorker{ usecase: uc, config: cfg, stop: make(chan struct{}), done: make(chan struct{}), } go w.run() return w } func (w *ViewsWorker) run() { log.Info().Msg("views worker: started") for { select { case <-w.stop: log.Info().Msg("views worker: stopped") close(w.done) return case <-time.After(w.config.Interval): log.Debug().Dur("interval", w.config.Interval).Msg("views worker: refresh tick") ctx, cancel := context.WithTimeout(context.Background(), w.config.RequestTimeout) err := w.usecase.FetchViews(ctx) if err != nil { log.Error().Err(err).Msg("views worker: FetchViews error") } else { log.Debug().Msg("views worker: refresh finished") } cancel() } } } func (w *ViewsWorker) Stop() { close(w.stop) <-w.done }