using Hotline.Enterprise;
using Hotline.Share.Dtos;
using RestSharp;
using System.Collections;
using System.Text;
using Hotline.Share.Dtos.Enterprise;
using XF.Domain.Cache;
using XF.Domain.Exceptions;
namespace Hotline.YbEnterprise.Sdk
{
public class EnterpriseService : IEnterpriseService
{
private readonly RestClient _client;
private readonly EnterpriseConfig _config;
public EnterpriseService(EnterpriseConfig config)
{
_client = new RestClient();
_config = config;
}
///
/// 获取企业列表
///
///
///
///
///
///
public async Task GetEnterpriseList(string name = "", int current = 1, int size = 10, CancellationToken cancellationToken =default, ITypedCache cacheResponse = default)
{
var request = new EnterpriseListRequest
{
EnterpriseName = name,
Current = current,
Size = size
};
var token = await cacheResponse.GetAsync("EnterpriseResponse", cancellationToken);
if (token == null || (token != null && token.EndTime > DateTime.Now))
{
token = await GetTokenAsync(cancellationToken);
token.EndTime = DateTime.Now.AddMinutes(45);
await cacheResponse.SetAsync("EnterpriseResponse",token, cancellationToken: cancellationToken);
}
var path = _config.AddressUrl + "platform/12345/selectEnterpriseList";
var rest = new RestRequest(path, Method.Post);
rest.AddHeader("content-type", "application/json");
rest.AddHeader("Blade-Auth", token.TokenType + " " + token.AccessToken);
var res = await ExecuteAsync(path, Method.Post, request, rest, cancellationToken);
return res == null? null: res.data;
}
///
/// 获取TOKEN
///
///
///
///
public async Task GetTokenAsync(CancellationToken cancellationToken) {
string authorization = _config.ClientId + ":" + _config.ClientSecret;
authorization = Encoder.Base64Code(authorization);
authorization = authorization.Replace("@", "=");
var path = _config.AddressUrl + "blade-auth/oauth/getAccessToken";
var rest = new RestRequest(path, Method.Post);
rest.AddHeader("content-type", "application/json");
rest.AddHeader("Authorization", "Basic " + authorization);
rest.AddHeader("Tenant-Id", _config.TenantId);
var res = await ExecuteAsync(path, Method.Post,"", rest, cancellationToken);
if (res is null)
throw new UserFriendlyException("获取token请求失败");
if (!res.success)
throw new UserFriendlyException("获取token请求失败");
return res.data;
}
public async Task ExecuteAsync(string path, Method httpMethod, TRequest request, RestRequest restRequest = null,
CancellationToken cancellationToken = default)
where TRequest : class
{
var req = new RestRequest(path, httpMethod);
if (httpMethod is Method.Get)
{
req.AddObject(request);
}
else
{
req.AddJsonBody(request);
}
try
{
var response = await _client.ExecuteAsync(req, cancellationToken);
return response.Data;
}
catch (Exception e)
{
throw new HttpRequestException($"企业服务数据错误,Error: {e.Message}");
}
}
public static class Encoder
{
///
/// 对string 进行 Base64 编码
///
/// string 参数
/// Base64 编码
public static string Base64Code(string strMessage)
{
bool flag = string.IsNullOrEmpty(strMessage);
string result;
if (flag)
{
result = "";
}
else
{
char[] array = new char[]
{
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/',
'='
};
byte b = 0;
ArrayList arrayList = new ArrayList(Encoding.Default.GetBytes(strMessage));
int count = arrayList.Count;
int num = count / 3;
int num2 = count % 3;
bool flag2 = num2 > 0;
if (flag2)
{
for (int i = 0; i < 3 - num2; i++)
{
arrayList.Add(b);
}
num++;
}
StringBuilder stringBuilder = new StringBuilder(num * 4);
for (int i = 0; i < num; i++)
{
byte[] array2 = new byte[]
{
(byte)arrayList[i * 3],
(byte)arrayList[i * 3 + 1],
(byte)arrayList[i * 3 + 2]
};
int[] array3 = new int[4];
array3[0] = array2[0] >> 2;
array3[1] = ((int)(array2[0] & 3) << 4 ^ array2[1] >> 4);
bool flag3 = !array2[1].Equals(b);
if (flag3)
{
array3[2] = ((int)(array2[1] & 15) << 2 ^ array2[2] >> 6);
}
else
{
array3[2] = 64;
}
bool flag4 = !array2[2].Equals(b);
if (flag4)
{
array3[3] = (int)(array2[2] & 63);
}
else
{
array3[3] = 64;
}
stringBuilder.Append(array[array3[0]]);
stringBuilder.Append(array[array3[1]]);
stringBuilder.Append(array[array3[2]]);
stringBuilder.Append(array[array3[3]]);
}
string text = stringBuilder.ToString();
text = text.Replace("=", "@");
text = text.Replace("+", "%2B");
result = text;
}
return result;
}
}
}
}