api.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package api
  2. import (
  3. "context"
  4. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/logger"
  5. "git.sxidc.com/go-tools/utils/strutils"
  6. "github.com/gin-gonic/gin"
  7. "github.com/pkg/errors"
  8. "net/http"
  9. "runtime/debug"
  10. "slices"
  11. "strconv"
  12. "time"
  13. )
  14. type Api struct {
  15. options Options
  16. server *http.Server
  17. rootRouter *RootRouter
  18. prefixRouter *PrefixRouter
  19. }
  20. func New(opts ...Option) *Api {
  21. options := new(Options)
  22. for _, opt := range opts {
  23. opt(options)
  24. }
  25. if strutils.IsStringEmpty(options.port) {
  26. options.port = "8080"
  27. }
  28. engine := gin.New()
  29. server := &http.Server{
  30. Addr: ":" + options.port,
  31. Handler: engine,
  32. }
  33. engine.Use(
  34. // 日志中间件
  35. func(c *gin.Context) {
  36. start := time.Now()
  37. c.Next()
  38. path := c.FullPath()
  39. if slices.Contains(options.skipPaths, path) {
  40. return
  41. }
  42. end := time.Now()
  43. logger.GetInstance().Info(" %d | %s | %s \"%s\"",
  44. c.Writer.Status(),
  45. strconv.Itoa(int(end.Sub(start).Milliseconds()))+"ms",
  46. c.Request.Method,
  47. path,
  48. )
  49. },
  50. // recover
  51. func(c *gin.Context) {
  52. err := recover()
  53. if err != nil {
  54. logger.GetInstance().Error("%s", debug.Stack())
  55. }
  56. })
  57. api := &Api{
  58. options: *options,
  59. server: server,
  60. rootRouter: newRootRouter(engine),
  61. }
  62. if strutils.IsStringNotEmpty(options.urlPrefix) {
  63. api.prefixRouter = newPrefixRouter(engine.Group(options.urlPrefix))
  64. }
  65. return api
  66. }
  67. func NewWithEngine(server *http.Server, engine *gin.Engine, opts ...Option) *Api {
  68. options := new(Options)
  69. for _, opt := range opts {
  70. opt(options)
  71. }
  72. if strutils.IsStringEmpty(options.port) {
  73. options.port = "8080"
  74. }
  75. api := &Api{
  76. options: *options,
  77. server: server,
  78. rootRouter: newRootRouter(engine),
  79. }
  80. if strutils.IsStringNotEmpty(options.urlPrefix) {
  81. api.prefixRouter = newPrefixRouter(engine.Group(options.urlPrefix))
  82. }
  83. return api
  84. }
  85. func (api *Api) Start() error {
  86. err := api.server.ListenAndServe()
  87. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  88. return errors.New(err.Error())
  89. }
  90. return nil
  91. }
  92. func (api *Api) Finish() error {
  93. err := api.server.Shutdown(context.Background())
  94. if err != nil {
  95. return errors.New(err.Error())
  96. }
  97. return nil
  98. }
  99. func (api *Api) Options() Options {
  100. return api.options
  101. }
  102. func (api *Api) RootRouter() Router {
  103. return api.rootRouter
  104. }
  105. func (api *Api) PrefixRouter() Router {
  106. if api.prefixRouter == nil {
  107. return api.rootRouter
  108. }
  109. return api.prefixRouter
  110. }
  111. const (
  112. RouterRoot = "root"
  113. RouterPrefix = "prefix"
  114. )
  115. func (api *Api) ChooseRouter(routerType string, version string) Router {
  116. var router Router
  117. switch routerType {
  118. case RouterRoot:
  119. router = api.RootRouter()
  120. case RouterPrefix:
  121. router = api.PrefixRouter()
  122. default:
  123. router = api.PrefixRouter()
  124. }
  125. if strutils.IsStringNotEmpty(version) {
  126. router = router.VersionedRouter(version)
  127. }
  128. return router
  129. }