package svc import ( "context" "encoding/json" "fmt" "net/http" "strconv" "time" "git.i2edu.net/i2/go-zero/core/stores/sqlx" "git.i2edu.net/i2/go-zero/rest/token" "git.i2edu.net/i2/go-zero/zrpc" "git.i2edu.net/i2/i2-bill-api/internal/config" "git.i2edu.net/i2/i2-bill-api/model" "git.i2edu.net/i2/i2-bill-erp/transformclient" "github.com/dgrijalva/jwt-go" ) type ServiceContext struct { Config config.Config SqlConn sqlx.SqlConn RdCli Cache Wechat *Wechat Transformer transformclient.Transform UserModel model.UserModel } // GetUserId defined TODO func (sc *ServiceContext) GetClaims(r *http.Request) (int64, string, error) { parser := token.NewTokenParser(token.WithResetDuration(time.Minute)) tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "") if err != nil { return 0, "", err } userId, sessionKey := int64(0), "" m := tok.Claims.(jwt.MapClaims) switch nbf := m["userId"].(type) { case string: i, err := strconv.ParseInt(nbf, 10, 64) if err != nil { return 0, "", err } userId = i case json.Number: v, err := nbf.Int64() if err != nil { return 0, "", err } userId = v } switch nbf := m["sessionKey"].(type) { case string: sessionKey = nbf case json.Number: v, err := nbf.Int64() if err != nil { return 0, "", err } sessionKey = fmt.Sprintf("%v", v) } return userId, sessionKey, err } func (sc *ServiceContext) GetUserIdByJwt(ctx context.Context) int64 { UserIdStr := ctx.Value("userId").(json.Number) number, _ := strconv.ParseInt(UserIdStr.String(), 10, 64) return number } func NewServiceContext(c config.Config) *ServiceContext { svc := &ServiceContext{ Config: c, SqlConn: sqlx.NewMysql(c.DataSource), Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)), } svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache) svc.RdCli = svc.UserModel.CacheStorage() svc.Wechat = &Wechat{ RdCli: svc.RdCli, c: c, } return svc }