init
This commit is contained in:
62
internal/service/exchange_rate_scheduler.go
Normal file
62
internal/service/exchange_rate_scheduler.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ExchangeRateScheduler handles scheduled fetching of exchange rates
|
||||
type ExchangeRateScheduler struct {
|
||||
yunAPIClient *YunAPIClient
|
||||
interval time.Duration
|
||||
stopChan chan struct{}
|
||||
}
|
||||
|
||||
// NewExchangeRateScheduler creates a new ExchangeRateScheduler
|
||||
func NewExchangeRateScheduler(yunAPIClient *YunAPIClient, interval time.Duration) *ExchangeRateScheduler {
|
||||
return &ExchangeRateScheduler{
|
||||
yunAPIClient: yunAPIClient,
|
||||
interval: interval,
|
||||
stopChan: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
// Start begins the scheduled fetching of exchange rates
|
||||
// It fetches immediately on start, then every interval
|
||||
func (s *ExchangeRateScheduler) Start(ctx context.Context) {
|
||||
log.Printf("[Scheduler] Starting exchange rate scheduler with interval: %v", s.interval)
|
||||
|
||||
// Fetch immediately on start
|
||||
s.fetchRates()
|
||||
|
||||
// Create ticker for periodic fetching
|
||||
ticker := time.NewTicker(s.interval)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
s.fetchRates()
|
||||
case <-s.stopChan:
|
||||
log.Println("[Scheduler] Exchange rate scheduler stopped")
|
||||
return
|
||||
case <-ctx.Done():
|
||||
log.Println("[Scheduler] Exchange rate scheduler stopped due to context cancellation")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Stop stops the scheduler
|
||||
func (s *ExchangeRateScheduler) Stop() {
|
||||
close(s.stopChan)
|
||||
}
|
||||
|
||||
// fetchRates calls the YunAPI client to fetch and save rates
|
||||
func (s *ExchangeRateScheduler) fetchRates() {
|
||||
log.Println("[Scheduler] Triggering exchange rate fetch...")
|
||||
if err := s.yunAPIClient.FetchAndSaveRates(); err != nil {
|
||||
log.Printf("[Scheduler] Error fetching exchange rates: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user