aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/leader/manager/manager.go
blob: 61e27e0501bfaa7cac6cadb638dfb8b2aca5b7ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package manager

import (
	"context"
	"fmt"
	"log/slog"
	"sync"

	"github.com/ansg191/ibd-trader-backend/internal/config"
	"github.com/ansg191/ibd-trader-backend/internal/database"
	"github.com/ansg191/ibd-trader-backend/internal/ibd"
	"github.com/ansg191/ibd-trader-backend/internal/leader/manager/ibd/auth"
	ibd2 "github.com/ansg191/ibd-trader-backend/internal/leader/manager/ibd/scrape"

	"github.com/redis/go-redis/v9"
	"github.com/robfig/cron/v3"
)

type Manager struct {
	db      database.Database
	Monitor *WorkerMonitor
	Scraper *ibd2.Manager
	Auth    *auth.Manager
}

func New(
	ctx context.Context,
	cfg *config.Config,
	client *redis.Client,
	db database.Database,
	ibd *ibd.Client,
) (*Manager, error) {
	scraperSchedule, err := cron.ParseStandard(cfg.IBD.Schedules.IBD50)
	if err != nil {
		return nil, fmt.Errorf("unable to parse IBD50 schedule: %w", err)
	}
	scraper, err := ibd2.New(ctx, ibd, db, client, scraperSchedule)
	if err != nil {
		return nil, err
	}

	authSchedule, err := cron.ParseStandard(cfg.IBD.Schedules.Auth)
	if err != nil {
		return nil, fmt.Errorf("unable to parse Auth schedule: %w", err)
	}
	authManager, err := auth.New(ctx, db, client, authSchedule)
	if err != nil {
		return nil, err
	}

	return &Manager{
		db:      db,
		Monitor: NewWorkerMonitor(client),
		Scraper: scraper,
		Auth:    authManager,
	}, nil
}

func (m *Manager) Run(ctx context.Context) error {
	if err := m.db.Migrate(ctx); err != nil {
		slog.ErrorContext(ctx, "Unable to migrate database", "error", err)
		return err
	}

	var wg sync.WaitGroup
	wg.Add(4)

	go func() {
		defer wg.Done()
		m.db.Maintenance(ctx)
	}()

	go func() {
		defer wg.Done()
		m.Monitor.Start(ctx)
	}()

	go func() {
		defer wg.Done()
		m.Scraper.Run(ctx)
	}()

	go func() {
		defer wg.Done()
		m.Auth.Run(ctx)
	}()

	wg.Wait()
	return ctx.Err()
}