package httpapi import ( "errors" "log" "time" "github.com/gin-gonic/gin" "git.apinb.com/ops/license/internal/dashboard" "git.apinb.com/ops/license/internal/issuance" "git.apinb.com/ops/license/internal/subject" ) func NewRouter(subjectService *subject.Service, issuanceService *issuance.Service, dashboardService *dashboard.Service) (*gin.Engine, error) { if subjectService == nil || issuanceService == nil || dashboardService == nil { return nil, errors.New("HTTP API 依赖不能为空") } router := gin.New() router.Use(gin.Recovery(), routeLogger()) subjects := subjectHandler{service: subjectService} licences := issuanceHandler{service: issuanceService, subjectService: subjectService} dashboardHandler := dashboardHandler{service: dashboardService} api := router.Group("/api/v1") api.GET("/dashboard", dashboardHandler.get) api.GET("/subjects", subjects.list) api.POST("/subjects", subjects.create) api.GET("/subjects/:id", subjects.get) api.PUT("/subjects/:id", subjects.update) api.DELETE("/subjects/:id", subjects.delete) api.POST("/subjects/:id/licences", licences.issue) api.GET("/licences", licences.list) api.GET("/licences/:id", licences.get) api.GET("/licences/:id/download", licences.download) api.POST("/licences/:id/renew", licences.renew) return router, nil } func routeLogger() gin.HandlerFunc { return func(c *gin.Context) { startedAt := time.Now() c.Next() route := c.FullPath() if route == "" { route = c.Request.URL.Path } log.Printf("HTTP route=%s status=%d duration=%s", route, c.Writer.Status(), time.Since(startedAt).Round(time.Millisecond)) } }