using Hotline.Enterprise; using Hotline.Share.Dtos; using RestSharp; using System.Collections; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text; using Hotline.Share.Dtos.Enterprise; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using XF.Domain.Cache; using XF.Domain.Exceptions; using XF.Domain.Dependency; namespace Hotline.YbEnterprise.Sdk { public class EnterpriseService : IEnterpriseService, IScopeDependency { private readonly IHttpClientFactory _httpClientFactory; private readonly IOptionsSnapshot _enterpriseOptions; private readonly ITypedCache _tokenCache; private readonly ILogger _logger; public EnterpriseService( IHttpClientFactory httpClientFactory, IOptionsSnapshot enterpriseOptions, ITypedCache tokenCache, ILogger logger) { _httpClientFactory = httpClientFactory; _enterpriseOptions = enterpriseOptions; _tokenCache = tokenCache; _logger = logger; } /// /// 获取企业列表 /// /// /// /// /// /// public async Task QueryYbEnterprisesAsync( string name, int current, int size, CancellationToken cancellationToken) { var request = new YbEnterprisesRequest() { EnterpriseName = name, Current = current, Size = size }; var token = await GetTokenAsync(YbEnterpriseDefaults.KeyOfToken, cancellationToken); var result = await ExecuteAsync>( YbEnterpriseDefaults.PathEnterprises, request, d => d.DefaultRequestHeaders.Add("Blade-Auth", $"{token.TokenType} {token.AccessToken}"), cancellationToken); if (result is null || !result.Success) throw new UserFriendlyException("未获取到企业专班数据"); return result.Data; } private async Task GetTokenAsync(string key, CancellationToken cancellationToken) { var token = await _tokenCache.GetAsync(key, cancellationToken); if (token is not null) return token; token = await GetTokenAsync(cancellationToken); await _tokenCache.SetAsync(key, token, TimeSpan.FromSeconds(token.ExpiresIn - 5), cancellationToken); return token; } private async Task GetTokenAsync(CancellationToken cancellationToken) { var config = _enterpriseOptions.Value; string authorization = config.ClientId + ":" + config.ClientSecret; authorization = Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization)); var result = await ExecuteAsync>( YbEnterpriseDefaults.PathToken, new(), d => { d.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse($"Basic {authorization}"); d.DefaultRequestHeaders.Add("Tenant-Id", config.TenantId); }, cancellationToken); if (result is null || !result.Success) throw new UserFriendlyException("获取enterprise token失败"); return result.Data; } private async Task ExecuteAsync(string path, TRequest request, Action? clientInitialize = null, CancellationToken cancellationToken = default) { var client = _httpClientFactory.CreateClient(YbEnterpriseDefaults.HttpName); clientInitialize?.Invoke(client); using var responseMessage = await client.PostAsJsonAsync(path, request, cancellationToken); responseMessage.EnsureSuccessStatusCode(); var result = await responseMessage.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); return result; } } }