package router import ( "context" "fmt" "merch-api/internal/user" "merch-api/pkg/authCheck" "net" "net/http" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) const pkgLogHeader string = "Router |" type Deps struct { Host string Port string Prefix string GinMode string UserProvider user.Provider AuthProvider authCheck.AuthChecker ServiceId int32 } type Router struct { srv *http.Server engine *gin.Engine prefix string } func NewRouter(deps Deps) *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).Errorf("%v Set proxies failed", pkgLogHeader) return nil } } engine.NoRoute(func(c *gin.Context) { c.Status(http.StatusForbidden) }) engine.RedirectTrailingSlash = false engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) engine.Use(authMW(deps.UserProvider, deps.AuthProvider, deps.ServiceId)) return &Router{ srv: &http.Server{ Addr: net.JoinHostPort(deps.Host, deps.Port), Handler: engine, }, engine: engine, prefix: deps.Prefix, } } func (r *Router) Run() error { log.Infof("%v Http server started on: %v", pkgLogHeader, r.srv.Addr) return r.srv.ListenAndServe() } func (r *Router) Shutdown(ctx context.Context) error { log.Infof("%v Http server shutting down", pkgLogHeader) return r.srv.Shutdown(ctx) } func (r *Router) BaseGroup() *gin.RouterGroup { return r.engine.Group(fmt.Sprintf("%v/", r.prefix)) }