servicecontext.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. }
  25. // GetUserId defined TODO
  26. func (sc *ServiceContext) GetClaims(r *http.Request) (int64, string, error) {
  27. parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
  28. tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "")
  29. if err != nil {
  30. return 0, "", err
  31. }
  32. userId, sessionKey := int64(0), ""
  33. m := tok.Claims.(jwt.MapClaims)
  34. switch nbf := m["userId"].(type) {
  35. case string:
  36. i, err := strconv.ParseInt(nbf, 10, 64)
  37. if err != nil {
  38. return 0, "", err
  39. }
  40. userId = i
  41. case json.Number:
  42. v, err := nbf.Int64()
  43. if err != nil {
  44. return 0, "", err
  45. }
  46. userId = v
  47. }
  48. switch nbf := m["sessionKey"].(type) {
  49. case string:
  50. sessionKey = nbf
  51. case json.Number:
  52. v, err := nbf.Int64()
  53. if err != nil {
  54. return 0, "", err
  55. }
  56. sessionKey = fmt.Sprintf("%v", v)
  57. }
  58. return userId, sessionKey, err
  59. }
  60. func (sc *ServiceContext) GetUserIdByJwt(ctx context.Context) int64 {
  61. UserIdStr := ctx.Value("userId").(json.Number)
  62. number, _ := strconv.ParseInt(UserIdStr.String(), 10, 64)
  63. return number
  64. }
  65. func NewServiceContext(c config.Config) *ServiceContext {
  66. svc := &ServiceContext{
  67. Config: c,
  68. SqlConn: sqlx.NewMysql(c.DataSource),
  69. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  70. }
  71. svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache)
  72. svc.RdCli = svc.UserModel.CacheStorage()
  73. svc.Wechat = &Wechat{
  74. RdCli: svc.RdCli,
  75. c: c,
  76. }
  77. return svc
  78. }