router.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package router
  2. import (
  3. "github.com/xinliangnote/go-gin-api/configs"
  4. "github.com/xinliangnote/go-gin-api/internal/alert"
  5. "github.com/xinliangnote/go-gin-api/internal/metrics"
  6. "github.com/xinliangnote/go-gin-api/internal/pkg/core"
  7. "github.com/xinliangnote/go-gin-api/internal/repository/cron"
  8. "github.com/xinliangnote/go-gin-api/internal/repository/mysql"
  9. "github.com/xinliangnote/go-gin-api/internal/repository/redis"
  10. "github.com/xinliangnote/go-gin-api/internal/router/interceptor"
  11. "github.com/xinliangnote/go-gin-api/pkg/errors"
  12. "github.com/xinliangnote/go-gin-api/pkg/file"
  13. "go.uber.org/zap"
  14. )
  15. type resource struct {
  16. mux core.Mux
  17. logger *zap.Logger
  18. db mysql.Repo
  19. cache redis.Repo
  20. interceptors interceptor.Interceptor
  21. cronServer cron.Server
  22. }
  23. type Server struct {
  24. Mux core.Mux
  25. Db mysql.Repo
  26. Cache redis.Repo
  27. CronServer cron.Server
  28. }
  29. func NewHTTPServer(logger *zap.Logger, cronLogger *zap.Logger) (*Server, error) {
  30. if logger == nil {
  31. return nil, errors.New("logger required")
  32. }
  33. r := new(resource)
  34. r.logger = logger
  35. openBrowserUri := configs.ProjectDomain + configs.ProjectPort
  36. _, ok := file.IsExists(configs.ProjectInstallMark)
  37. if !ok { // 未安装
  38. openBrowserUri += "/install"
  39. } else { // 已安装
  40. // 初始化 DB
  41. dbRepo, err := mysql.New()
  42. if err != nil {
  43. logger.Fatal("new db err", zap.Error(err))
  44. }
  45. r.db = dbRepo
  46. // 初始化 Cache
  47. cacheRepo, err := redis.New()
  48. if err != nil {
  49. logger.Fatal("new cache err", zap.Error(err))
  50. }
  51. r.cache = cacheRepo
  52. // 初始化 CRON Server
  53. cronServer, err := cron.New(cronLogger, dbRepo, cacheRepo)
  54. if err != nil {
  55. logger.Fatal("new cron err", zap.Error(err))
  56. }
  57. cronServer.Start()
  58. r.cronServer = cronServer
  59. }
  60. mux, err := core.New(logger,
  61. core.WithEnableOpenBrowser(openBrowserUri),
  62. core.WithEnableCors(),
  63. core.WithEnableRate(),
  64. core.WithAlertNotify(alert.NotifyHandler(logger)),
  65. core.WithRecordMetrics(metrics.RecordHandler(logger)),
  66. )
  67. if err != nil {
  68. panic(err)
  69. }
  70. r.mux = mux
  71. r.interceptors = interceptor.New(logger, r.cache, r.db)
  72. // 设置 Render 路由
  73. setRenderRouter(r)
  74. // 设置 API 路由
  75. setApiRouter(r)
  76. // 设置 GraphQL 路由
  77. setGraphQLRouter(r)
  78. // 设置 Socket 路由
  79. setSocketRouter(r)
  80. s := new(Server)
  81. s.Mux = mux
  82. s.Db = r.db
  83. s.Cache = r.cache
  84. s.CronServer = r.cronServer
  85. return s, nil
  86. }