mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 22:26:31 +00:00
92 lines
3.0 KiB
C#
92 lines
3.0 KiB
C#
using System.IO;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Security;
|
|
using System.Text;
|
|
using Azaion.Common.DTO;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace Azaion.Common.Services;
|
|
|
|
public class AzaionApiClient(HttpClient httpClient) : IDisposable
|
|
{
|
|
const string JSON_MEDIA = "application/json";
|
|
|
|
private string Email { get; set; } = null!;
|
|
private SecureString Password { get; set; } = new();
|
|
private string JwtToken { get; set; } = null!;
|
|
|
|
public void Login(string email, string password)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(password))
|
|
throw new Exception("Email or password is empty!");
|
|
|
|
Email = email;
|
|
Password = password.ToSecureString();
|
|
}
|
|
|
|
public async Task<Stream> GetResource(string fileName, string password, HardwareInfo hardware)
|
|
{
|
|
var response = await Send(httpClient, new HttpRequestMessage(HttpMethod.Post, "/resources/get")
|
|
{
|
|
Content = new StringContent(JsonConvert.SerializeObject(new { fileName, password, hardware }), Encoding.UTF8, JSON_MEDIA)
|
|
});
|
|
return await response.Content.ReadAsStreamAsync();
|
|
}
|
|
|
|
private async Task<string> Authorize()
|
|
{
|
|
if (string.IsNullOrEmpty(Email) || Password.Length == 0)
|
|
throw new Exception("Email or password is empty! Please do Login first!");
|
|
|
|
var payload = new
|
|
{
|
|
email = Email,
|
|
password = Password.ToRealString()
|
|
};
|
|
var response = await httpClient.PostAsync(
|
|
"login",
|
|
new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, JSON_MEDIA));
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
throw new Exception($"Login failed: {response.StatusCode}");
|
|
|
|
var responseData = await response.Content.ReadAsStringAsync();
|
|
|
|
var result = JsonConvert.DeserializeObject<LoginResponse>(responseData);
|
|
|
|
if (string.IsNullOrEmpty(result?.Token))
|
|
throw new Exception("JWT Token not found in response");
|
|
|
|
return result.Token;
|
|
}
|
|
|
|
private async Task<HttpResponseMessage> Send(HttpClient client, HttpRequestMessage request)
|
|
{
|
|
if (string.IsNullOrEmpty(JwtToken))
|
|
JwtToken = await Authorize();
|
|
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", JwtToken);
|
|
var response = await client.SendAsync(request);
|
|
|
|
if (response.StatusCode == HttpStatusCode.Unauthorized)
|
|
{
|
|
JwtToken = await Authorize();
|
|
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", JwtToken);
|
|
response = await client.SendAsync(request);
|
|
}
|
|
|
|
if (response.IsSuccessStatusCode)
|
|
return response;
|
|
|
|
var result = await response.Content.ReadAsStringAsync();
|
|
throw new Exception($"Failed: {response.StatusCode}! Result: {result}");
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
httpClient.Dispose();
|
|
Password.Dispose();
|
|
}
|
|
}
|