package main import ( "fmt" "git.sch9.ru/new_gate/ms-tester/config" contestsDelivery "git.sch9.ru/new_gate/ms-tester/internal/contests/delivery/grpc" contestsRepository "git.sch9.ru/new_gate/ms-tester/internal/contests/repository" contestsUseCase "git.sch9.ru/new_gate/ms-tester/internal/contests/usecase" problemsDelivery "git.sch9.ru/new_gate/ms-tester/internal/problems/delivery/grpc" problemsSub "git.sch9.ru/new_gate/ms-tester/internal/problems/delivery/rabbitmq" problemsRepository "git.sch9.ru/new_gate/ms-tester/internal/problems/repository" problemsUseCase "git.sch9.ru/new_gate/ms-tester/internal/problems/usecase" testerDelivery "git.sch9.ru/new_gate/ms-tester/internal/tester/delivery/grpc" testerPubSub "git.sch9.ru/new_gate/ms-tester/internal/tester/delivery/rabbitmq" testerUseCase "git.sch9.ru/new_gate/ms-tester/internal/tester/usecase" "git.sch9.ru/new_gate/ms-tester/pkg/external/pandoc" "git.sch9.ru/new_gate/ms-tester/pkg/external/postgres" "git.sch9.ru/new_gate/ms-tester/pkg/external/rabbitmq" "github.com/ilyakaznacheev/cleanenv" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/reflection" "net" "net/http" "os" "os/signal" "syscall" ) func main() { var cfg config.Config err := cleanenv.ReadConfig(".env", &cfg) if err != nil { panic(fmt.Sprintf("error reading config: %s", err.Error())) } var logger *zap.Logger if cfg.Env == "prod" { logger = zap.Must(zap.NewProduction()) } else if cfg.Env == "dev" { logger = zap.Must(zap.NewDevelopment()) } else { panic(fmt.Sprintf(`error reading config: env expected "prod" or "dev", got "%s"`, cfg.Env)) } db, err := postgres.NewPostgresDB(cfg.PostgresDSN) if err != nil { panic(err) } defer db.Close() pandocClient := pandoc.NewPandocClient(&http.Client{}, cfg.Pandoc) problemRepo := problemsRepository.NewProblemRepository(db, logger) problemUC := problemsUseCase.NewProblemUseCase(problemRepo, pandocClient) contestRepo := contestsRepository.NewContestRepository(db, logger) contestUC := contestsUseCase.NewContestUseCase(contestRepo) testerUC := testerUseCase.NewTesterUseCase() conn, err := rabbitmq.NewRabbitClient(cfg.RabbitDSN) if err != nil { panic(err) } defer conn.Close() ch, err := conn.Channel() if err != nil { panic(err) } defer ch.Close() err = ch.Qos( 1, 0, true, ) if err != nil { panic(err) } problemsSub.NewNotificationSubscriber(ch, cfg.NQueueName, cfg.InstanceName, problemUC) testerPubSub.NewTesterProducer(ch, cfg.TQueueName, cfg.RQueueName, testerUC) testerPubSub.NewTesterConsumer(ch, cfg.RQueueName, cfg.InstanceName, testerUC) gserver := grpc.NewServer() defer gserver.GracefulStop() problemsDelivery.NewProblemHandlers(gserver, problemUC) contestsDelivery.NewContestHandlers(gserver, contestUC) testerDelivery.NewTesterHandlers(gserver, testerUC) reflection.Register(gserver) ln, err := net.Listen("tcp", cfg.Address) if err != nil { panic(err) } go func() { if err = gserver.Serve(ln); err != nil { panic(err) } }() fmt.Println("server started") stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT) <-stop }