service_context.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package svc
  2. import (
  3. "github.com/bwmarrin/snowflake"
  4. "github.com/casbin/casbin/v2"
  5. "github.com/redis/go-redis/v9"
  6. "github.com/zeromicro/go-zero/core/collection"
  7. "gorm.io/gorm"
  8. "time"
  9. "wechat-api/database"
  10. "wechat-api/database/dao/wechat/query"
  11. "github.com/suyuan32/simple-admin-core/rpc/coreclient"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. "github.com/zeromicro/go-zero/rest"
  14. "github.com/zeromicro/go-zero/zrpc"
  15. "wechat-api/ent"
  16. _ "wechat-api/ent/runtime"
  17. "wechat-api/internal/config"
  18. "wechat-api/internal/middleware"
  19. "wechat-api/internal/pkg/wechat_ws"
  20. mongo_model "wechat-api/mongo_model"
  21. )
  22. type ServiceContext struct {
  23. Config config.Config
  24. Casbin *casbin.Enforcer
  25. Authority rest.Middleware
  26. Miniprogram rest.Middleware
  27. DB *ent.Client //大家都不爱用,后边可以慢慢过渡到gorm的库
  28. WechatDB *gorm.DB
  29. WechatQ *query.Query
  30. CoreRpc coreclient.Core
  31. Rds redis.UniversalClient
  32. WechatWs map[string]*wechat_ws.WechatWsClient
  33. Cache *collection.Cache
  34. NodeID *snowflake.Node
  35. MongoModel *mongo_model.AllMongoModel
  36. }
  37. func NewServiceContext(c config.Config) *ServiceContext {
  38. rds := c.RedisConf.MustNewUniversalRedis()
  39. cbn := c.CasbinConf.MustNewCasbinWithOriginalRedisWatcher(c.CasbinDatabaseConf.Type, c.CasbinDatabaseConf.GetDSN(), c.RedisConf)
  40. db := ent.NewClient(
  41. ent.Log(logx.Info), // logger
  42. ent.Driver(c.DatabaseConf.NewNoCacheDriver()),
  43. ent.Debug(), // debug mode
  44. )
  45. // gorm 数据库连接
  46. wechatDb, err := database.InitWechatDB(c.DatabaseConf, c.Mode)
  47. if err != nil {
  48. logx.Error(err)
  49. panic("gorm 数据库连接失败")
  50. }
  51. wechatQ := query.Use(wechatDb)
  52. // 初始化 MongoDB 客户端
  53. all_mongo_model := mongo_model.SetupMongoModel(c.FastgptMongoConf.Url, c.FastgptMongoConf.DBName)
  54. coreRpc := coreclient.NewCore(zrpc.NewClientIfEnable(c.CoreRpc))
  55. wechatWs := make(map[string]*wechat_ws.WechatWsClient)
  56. for _, ws := range c.WebSocket {
  57. if ws.Type == "wechat" {
  58. client, err := wechat_ws.NewWechatWsClient(ws.Url, ws.Name, ws.Type)
  59. if err != nil {
  60. logx.Error(err)
  61. } else {
  62. logx.Info("建立ws client成功~", ws.Name)
  63. go client.ReadPump()
  64. go client.WritePump()
  65. wechatWs[ws.Name] = client
  66. }
  67. }
  68. }
  69. cache, err := collection.NewCache(time.Hour * 24 * 365)
  70. if err != nil {
  71. logx.Error(err)
  72. panic("本地缓存实例失败")
  73. }
  74. node, err := snowflake.NewNode(1)
  75. if err != nil {
  76. logx.Error(err)
  77. panic("雪花算法实例失败")
  78. }
  79. return &ServiceContext{
  80. Config: c,
  81. Authority: middleware.NewAuthorityMiddleware(cbn, rds, coreRpc).Handle,
  82. Miniprogram: middleware.NewMiniprogramMiddleware(cbn, rds, coreRpc, c).Handle,
  83. DB: db,
  84. WechatDB: wechatDb,
  85. WechatQ: wechatQ,
  86. CoreRpc: coreRpc,
  87. Rds: rds,
  88. WechatWs: wechatWs,
  89. Cache: cache,
  90. NodeID: node,
  91. MongoModel: all_mongo_model,
  92. }
  93. }