service_context.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package svc
  2. import (
  3. "time"
  4. "wechat-api/database"
  5. "wechat-api/database/dao/wechat/query"
  6. "wechat-api/internal/config"
  7. "wechat-api/internal/middleware"
  8. "wechat-api/internal/pkg/wechat_ws"
  9. "wechat-api/mongo_model"
  10. "github.com/bwmarrin/snowflake"
  11. "github.com/mojocn/base64Captcha"
  12. "github.com/redis/go-redis/v9"
  13. "github.com/suyuan32/simple-admin-common/i18n"
  14. "github.com/suyuan32/simple-admin-common/utils/captcha"
  15. "github.com/suyuan32/simple-admin-core/rpc/coreclient"
  16. "github.com/zeromicro/go-zero/core/collection"
  17. "github.com/zeromicro/go-zero/core/logx"
  18. "gorm.io/gorm"
  19. "github.com/casbin/casbin/v2"
  20. "wechat-api/ent"
  21. _ "wechat-api/ent/runtime"
  22. "github.com/zeromicro/go-zero/rest"
  23. "github.com/zeromicro/go-zero/zrpc"
  24. )
  25. type ServiceContext struct {
  26. Config config.Config
  27. Casbin *casbin.Enforcer
  28. Authority rest.Middleware
  29. OpenAuthority rest.Middleware
  30. Miniprogram rest.Middleware
  31. DB *ent.Client
  32. WechatDB *gorm.DB
  33. WechatQ *query.Query
  34. CoreRpc coreclient.Core
  35. Rds redis.UniversalClient
  36. WechatWs map[string]*wechat_ws.WechatWsClient
  37. WecomWs map[string]*wechat_ws.WecomWsClient
  38. Cache *collection.Cache
  39. NodeID *snowflake.Node
  40. MongoModel *mongo_model.AllMongoModel
  41. Captcha *base64Captcha.Captcha
  42. Trans *i18n.Translator
  43. }
  44. func NewServiceContext(c config.Config) *ServiceContext {
  45. rds := c.RedisConf.MustNewUniversalRedis()
  46. cbn := c.CasbinConf.MustNewCasbinWithOriginalRedisWatcher(c.CasbinDatabaseConf.Type, c.CasbinDatabaseConf.GetDSN(), c.RedisConf)
  47. db := ent.NewClient(
  48. ent.Log(logx.Info), // logger
  49. ent.Driver(c.DatabaseConf.NewNoCacheDriver()),
  50. ent.Debug(), // debug mode
  51. )
  52. // 初始化 MongoDB 客户端
  53. all_mongo_model := mongo_model.SetupMongoModel(c.FastgptMongoConf.Url, c.FastgptMongoConf.DBName)
  54. // gorm 数据库连接
  55. wechatDb, err := database.InitWechatDB(c.DatabaseConf, c.Mode)
  56. if err != nil {
  57. logx.Error(err)
  58. panic("gorm 数据库连接失败")
  59. }
  60. wechatQ := query.Use(wechatDb)
  61. coreRpc := coreclient.NewCore(zrpc.NewClientIfEnable(c.CoreRpc))
  62. // 初始化微信ws客户端
  63. // todo 现在配置是从 config.yaml中读取的,后续需要改成从数据库中读取,以便匹配不同的微信号
  64. wechatWs := make(map[string]*wechat_ws.WechatWsClient)
  65. wecomWs := make(map[string]*wechat_ws.WecomWsClient)
  66. for _, ws := range c.WebSocket {
  67. if ws.Type == "wechat" {
  68. client, err := wechat_ws.NewWechatWsClient(ws.Url, ws.Name, ws.Type)
  69. if err != nil {
  70. logx.Error(err)
  71. } else {
  72. logx.Info("建立ws client成功~", ws.Name)
  73. go client.ReadPump()
  74. go client.WritePump()
  75. wechatWs[ws.Name] = client
  76. }
  77. } else if ws.Type == "wecom" {
  78. wecomClient, err := wechat_ws.NewWecomWsClient(ws.Url, ws.Name, ws.Type)
  79. if err != nil {
  80. logx.Error(err)
  81. } else {
  82. logx.Info("建立ws wecomClient成功~", ws.Name)
  83. go wecomClient.ReadPump()
  84. go wecomClient.WritePump()
  85. wecomWs[ws.Name] = wecomClient
  86. }
  87. }
  88. }
  89. cache, err := collection.NewCache(time.Hour * 24 * 365)
  90. if err != nil {
  91. logx.Error(err)
  92. panic("本地缓存实例失败")
  93. }
  94. node, err := snowflake.NewNode(1)
  95. if err != nil {
  96. logx.Error(err)
  97. panic("雪花算法实例失败")
  98. }
  99. return &ServiceContext{
  100. Config: c,
  101. Authority: middleware.NewAuthorityMiddleware(cbn, rds, coreRpc).Handle,
  102. OpenAuthority: middleware.NewOpenAuthorityMiddleware(db, rds, c).Handle,
  103. Miniprogram: middleware.NewMiniprogramMiddleware(cbn, rds, coreRpc, c).Handle,
  104. DB: db,
  105. WechatDB: wechatDb,
  106. WechatQ: wechatQ,
  107. CoreRpc: coreRpc,
  108. Rds: rds,
  109. WechatWs: wechatWs,
  110. WecomWs: wecomWs,
  111. Cache: cache,
  112. NodeID: node,
  113. MongoModel: all_mongo_model,
  114. Captcha: captcha.MustNewOriginalRedisCaptcha(c.Captcha, rds),
  115. }
  116. }