service_detailbykey.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package authorized
  2. import (
  3. "encoding/json"
  4. "github.com/xinliangnote/go-gin-api/configs"
  5. "github.com/xinliangnote/go-gin-api/internal/pkg/core"
  6. "github.com/xinliangnote/go-gin-api/internal/repository/mysql"
  7. "github.com/xinliangnote/go-gin-api/internal/repository/mysql/authorized"
  8. "github.com/xinliangnote/go-gin-api/internal/repository/mysql/authorized_api"
  9. "github.com/xinliangnote/go-gin-api/internal/repository/redis"
  10. )
  11. // CacheAuthorizedData 缓存结构
  12. type CacheAuthorizedData struct {
  13. Key string `json:"key"` // 调用方 key
  14. Secret string `json:"secret"` // 调用方 secret
  15. IsUsed int32 `json:"is_used"` // 调用方启用状态 1=启用 -1=禁用
  16. Apis []cacheApiData `json:"apis"` // 调用方授权的 Apis
  17. }
  18. type cacheApiData struct {
  19. Method string `json:"method"` // 请求方式
  20. Api string `json:"api"` // 请求地址
  21. }
  22. func (s *service) DetailByKey(ctx core.Context, key string) (cacheData *CacheAuthorizedData, err error) {
  23. // 查询缓存
  24. cacheKey := configs.RedisKeyPrefixSignature + key
  25. if !s.cache.Exists(cacheKey) {
  26. // 查询调用方信息
  27. authorizedInfo, err := authorized.NewQueryBuilder().
  28. WhereIsDeleted(mysql.EqualPredicate, -1).
  29. WhereBusinessKey(mysql.EqualPredicate, key).
  30. First(s.db.GetDbR().WithContext(ctx.RequestContext()))
  31. if err != nil {
  32. return nil, err
  33. }
  34. // 查询调用方授权 API 信息
  35. authorizedApiInfo, err := authorized_api.NewQueryBuilder().
  36. WhereIsDeleted(mysql.EqualPredicate, -1).
  37. WhereBusinessKey(mysql.EqualPredicate, key).
  38. OrderById(false).
  39. QueryAll(s.db.GetDbR().WithContext(ctx.RequestContext()))
  40. if err != nil {
  41. return nil, err
  42. }
  43. // 设置缓存 data
  44. cacheData = new(CacheAuthorizedData)
  45. cacheData.Key = key
  46. cacheData.Secret = authorizedInfo.BusinessSecret
  47. cacheData.IsUsed = authorizedInfo.IsUsed
  48. cacheData.Apis = make([]cacheApiData, len(authorizedApiInfo))
  49. for k, v := range authorizedApiInfo {
  50. data := cacheApiData{
  51. Method: v.Method,
  52. Api: v.Api,
  53. }
  54. cacheData.Apis[k] = data
  55. }
  56. cacheDataByte, _ := json.Marshal(cacheData)
  57. err = s.cache.Set(cacheKey, string(cacheDataByte), configs.LoginSessionTTL, redis.WithTrace(ctx.Trace()))
  58. if err != nil {
  59. return nil, err
  60. }
  61. return cacheData, nil
  62. }
  63. value, err := s.cache.Get(cacheKey, redis.WithTrace(ctx.RequestContext().Trace))
  64. if err != nil {
  65. return nil, err
  66. }
  67. cacheData = new(CacheAuthorizedData)
  68. err = json.Unmarshal([]byte(value), cacheData)
  69. if err != nil {
  70. return nil, err
  71. }
  72. return
  73. }