package main import ( "context" "net/http" "os" "os/signal" "time" "github.com/pkg/errors" "github.com/zdam-egzamin-zawodowy/backend/internal/db" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "github.com/sirupsen/logrus" "github.com/zdam-egzamin-zawodowy/backend/pkg/mode" envutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/env" ) func init() { os.Setenv("TZ", "UTC") if mode.Get() == mode.DevelopmentMode { godotenv.Load(".env.local") } setupLogger() } func main() { _, err := db.New(&db.Config{ DebugHook: envutils.GetenvBool("LOG_DB_QUERIES"), }) if err != nil { logrus.Fatal(errors.Wrap(err, "Error establishing a database connection")) } logrus.Info("Database connection established") router := gin.Default() if mode.Get() == mode.DevelopmentMode { router.Use(cors.New(cors.Config{ AllowOriginFunc: func(string) bool { return true }, AllowCredentials: true, ExposeHeaders: []string{"X-Access-Token", "X-Refresh-Token"}, AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"}, AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"}, AllowWebSockets: false, })) } srv := &http.Server{ Addr: ":8080", Handler: router, } go func() { // service connections if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { logrus.Fatalf("listen: %s\n", err) } }() quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit logrus.Info("Shutdown Server ...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { logrus.Fatal("Server Shutdown:", err) } logrus.Info("Server exiting") } func setupLogger() { if mode.Get() == mode.DevelopmentMode { logrus.SetLevel(logrus.DebugLevel) } customFormatter := new(logrus.TextFormatter) customFormatter.TimestampFormat = "2006-01-02 15:04:05" customFormatter.FullTimestamp = true logrus.SetFormatter(customFormatter) }