Initial commit
Build & Push / build (push) Canceled after 0s

This commit is contained in:
2026-08-05 19:31:35 +03:00
commit a33fa24e99
272 changed files with 40566 additions and 0 deletions
@@ -0,0 +1,85 @@
package worker
import (
"context"
"sync"
"time"
"github.com/rs/zerolog/log"
"github.com/TelegramExchange/tgex-backend/tg_parser/internal/usecase"
)
type ChannelConfig struct {
MaxWorkers int `envconfig:"WORKER__MAX_WORKERS" default:"1"`
ChannelDelay time.Duration `envconfig:"WORKER__CHANNEL_DELAY" default:"500ms"`
RequestTimeout time.Duration `envconfig:"WORKER__REQUEST_TIMEOUT" default:"10s"`
MessagesLimit int `envconfig:"WORKER__MESSAGES_LIMIT" default:"20"`
PollInterval time.Duration `envconfig:"WORKER__POLL_INTERVAL" default:"120s"`
}
type ChannelWorker struct {
usecase *usecase.UseCase
config ChannelConfig
stop chan struct{}
done chan struct{}
}
func NewChannelWorker(uc *usecase.UseCase, cfg ChannelConfig) *ChannelWorker {
w := &ChannelWorker{
usecase: uc,
config: cfg,
stop: make(chan struct{}),
done: make(chan struct{}),
}
go w.run()
return w
}
func (w *ChannelWorker) run() {
log.Info().Msg("channel worker: started")
var wg sync.WaitGroup
wg.Add(w.config.MaxWorkers)
for range w.config.MaxWorkers {
go w.spawnWorker(&wg)
}
wg.Wait()
log.Info().Msg("channel worker: stopped")
close(w.done)
}
func (w *ChannelWorker) spawnWorker(wg *sync.WaitGroup) {
defer wg.Done()
limiter := time.NewTicker(w.config.ChannelDelay)
defer limiter.Stop()
poll := time.NewTicker(w.config.PollInterval)
defer poll.Stop()
for {
select {
case <-w.stop:
return
case <-poll.C:
err := w.usecase.FetchChannels(context.Background())
if err != nil {
log.Error().Err(err).Msg("usecase.FetchChannels error")
}
}
}
}
func (w *ChannelWorker) Stop() {
close(w.stop)
<-w.done
}
@@ -0,0 +1,65 @@
package worker
import (
"context"
"time"
"github.com/rs/zerolog/log"
"github.com/TelegramExchange/tgex-backend/tg_parser/internal/usecase"
)
type ViewsConfig struct {
Interval time.Duration `envconfig:"WORKER__VIEWS_INTERVAL" default:"1800s"`
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
}