package main import ( "context" "fmt" "os" "os/signal" "syscall" "go.uber.org/zap" "go.uber.org/zap/zapcore" "penahub.gitlab.yandexcloud.net/backend/templategen/amo" "penahub.gitlab.yandexcloud.net/backend/templategen/dal" "penahub.gitlab.yandexcloud.net/backend/templategen/gdisk" "penahub.gitlab.yandexcloud.net/backend/templategen/yadisk" "penahub.gitlab.yandexcloud.net/backend/templategenworker/worker" ) type Env struct { Domain string `env:"DOMAIN" default:"tempgen.pena.digital"` LogFile string `env:"LOG_FILE" default:"./tmp/logs.log"` MongoURL string `env:"MONGO_URL" default:"mongodb://mongo1:30001,mongo2:30002,mongo3:30003/?replicaSet=penahub-rs"` DBName string `env:"DB_NAME" default:"templategen"` YaDiskClientID string `env:"YADISK_CLIENT_ID" default:"94482c181e5148c096ae6ad3b2a981ea"` YaDiskClientSecret string `env:"YADISK_CLIENT_SECRET" default:"7dc4f541c3f64f4a9078e59d7494d222"` GDiskCredentials string `env:"GDISK_CREDENTIALS" default:"./static/gdisk-credentials.json"` AmoClientID string `env:"AMO_CLIENT_ID" default:"6c7f3fdb-cce7-4fb0-a8a3-640b695c8d00"` AmoClientSecret string `env:"AMO_CLIENT_SECRET" default:"5oJU1L8pScLKfEasShJ6KuDU32VrIs6BVKQ6BiY4vABIQycUWJziULytiUs5jaZU"` AmoRedirectUrn string `env:"AMO_REDIRECT_URN" default:"/settings/widgets/penagen/"` } func GetOpts() Env { return getEnv(Env{}) } func main() { opts := GetOpts() ctx, cancel := context.WithCancel(context.Background()) // Logger cfgLogger := zap.NewDevelopmentConfig() cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder cfgLogger.EncoderConfig.ConsoleSeparator = " " logger, err := cfgLogger.Build() logger.Info("OPTIONS", zap.Any("ENV", opts)) if err != nil { panic(err) } // Start Data Access Layer mongoDal, err := dal.InitMongoDAL(ctx, opts.MongoURL, opts.DBName, logger) defer mongoDal.Disconnect() if err != nil { logger.Error("ErrorConnectToDAL", zap.Error(err)) return } // Yandex Disk yaDisk := yadisk.NewClientApp( opts.YaDiskClientID, opts.YaDiskClientSecret, fmt.Sprintf("https://%v/yadisk", opts.Domain), fmt.Sprintf("https://%v", opts.Domain), ) // Google Drive gDisk, err := gdisk.NewClientApp(opts.GDiskCredentials) if err != nil { logger.Error("ErrorCreateGoogleDriveClientApp:", zap.Error(err)) return } // Amo amoApp := amo.NewClientApp( opts.AmoClientID, opts.AmoClientSecret, fmt.Sprintf("https://%v/amo", opts.Domain)) // Start supervisor worker supervisorDeps := worker.SuperVisorDeps{ Dal: mongoDal, YaDisk: yaDisk, GDisk: gDisk, Amo: amoApp, Logger: logger, } supervisor, err := worker.NewSuperVisor(supervisorDeps) if err != nil { logger.Error("ErrorCreateSuperVisor", zap.Error(err)) return } defer supervisor.Stop() supervisor.Start(ctx) // Graceful Shutdown interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) killSignal := <-interrupt switch killSignal { case os.Interrupt: logger.Error("AppInterrupted") return case syscall.SIGTERM: logger.Error("AppTerminated") return } defer cancel() }