servicecontext.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package svc
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. "git.i2edu.net/i2/go-zero/core/stores/sqlx"
  10. "git.i2edu.net/i2/go-zero/rest/token"
  11. "git.i2edu.net/i2/go-zero/zrpc"
  12. "git.i2edu.net/i2/i2-bill-api/internal/config"
  13. "git.i2edu.net/i2/i2-bill-api/model"
  14. "git.i2edu.net/i2/i2-bill-erp/transformclient"
  15. "github.com/dgrijalva/jwt-go"
  16. )
  17. type ServiceContext struct {
  18. Config config.Config
  19. SqlConn sqlx.SqlConn
  20. RdCli Cache
  21. Wechat *Wechat
  22. Transformer transformclient.Transform
  23. UserModel model.UserModel
  24. I2billAcquirerStudentModel model.I2billAcquirerStudentModel
  25. }
  26. // GetUserId defined TODO
  27. func (sc *ServiceContext) GetClaims(r *http.Request) (int64, string, error) {
  28. parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
  29. tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "")
  30. if err != nil {
  31. return 0, "", err
  32. }
  33. userId, sessionKey := int64(0), ""
  34. m := tok.Claims.(jwt.MapClaims)
  35. switch nbf := m["userId"].(type) {
  36. case string:
  37. i, err := strconv.ParseInt(nbf, 10, 64)
  38. if err != nil {
  39. return 0, "", err
  40. }
  41. userId = i
  42. case json.Number:
  43. v, err := nbf.Int64()
  44. if err != nil {
  45. return 0, "", err
  46. }
  47. userId = v
  48. }
  49. switch nbf := m["sessionKey"].(type) {
  50. case string:
  51. sessionKey = nbf
  52. case json.Number:
  53. v, err := nbf.Int64()
  54. if err != nil {
  55. return 0, "", err
  56. }
  57. sessionKey = fmt.Sprintf("%v", v)
  58. }
  59. return userId, sessionKey, err
  60. }
  61. func (sc *ServiceContext) GetUserIdByJwt(ctx context.Context) int64 {
  62. UserIdStr := ctx.Value("userId").(json.Number)
  63. number, _ := strconv.ParseInt(UserIdStr.String(), 10, 64)
  64. return number
  65. }
  66. func NewServiceContext(c config.Config) *ServiceContext {
  67. svc := &ServiceContext{
  68. Config: c,
  69. SqlConn: sqlx.NewMysql(c.DataSource),
  70. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  71. }
  72. svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache)
  73. svc.I2billAcquirerStudentModel = model.NewI2billAcquirerStudentModel(svc.SqlConn)
  74. svc.RdCli = svc.UserModel.CacheStorage()
  75. svc.Wechat = &Wechat{
  76. RdCli: svc.RdCli,
  77. c: c,
  78. }
  79. return svc
  80. }