package app import ( "context" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" "github.com/themakers/hlog" "go.uber.org/zap" "go.uber.org/zap/zapcore" mongo "penahub.gitlab.yandexcloud.net/backend/penahub_common/mongo" "penahub.gitlab.yandexcloud.net/backend/verification/internal/client" "penahub.gitlab.yandexcloud.net/backend/verification/internal/config" "penahub.gitlab.yandexcloud.net/backend/verification/internal/initialize" "penahub.gitlab.yandexcloud.net/backend/verification/internal/models" "penahub.gitlab.yandexcloud.net/backend/verification/internal/server" "penahub.gitlab.yandexcloud.net/external/trashlog.git/app" "penahub.gitlab.yandexcloud.net/external/trashlog.git/wrappers/zaptrashlog" "penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/customer_clients" "time" ) type Build struct { Commit string Version string BuildTime int64 } func Run(cfg *config.Config, build Build) { cfgLogger := zap.NewDevelopmentConfig() cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder cfgLogger.EncoderConfig.ConsoleSeparator = " " logger, err := cfgLogger.Build() if err != nil { panic(err) } logger.Info("RUN", zap.Any("ENV", cfg)) ctx := context.Background() clickHouseLogger, err := zaptrashlog.NewCore(ctx, zap.InfoLevel, cfg.TrashLogHost, build.Version, build.Commit, build.BuildTime) if err != nil { panic(err) } loggerForHlog := logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core { return zapcore.NewTee(core, clickHouseLogger) })) loggerHlog := hlog.New(loggerForHlog).Module(cfg.ModuleLogger) loggerHlog.With(models.AllFields{}) loggerHlog.Emit(app.InfoSvcStarted{}) mongoDB, err := mongo.Connect(ctx, &mongo.ConnectDeps{ Configuration: &mongo.Configuration{ Host: cfg.MongoHost, Port: cfg.MongoPort, User: cfg.MongoUser, Password: cfg.MongoPassword, Auth: cfg.MongoAuth, DatabaseName: cfg.DatabaseName, }, Timeout: 5 * time.Second, }) if err != nil { logger.Fatal("MongoClient", zap.Error(err)) } minioClient, err := minio.New(cfg.S3Endpoint, &minio.Options{ Creds: credentials.NewStaticV4(cfg.S3AccessKeyID, cfg.S3SecretKey, ""), Secure: true, }) if err != nil { logger.Fatal("MinioClient", zap.Error(err)) } reps, err := initialize.NewRepositories(ctx, logger, mongoDB, minioClient, cfg.S3Folder, cfg.S3FileUrl) if err != nil { logger.Fatal("Repositories", zap.Error(err)) } tgBot, err := tgbotapi.NewBotAPI(cfg.TelegramToken) if err != nil { logger.Fatal("TelegramBotApi", zap.Error(err)) } telegram := client.NewTelegram(client.Deps{ Logger: logger, Bot: tgBot, ChatID: cfg.TelegramChannelID, StagingURL: cfg.StagingURL, }) cons := initialize.NewControllers(reps, telegram, customer_clients.NewCustomersClient(customer_clients.CustomersClientDeps{ Logger: logger, CustomerServiceHost: cfg.CustomerRPCHost, })) userSrv := server.NewHTTP(server.ServerConfig{ Logger: logger, Controllers: []server.Controller{cons.VerificationUser}, HLogger: loggerHlog, }) adminSrv := server.NewHTTP(server.ServerConfig{ Logger: logger, Controllers: []server.Controller{cons.VerificationAdmin}, HLogger: loggerHlog, }) go func() { if err := userSrv.Start(cfg.HttpAddressUser); err != nil { logger.Fatal("Server startup error", zap.Error(err)) } }() go func() { if err := adminSrv.Start(cfg.HttpAddressAdmin); err != nil { logger.Fatal("Server startup error", zap.Error(err)) } }() gracefulShutdown(ctx, logger, []*server.Server{userSrv, adminSrv}, mongoDB) }