Yimaru-BackEnd/internal/services/currency/worker.go

56 lines
1.2 KiB
Go

package currency
import (
"context"
"fmt"
"log/slog"
"time"
"github.com/SamuelTariku/FortuneBet-Backend/internal/config"
"github.com/go-co-op/gocron"
)
type ExchangeRateWorker struct {
fetcherService *FixerFetcher
scheduler *gocron.Scheduler
logger *slog.Logger
cfg *config.Config
}
func NewExchangeRateWorker(
fetcherService *FixerFetcher, logger *slog.Logger, cfg *config.Config,
) *ExchangeRateWorker {
return &ExchangeRateWorker{
fetcherService: fetcherService,
scheduler: gocron.NewScheduler(time.UTC),
logger: logger,
cfg: cfg,
}
}
func (w *ExchangeRateWorker) Start(ctx context.Context) {
_, err := w.scheduler.Every(6).Hours().Do(w.RunUpdate)
if err != nil {
return
}
// Run immediately on startup
go w.RunUpdate()
w.scheduler.StartAsync()
}
func (w *ExchangeRateWorker) RunUpdate() {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if _, err := w.fetcherService.FetchLatestRates(ctx, w.cfg.BASE_CURRENCY); err != nil {
fmt.Println("Exchange rate update failed", "error", err)
}
}
func (w *ExchangeRateWorker) Stop() {
w.scheduler.Stop()
w.logger.Info("Exchange rate worker stopped")
}