package main import ( "amocrm_templategen_back/amo" "amocrm_templategen_back/dal" GDisk "amocrm_templategen_back/gdisk" "amocrm_templategen_back/handlers" "amocrm_templategen_back/middleware" YaDisk "amocrm_templategen_back/yadisk" "context" "fmt" "github.com/gorilla/mux" "go.uber.org/zap" "go.uber.org/zap/zapcore" "log" "net/http" "os" "os/signal" "syscall" ) type Env struct { Domain string `env:"DOMAIN" default:"solweb.site"` LogFile string `env:"LOG_FILE" default:"./tmp/logs.log"` MongoUrl string `env:"MONGO_URL" default:"mongodb+srv://user_1:cEDxC8ptLMMeoA5m@cluster0.aomle.mongodb.net/templategen"` 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:"2fc35b41-f446-4ebb-95cb-b00c55d2f810"` AmoClientSecret string `env:"AMO_CLIENT_SECRET" default:"j1jtyIUPplv5Qd8raBvDP6OvvOp9KA8c2HAtkewQ8MJCaVNvob7piPFIDdjS0aiY"` } func main() { opts := getEnv(Env{}) fmt.Printf("OPTIONS: %+v \r\n", opts) ctx, cancel := context.WithCancel(context.Background()) // Logger cfgLogger := zap.NewDevelopmentConfig() cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder cfgLogger.EncoderConfig.ConsoleSeparator = " " logger, err := cfgLogger.Build() 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.Fatal("ErrorConnectToDAL", zap.Error(err)) } // Yandex Disk yaDisk := YaDisk.NewClientApp( opts.YaDiskClientID, opts.YaDiskClientSecret, fmt.Sprintf("https://%v/yadisk", opts.Domain)) // Google Drive gDisk, err := GDisk.NewClientApp(opts.GDiskCredentials) if err != nil { log.Fatal("ErrorCreateGoogleDriveClientApp:", err) } // Amo amoApp := amo.NewClientApp( opts.AmoClientSecret, opts.AmoClientID, fmt.Sprintf("https://%v/amo", opts.Domain)) // Handlers h := handlers.NewHandlers(mongoDal, yaDisk, gDisk, amoApp, logger) r := mux.NewRouter() // Add Assets fs := http.FileServer(http.Dir("assets")) r.PathPrefix("/assets/").Handler(http.StripPrefix("/assets/", fs)) r.PathPrefix("/tmp/parsed/").Handler(http.StripPrefix("/tmp/parsed/", http.FileServer(http.Dir("tmp/parsed")))) r.PathPrefix("/.well-known/pki-validation/").Handler(http.StripPrefix("/.well-known/pki-validation/", http.FileServer(http.Dir(".well-known/pki-validation")))) r.PathPrefix("/.well-known/acme-challenge/").Handler(http.StripPrefix("/.well-known/acme-challenge/", http.FileServer(http.Dir(".well-known/acme-challenge")))) //# region ====== HANDLERS ====== r.HandleFunc("/", h.IndexPage) r.HandleFunc("/pages/logout", h.LogoutPage) r.HandleFunc("/pages/login", h.LoginPage) r.HandleFunc("/pages/registration", h.RegistrationPage) r.NotFoundHandler = http.HandlerFunc(h.PageNotFound) r.HandleFunc("/amo", h.AmoSaveToken) r.HandleFunc("/amo/settings/getData", h.AmoSettingsGetData) //r.HandleFunc("/amo/saveToken", h.AmoSaveToken) r.HandleFunc("/amo/webhook", h.AmoWebhook) r.HandleFunc("/amo/webhook2", h.AmoWebhook2) r.HandleFunc("/amo/gdisk/getTemplateDir", h.GDiskGetDirTemplate) r.HandleFunc("/amo/getTemplate", h.AmoGetTemplate) r.HandleFunc("/amo/setTemplate", h.AmoSetTemplate) r.HandleFunc("/amo/generateDoc", h.AmoGenerateDoc) r.HandleFunc("/user/registration", h.UserRegistration) r.HandleFunc("/user/login", h.UserLogin) r.HandleFunc("/user/logout", h.UserLogout) r.HandleFunc("/yadisk", h.YaDiskPage) r.HandleFunc("/yadisk/saveToken", h.YaDiskSaveToken) r.HandleFunc("/yadisk/getInfo", h.YaDiskGetInfo) r.HandleFunc("/yadisk/setFolders", h.YaDiskSetFolders) r.HandleFunc("/gdisk", h.GDiskPage) r.HandleFunc("/gdisk/saveToken", h.GDiskSaveToken) r.HandleFunc("/gdisk/getDirInfo", h.GDiskGetDirInfo) r.HandleFunc("/template/new", h.TemplateNew) r.HandleFunc("/template/getById", h.TemplateGetByID) r.HandleFunc("/template/getListByUser", h.TemplateGetListByUser) r.HandleFunc("/template/update", h.TemplateUpdate) r.HandleFunc("/template/delete", h.TemplateDelete) r.HandleFunc("/template/init", h.TemplateInit) //#endregion // Middlewares mw := middleware.InitMiddleware(mongoDal, amoApp, logger) r.Use( mw.MiddlewareHeaders, mw.MiddlewareCors, mw.MiddlewareJwt, mw.MiddlewareAmoJwt, mw.Logger, ) r.NotFoundHandler = r.NewRoute().HandlerFunc(h.PageNotFound).GetHandler() srv := http.Server{ Handler: r, } go func() { err := srv.ListenAndServe() if err != nil { logger.Fatal("CanNotServe", zap.Error(err)) } }() // TLS go func() { err := srv.ListenAndServeTLS("./static/cert/fullchain.pem", "./static/cert/privkey.pem") if err != nil { logger.Fatal("CanNotServe", zap.Error(err)) } }() // Graceful Shutdown interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) killSignal := <-interrupt switch killSignal { case os.Interrupt: logger.Fatal("AppInterrupted") case syscall.SIGTERM: logger.Fatal("AppTerminated") } defer cancel() }