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 { /// /// URL-адрес API. /// private readonly Uri API_URI = new Uri("https://api.is74.ru"); /// /// Клиент HTTP. /// private HttpClient _httpClient; /// /// Событие при успешном входе в систему. /// public event EventHandler OnLogin; public IntersvyazClient() { _httpClient = new HttpClient() { BaseAddress = API_URI, }; // TODO: Добавить здесь ссылку на репозитории. _httpClient.DefaultRequestHeaders.UserAgent.Add( new ProductInfoHeaderValue("Intersvyaz.Net", "1.0")); } public IntersvyazClient(string token) : base() { _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); } /// /// Вход в систему. /// /// Имя пользователя. /// Пароль пользователя. /// Ответ от системы. public async Task Login(string username, string password) { var content = new JsonContent(new LoginRequestDto() { Username = username, Password = password, }); using (var message = await _httpClient.PostAsync("/auth/mobile", content)) { var data = await message.Content.ReadAsStringAsync(); if ((int)message.StatusCode == 422) // NOTE: Data Validation Error { var errors = JsonConvert.DeserializeObject(data); throw new InvalidOperationException(string.Join("; ", errors.Select(e => e.Message))); } if (!message.IsSuccessStatusCode) { throw new InvalidOperationException("Неизвестная ошибка сервера"); } var result = JsonConvert.DeserializeObject(data); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.Token); OnLogin.Invoke(this, result); return result; } } } }