2025-11-19 00:16:11 +05:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Net.Http;
|
|
|
|
|
|
using System.Net.Http.Headers;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using Intersvyaz.Net.Models;
|
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Intersvyaz.Net
|
|
|
|
|
|
{
|
|
|
|
|
|
public class IntersvyazClient
|
|
|
|
|
|
{
|
2025-11-19 10:34:23 +05:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// URL-адрес API.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private readonly Uri API_URI = new Uri("https://api.is74.ru");
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Клиент HTTP.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private HttpClient _httpClient;
|
2025-11-19 00:16:11 +05:00
|
|
|
|
|
2025-11-19 10:34:23 +05:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Событие при успешном входе в систему.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public event EventHandler<LoginResponseDto> OnLogin;
|
2025-11-19 00:16:11 +05:00
|
|
|
|
|
|
|
|
|
|
public IntersvyazClient()
|
|
|
|
|
|
{
|
2025-11-19 10:34:23 +05:00
|
|
|
|
_httpClient = new HttpClient()
|
2025-11-19 00:16:11 +05:00
|
|
|
|
{
|
2025-11-19 10:34:23 +05:00
|
|
|
|
BaseAddress = API_URI,
|
2025-11-19 00:16:11 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: Добавить здесь ссылку на репозитории.
|
2025-11-19 10:34:23 +05:00
|
|
|
|
_httpClient.DefaultRequestHeaders.UserAgent.Add(
|
2025-11-19 00:16:11 +05:00
|
|
|
|
new ProductInfoHeaderValue("Intersvyaz.Net", "1.0"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public IntersvyazClient(string token) : base()
|
|
|
|
|
|
{
|
2025-11-19 10:34:23 +05:00
|
|
|
|
_httpClient.DefaultRequestHeaders.Authorization
|
2025-11-19 00:16:11 +05:00
|
|
|
|
= new AuthenticationHeaderValue("Bearer", token);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-19 10:34:23 +05:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Вход в систему.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="username">Имя пользователя.</param>
|
|
|
|
|
|
/// <param name="password">Пароль пользователя.</param>
|
|
|
|
|
|
/// <returns>Ответ от системы.</returns>
|
2025-11-19 00:16:11 +05:00
|
|
|
|
public async Task<LoginResponseDto> Login(string username, string password)
|
|
|
|
|
|
{
|
|
|
|
|
|
var content = new JsonContent(new LoginRequestDto()
|
|
|
|
|
|
{
|
|
|
|
|
|
Username = username,
|
|
|
|
|
|
Password = password,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-11-19 10:34:23 +05:00
|
|
|
|
using (var message = await _httpClient.PostAsync("/auth/mobile", content))
|
2025-11-19 00:16:11 +05:00
|
|
|
|
{
|
|
|
|
|
|
var data = await message.Content.ReadAsStringAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if ((int)message.StatusCode == 422) // NOTE: Data Validation Error
|
|
|
|
|
|
{
|
|
|
|
|
|
var errors = JsonConvert.DeserializeObject<ValidationErrorDto[]>(data);
|
|
|
|
|
|
throw new InvalidOperationException(string.Join("; ", errors.Select(e => e.Message)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!message.IsSuccessStatusCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new InvalidOperationException("Неизвестная ошибка сервера");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var result = JsonConvert.DeserializeObject<LoginResponseDto>(data);
|
|
|
|
|
|
|
2025-11-19 10:34:23 +05:00
|
|
|
|
_httpClient.DefaultRequestHeaders.Authorization =
|
2025-11-19 00:16:11 +05:00
|
|
|
|
new AuthenticationHeaderValue("Bearer", result.Token);
|
2025-11-19 10:34:23 +05:00
|
|
|
|
OnLogin.Invoke(this, result);
|
2025-11-19 00:16:11 +05:00
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|