EnterpriseService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Hotline.Enterprise;
  2. using System.Net.Http.Headers;
  3. using System.Net.Http.Json;
  4. using System.Text;
  5. using Hotline.Configurations;
  6. using Hotline.Share.Dtos.Enterprise;
  7. using Microsoft.Extensions.Logging;
  8. using Microsoft.Extensions.Options;
  9. using XF.Domain.Cache;
  10. using XF.Domain.Exceptions;
  11. namespace Hotline.YbEnterprise.Sdk
  12. {
  13. public class EnterpriseService : IEnterpriseService
  14. {
  15. private readonly IHttpClientFactory _httpClientFactory;
  16. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  17. private readonly ITypedCache<YbEnterpriseToken> _tokenCache;
  18. private readonly ILogger<EnterpriseService> _logger;
  19. public EnterpriseService(
  20. IHttpClientFactory httpClientFactory,
  21. IOptionsSnapshot<AppConfiguration> appOptions,
  22. ITypedCache<YbEnterpriseToken> tokenCache,
  23. ILogger<EnterpriseService> logger)
  24. {
  25. _httpClientFactory = httpClientFactory;
  26. _appOptions = appOptions;
  27. _tokenCache = tokenCache;
  28. _logger = logger;
  29. }
  30. /// <summary>
  31. /// 获取企业列表
  32. /// </summary>
  33. /// <param name="name"></param>
  34. /// <param name="current"></param>
  35. /// <param name="size"></param>
  36. /// <param name="cancellationToken"></param>
  37. /// <returns></returns>
  38. public async Task<YbEnterprisePaged> QueryYbEnterprisesAsync(
  39. string name, int current, int size, CancellationToken cancellationToken)
  40. {
  41. var request = new YbEnterprisesRequest()
  42. {
  43. EnterpriseName = name,
  44. Current = current,
  45. Size = size
  46. };
  47. var token = await GetTokenAsync(YbEnterpriseDefaults.KeyOfToken, cancellationToken);
  48. var result = await ExecuteAsync<YbEnterprisesRequest, YbEnterpriseResponse<YbEnterprisePaged>>(
  49. YbEnterpriseDefaults.PathEnterprises,
  50. request,
  51. d => d.DefaultRequestHeaders.Add("Blade-Auth", $"{token.TokenType} {token.AccessToken}"),
  52. cancellationToken);
  53. if (result is null || !result.Success)
  54. throw new UserFriendlyException("未获取到企业专班数据");
  55. return result.Data;
  56. }
  57. private async Task<YbEnterpriseToken> GetTokenAsync(string key, CancellationToken cancellationToken)
  58. {
  59. var token = await _tokenCache.GetAsync(key, cancellationToken);
  60. if (token is not null) return token;
  61. token = await GetTokenAsync(cancellationToken);
  62. await _tokenCache.SetAsync(key, token, TimeSpan.FromSeconds(token.ExpiresIn - 5), cancellationToken);
  63. return token;
  64. }
  65. private async Task<YbEnterpriseToken> GetTokenAsync(CancellationToken cancellationToken)
  66. {
  67. var config = _appOptions.Value.YiBin.Enterprise;
  68. string authorization = config.ClientId + ":" + config.ClientSecret;
  69. authorization = Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization));
  70. var result = await ExecuteAsync<object, YbEnterpriseResponse<YbEnterpriseToken>>(
  71. YbEnterpriseDefaults.PathToken,
  72. new(),
  73. d =>
  74. {
  75. d.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse($"Basic {authorization}");
  76. d.DefaultRequestHeaders.Add("Tenant-Id", config.TenantId);
  77. }, cancellationToken);
  78. if (result is null || !result.Success)
  79. throw new UserFriendlyException("获取enterprise token失败");
  80. return result.Data;
  81. }
  82. private async Task<TResponse?> ExecuteAsync<TRequest, TResponse>(string path, TRequest request,
  83. Action<HttpClient>? clientInitialize = null, CancellationToken cancellationToken = default)
  84. {
  85. var client = _httpClientFactory.CreateClient(YbEnterpriseDefaults.HttpName);
  86. clientInitialize?.Invoke(client);
  87. using var responseMessage = await client.PostAsJsonAsync(path, request, cancellationToken);
  88. responseMessage.EnsureSuccessStatusCode();
  89. var result = await responseMessage.Content.ReadFromJsonAsync<TResponse>(cancellationToken: cancellationToken);
  90. return result;
  91. }
  92. }
  93. }