This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
backend/main.go

97 lines
2.2 KiB
Go

package main
import (
"context"
"net/http"
"os"
"os/signal"
"time"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/db"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"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 := setupRouter()
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)
}
func setupRouter() *gin.Engine {
router := gin.New()
router.Use(middleware.Logger(logrus.WithField("hostname", "api")), gin.Recovery())
if mode.Get() == mode.DevelopmentMode {
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true
},
AllowCredentials: true,
ExposeHeaders: []string{"Authorization"},
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
AllowWebSockets: false,
}))
}
return router
}