2025-02-05 18:45:49 +08:00
|
|
|
|
package svc
|
|
|
|
|
|
2025-02-06 15:35:23 +08:00
|
|
|
|
import (
|
|
|
|
|
"context"
|
2025-02-08 18:57:05 +08:00
|
|
|
|
"encoding/json"
|
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/auth_service/internal/gen/dao/query"
|
|
|
|
|
cli2 "gitea.youtukeji.com.cn/youtu/youtu_grpc/app/auth_service/pkg"
|
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_management/user_management"
|
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_management/user_management_client"
|
|
|
|
|
"gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/config"
|
|
|
|
|
"github.com/silenceper/wechat/v2/cache"
|
2025-02-06 15:35:23 +08:00
|
|
|
|
redisCache "github.com/silenceper/wechat/v2/cache"
|
2025-02-08 18:57:05 +08:00
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
"github.com/zeromicro/go-zero/core/conf"
|
|
|
|
|
"github.com/zeromicro/go-zero/core/discov"
|
|
|
|
|
"github.com/zeromicro/go-zero/zrpc"
|
|
|
|
|
clientv3 "go.etcd.io/etcd/client/v3"
|
2025-02-06 15:35:23 +08:00
|
|
|
|
)
|
2025-02-05 18:45:49 +08:00
|
|
|
|
|
|
|
|
|
type ServiceContext struct {
|
2025-02-08 18:57:05 +08:00
|
|
|
|
Config config.Config
|
|
|
|
|
Cli cli2.Helper
|
|
|
|
|
UserManagerClient user_management_client.UserManagement
|
|
|
|
|
Query *query.Query
|
2025-02-05 18:45:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
2025-02-08 18:57:05 +08:00
|
|
|
|
|
|
|
|
|
svc := &ServiceContext{
|
2025-02-05 18:45:49 +08:00
|
|
|
|
Config: c,
|
|
|
|
|
}
|
2025-02-08 18:57:05 +08:00
|
|
|
|
|
|
|
|
|
clientConf := zrpc.RpcClientConf{}
|
|
|
|
|
err := conf.FillDefault(&clientConf) // 填充默认值,比如 trace 透传等,参考服务配置说明
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
clientConf.Token = "user_management.rpc.key"
|
|
|
|
|
clientConf.App = "user_management.rpc"
|
|
|
|
|
clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现
|
|
|
|
|
Hosts: []string{viper.GetString(config.EtcdAddrKey)},
|
|
|
|
|
Key: "user_management.rpc",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
svc.UserManagerClient = user_management.NewUserManagementClient(zrpc.MustNewClient(clientConf).Conn())
|
|
|
|
|
|
|
|
|
|
svc.InitClient()
|
|
|
|
|
|
|
|
|
|
return svc
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AppData struct {
|
|
|
|
|
AppId string `json:"appId"`
|
|
|
|
|
AppSecret string `json:"appSecret"`
|
|
|
|
|
Type string `json:"type"`
|
2025-02-05 18:45:49 +08:00
|
|
|
|
}
|
2025-02-06 15:35:23 +08:00
|
|
|
|
|
2025-02-08 18:57:05 +08:00
|
|
|
|
type AppDataList []AppData
|
|
|
|
|
|
|
|
|
|
const AppDataWatchKey = "/youtu/appData"
|
|
|
|
|
|
|
|
|
|
func (svc *ServiceContext) InitClient() {
|
|
|
|
|
|
|
|
|
|
dwCache := redisCache.NewRedis(context.Background(), &redisCache.RedisOpts{Host: svc.Config.Redis[0].Host})
|
2025-02-06 15:35:23 +08:00
|
|
|
|
|
2025-02-08 18:57:05 +08:00
|
|
|
|
cli, err := clientv3.NewFromURL(viper.GetString(config.EtcdAddrKey))
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res, err := cli.Get(context.TODO(), AppDataWatchKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var appDataArr AppDataList
|
|
|
|
|
|
|
|
|
|
for _, kv := range res.Kvs {
|
|
|
|
|
var arr AppDataList
|
|
|
|
|
err = json.Unmarshal(kv.Value, &arr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
appDataArr = append(appDataArr, arr...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
svc.SaveDW(appDataArr, dwCache)
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
ch := cli.Watch(context.Background(), AppDataWatchKey)
|
|
|
|
|
//从通道中尝试取值(监视的信息)
|
|
|
|
|
for res := range ch {
|
|
|
|
|
var appDataArr AppDataList
|
|
|
|
|
for _, evt := range res.Events {
|
|
|
|
|
var arr AppDataList
|
|
|
|
|
err = json.Unmarshal(evt.Kv.Value, &arr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err) //todo logger
|
|
|
|
|
}
|
|
|
|
|
appDataArr = append(appDataArr, arr...)
|
|
|
|
|
}
|
|
|
|
|
svc.SaveDW(appDataArr, dwCache)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
}
|
2025-02-06 15:35:23 +08:00
|
|
|
|
|
2025-02-08 18:57:05 +08:00
|
|
|
|
func (svc *ServiceContext) SaveDW(arr []AppData, dwCache cache.Cache) {
|
|
|
|
|
svc.Cli.Clear()
|
2025-02-06 15:35:23 +08:00
|
|
|
|
//配置小程序cli(抖音&微信)
|
2025-02-08 18:57:05 +08:00
|
|
|
|
for _, v := range arr {
|
2025-02-07 15:18:26 +08:00
|
|
|
|
var c cli2.DWClient
|
2025-02-06 15:35:23 +08:00
|
|
|
|
switch v.Type {
|
2025-02-07 15:18:26 +08:00
|
|
|
|
case cli2.DouyinClientType:
|
|
|
|
|
c = cli2.NewDouYinApi(v.AppId, v.AppSecret, dwCache)
|
|
|
|
|
case cli2.WechatClientType:
|
|
|
|
|
c = cli2.NewWechatApi(v.AppId, v.AppSecret, dwCache)
|
2025-02-06 15:35:23 +08:00
|
|
|
|
default:
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
svc.Cli.Set(v.AppId, c)
|
|
|
|
|
}
|
|
|
|
|
}
|