package main import ( "context" "log/slog" "net/http" "os" "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" "github.com/vasyansk/imap-copier/internal/config" "github.com/vasyansk/imap-copier/internal/httpapi" "github.com/vasyansk/imap-copier/internal/orchestrator" "github.com/vasyansk/imap-copier/internal/store" "github.com/vasyansk/imap-copier/internal/wshub" ) func main() { slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil))) cfg, err := config.Load() if err != nil { slog.Error("config", "err", err) os.Exit(1) } if err := runMigrations(cfg.DatabaseURL); err != nil { slog.Error("migrate", "err", err) os.Exit(1) } st, err := store.New(context.Background(), cfg.DatabaseURL) if err != nil { slog.Error("store", "err", err) os.Exit(1) } hub := wshub.New() orch := orchestrator.New(st, hub, cfg.EncKey, cfg.WorkerConcurrency) srv := httpapi.NewServer(cfg, st, orch, hub) slog.Info("listening", "addr", cfg.HTTPAddr) if err := http.ListenAndServe(cfg.HTTPAddr, srv.Router()); err != nil { slog.Error("serve", "err", err) os.Exit(1) } } func runMigrations(dsn string) error { m, err := migrate.New("file://migrations", dsn) if err != nil { return err } if err := m.Up(); err != nil && err != migrate.ErrNoChange { return err } return nil }