123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package svc
- import (
- "github.com/bwmarrin/snowflake"
- "github.com/zeromicro/go-zero/core/collection"
- "gorm.io/gorm"
- "time"
- "wechat-api/database"
- "wechat-api/database/dao/wechat/query"
- "wechat-api/internal/config"
- "wechat-api/internal/middleware"
- "wechat-api/internal/pkg/wechat_ws"
- "wechat-api/mongo_model"
- "github.com/redis/go-redis/v9"
- "wechat-api/ent"
- _ "wechat-api/ent/runtime"
- "github.com/suyuan32/simple-admin-core/rpc/coreclient"
- "github.com/zeromicro/go-zero/core/logx"
- "github.com/casbin/casbin/v2"
- "github.com/zeromicro/go-zero/rest"
- "github.com/zeromicro/go-zero/zrpc"
- )
- type ServiceContext struct {
- Config config.Config
- Casbin *casbin.Enforcer
- Authority rest.Middleware
- OpenAuthority rest.Middleware
- Miniprogram rest.Middleware
- DB *ent.Client
- WechatDB *gorm.DB
- WechatQ *query.Query
- CoreRpc coreclient.Core
- Rds redis.UniversalClient
- WechatWs map[string]*wechat_ws.WechatWsClient
- Cache *collection.Cache
- NodeID *snowflake.Node
- MongoModel *mongo_model.AllMongoModel
- }
- func NewServiceContext(c config.Config) *ServiceContext {
- rds := c.RedisConf.MustNewUniversalRedis()
- cbn := c.CasbinConf.MustNewCasbinWithOriginalRedisWatcher(c.CasbinDatabaseConf.Type, c.CasbinDatabaseConf.GetDSN(), c.RedisConf)
- db := ent.NewClient(
- ent.Log(logx.Info), // logger
- ent.Driver(c.DatabaseConf.NewNoCacheDriver()),
- ent.Debug(), // debug mode
- )
- // 初始化 MongoDB 客户端
- all_mongo_model := mongo_model.SetupMongoModel(c.FastgptMongoConf.Url, c.FastgptMongoConf.DBName)
- // gorm 数据库连接
- wechatDb, err := database.InitWechatDB(c.DatabaseConf, c.Mode)
- if err != nil {
- logx.Error(err)
- panic("gorm 数据库连接失败")
- }
- wechatQ := query.Use(wechatDb)
- coreRpc := coreclient.NewCore(zrpc.NewClientIfEnable(c.CoreRpc))
- // 初始化微信ws客户端
- // todo 现在配置是从 config.yaml中读取的,后续需要改成从数据库中读取,以便匹配不同的微信号
- wechatWs := make(map[string]*wechat_ws.WechatWsClient)
- for _, ws := range c.WebSocket {
- if ws.Type == "wechat" {
- client, err := wechat_ws.NewWechatWsClient(ws.Url, ws.Name, ws.Type)
- if err != nil {
- logx.Error(err)
- } else {
- logx.Info("建立ws client成功~", ws.Name)
- go client.ReadPump()
- go client.WritePump()
- wechatWs[ws.Name] = client
- }
- }
- }
- cache, err := collection.NewCache(time.Hour * 24 * 365)
- if err != nil {
- logx.Error(err)
- panic("本地缓存实例失败")
- }
- node, err := snowflake.NewNode(1)
- if err != nil {
- logx.Error(err)
- panic("雪花算法实例失败")
- }
- return &ServiceContext{
- Config: c,
- Authority: middleware.NewAuthorityMiddleware(cbn, rds, coreRpc).Handle,
- OpenAuthority: middleware.NewOpenAuthorityMiddleware(db, rds, c).Handle,
- Miniprogram: middleware.NewMiniprogramMiddleware(cbn, rds, coreRpc, c).Handle,
- DB: db,
- WechatDB: wechatDb,
- WechatQ: wechatQ,
- CoreRpc: coreRpc,
- Rds: rds,
- WechatWs: wechatWs,
- Cache: cache,
- NodeID: node,
- MongoModel: all_mongo_model,
- }
- }
|