106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
package server
|
|
|
|
import (
|
|
"leafdev.top/Ecosystem/recommender/internal/base/conf"
|
|
httpHandler "leafdev.top/Ecosystem/recommender/internal/handler/http"
|
|
"leafdev.top/Ecosystem/recommender/internal/router"
|
|
"leafdev.top/Ecosystem/recommender/internal/schema"
|
|
"leafdev.top/Ecosystem/recommender/pkg/consts"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-contrib/cors"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
)
|
|
|
|
func promHandler(handler http.Handler) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
handler.ServeHTTP(c.Writer, c.Request)
|
|
}
|
|
}
|
|
|
|
type HttpServer struct {
|
|
Gin *gin.Engine
|
|
apiRouter *router.Api
|
|
swaggerRouter *router.SwaggerRouter
|
|
middleware *httpHandler.Middleware
|
|
}
|
|
|
|
// NewHTTPServer new http server.
|
|
func NewHTTPServer(
|
|
config *conf.Config,
|
|
apiRouter *router.Api,
|
|
swaggerRouter *router.SwaggerRouter,
|
|
middleware *httpHandler.Middleware,
|
|
) *HttpServer {
|
|
if config.Debug.Enabled {
|
|
gin.SetMode(gin.DebugMode)
|
|
} else {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
}
|
|
|
|
r := gin.New()
|
|
r.Use(gin.Recovery())
|
|
r.Use(middleware.GinLogger.GinLogger)
|
|
|
|
return &HttpServer{
|
|
Gin: r,
|
|
apiRouter: apiRouter,
|
|
swaggerRouter: swaggerRouter,
|
|
middleware: middleware,
|
|
}
|
|
}
|
|
|
|
func (hs *HttpServer) AllowAllCors() {
|
|
var config = cors.DefaultConfig()
|
|
config.AllowAllOrigins = true
|
|
config.AllowCredentials = true
|
|
config.AllowMethods = []string{"GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"}
|
|
config.AllowHeaders = []string{"Origin", "Content-Length", "Content-Type", "Cookie", "X-Requested-With", "X-Auth-Token", "Authorization"}
|
|
config.MaxAge = 12 * time.Hour
|
|
|
|
hs.Gin.Use(cors.New(config))
|
|
}
|
|
|
|
func (hs *HttpServer) BizRouter() *gin.Engine {
|
|
hs.AllowAllCors()
|
|
|
|
rootGroup := hs.Gin.Group("")
|
|
|
|
// swagger
|
|
hs.swaggerRouter.Register(rootGroup)
|
|
|
|
apiV1 := rootGroup.Group("/api/v1")
|
|
{
|
|
//apiV1.Use(corsMiddleWare)
|
|
apiV1.Use(hs.middleware.JSONResponse.ContentTypeJSON)
|
|
apiV1.Use(hs.middleware.Auth.RequireJWTIDToken)
|
|
hs.apiRouter.InitApiRouter(apiV1)
|
|
}
|
|
|
|
apiV1NoAuth := rootGroup.Group("/api/v1")
|
|
{
|
|
//apiV1.Use(corsMiddleWare)
|
|
hs.apiRouter.InitNoAuthApiRouter(apiV1NoAuth)
|
|
}
|
|
|
|
hs.Gin.NoRoute(func(ctx *gin.Context) {
|
|
schema.NewResponse(ctx).Status(http.StatusNotFound).Error(consts.ErrPageNotFound).Send()
|
|
})
|
|
|
|
return hs.Gin
|
|
}
|
|
|
|
func (hs *HttpServer) MetricRouter() *gin.Engine {
|
|
r := gin.New()
|
|
r.Use(gin.Recovery())
|
|
|
|
metricGroup := r.Group("")
|
|
// prometheus
|
|
metricGroup.GET("/metrics", promHandler(promhttp.Handler()))
|
|
metricGroup.GET("/healthz", func(ctx *gin.Context) { ctx.String(200, "OK") })
|
|
|
|
return r
|
|
}
|