package router import ( "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" "merch-parser-api/internal/interfaces" "net/http" "time" ) type router struct { apiPrefix string engine *gin.Engine ginMode string tokenProv interfaces.JWTProvider } type Deps struct { ApiPrefix string GinMode string TokenProv interfaces.JWTProvider AllowedOrigins []string } func NewRouter(deps Deps) interfaces.Router { if deps.GinMode == "release" { gin.SetMode(gin.ReleaseMode) } else { gin.SetMode(gin.DebugMode) } engine := gin.Default() if deps.GinMode == "release" { gin.SetMode(gin.ReleaseMode) err := engine.SetTrustedProxies([]string{"172.20.0.0/16"}) if err != nil { log.WithError(err).Error("Router | Set proxies failed") return nil } } engine.Use(cors.New(cors.Config{ AllowOrigins: deps.AllowedOrigins, AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Content-Type", "Authorization"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, MaxAge: 12 * time.Hour, })) return &router{ apiPrefix: deps.ApiPrefix, engine: engine, tokenProv: deps.TokenProv, } } func (r *router) Set() *gin.Engine { r.engine.NoRoute(func(c *gin.Context) { c.Status(http.StatusForbidden) }) r.engine.RedirectTrailingSlash = false //version r.engine.GET("/version", func(c *gin.Context) { c.JSON(200, gin.H{"version": "2.0.0-alpha"}) }) //swagger r.engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) return r.engine }