57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
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
|
|
}
|