ticket-pimp/cmd/main.go

113 lines
2.4 KiB
Go

package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"ticket-pimp/internal/controller"
"ticket-pimp/internal/domain"
"ticket-pimp/internal/services"
"ticket-pimp/client/discord"
"ticket-pimp/client/telegram"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/jackc/pgx/v5/stdlib"
migrate "github.com/rubenv/sql-migrate"
)
const (
envfile = "prod.env"
migrationfile = "../internal/storage/migrate"
// production env:
// envfile = "../docker/prod.env"
// migrationfile = "../internal/storage/migrate"
)
func main() {
log.Print("started")
config := domain.InitConfig(envfile)
run(config)
}
func run(conf domain.Config) {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill, syscall.SIGTERM)
defer cancel()
// -- DB connection init -- START
connString := fmt.Sprintf(
"postgresql://%s:%s@%s:%s/%s",
conf.DB.User, conf.DB.Pass, conf.DB.Host, conf.DB.Port, conf.DB.Name,
)
conn, err := pgxpool.New(
ctx,
connString)
if err != nil {
log.Fatalf("DB connection failed: %v", err)
}
// -- DB connection init -- END
// Aply migrations:
dbConnConfig, err := pgxpool.ParseConfig(connString)
if err != nil {
log.Fatalf("unable to parse connString: %v", err)
}
migrations := &migrate.FileMigrationSource{
Dir: migrationfile,
}
db := stdlib.OpenDB(*dbConnConfig.ConnConfig)
const dialect = "postgres"
n, err := migrate.Exec(db, dialect, migrations, migrate.Up)
if err != nil {
log.Fatalf("unable to handle migrations: %v", err)
}
fmt.Printf("Applied %d migrations!\n", n)
db.Close()
//
gitService := services.NewGit(conf.Git)
cloudService := services.NewCloud(conf.Cloud)
codaService := services.NewCodaClient(conf.Coda)
// Инициализация контроллера:
controller := controller.NewWorkflowController(
gitService,
cloudService,
codaService,
conn,
)
go func() {
opts := discord.DiscordOptions{
Controller: controller,
Config: &conf,
}
if err := discord.Run(conf, opts); err != nil {
log.Fatalf("discord bot cannot be runned: %v", err)
}
}()
opts := telegram.TelegramOptions{
GitService: gitService,
CloudService: cloudService,
Coda: codaService,
AppConfig: &conf,
Controller: controller,
}
if err := telegram.Run(ctx, opts); err != nil {
log.Fatalf("telegram bot cannot be runned: %v", err)
defer os.Exit(1)
}
}