diff --git a/src/Intersvyaz.Net/Class1.cs b/src/Intersvyaz.Net/Class1.cs deleted file mode 100644 index a7c29d5..0000000 --- a/src/Intersvyaz.Net/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Intersvyaz.Net -{ - public class Class1 - { - } -} diff --git a/src/Intersvyaz.Net/Intersvyaz.Net.csproj b/src/Intersvyaz.Net/Intersvyaz.Net.csproj index b290d67..d4cb484 100644 --- a/src/Intersvyaz.Net/Intersvyaz.Net.csproj +++ b/src/Intersvyaz.Net/Intersvyaz.Net.csproj @@ -4,4 +4,8 @@ netstandard1.4 + + + + diff --git a/src/Intersvyaz.Net/IntersvyazClient.cs b/src/Intersvyaz.Net/IntersvyazClient.cs new file mode 100644 index 0000000..5ab752c --- /dev/null +++ b/src/Intersvyaz.Net/IntersvyazClient.cs @@ -0,0 +1,67 @@ +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 + { + private readonly Uri BASE_ADDRESS = new Uri("https://api.is74.ru"); + + private HttpClient httpClient; + + public IntersvyazClient() + { + httpClient = new HttpClient() + { + BaseAddress = BASE_ADDRESS, + }; + + // 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); + + return result; + } + } + } +} diff --git a/src/Intersvyaz.Net/JsonContent.cs b/src/Intersvyaz.Net/JsonContent.cs new file mode 100644 index 0000000..223f798 --- /dev/null +++ b/src/Intersvyaz.Net/JsonContent.cs @@ -0,0 +1,20 @@ +using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System.Net.Http; + +namespace Intersvyaz.Net +{ + public class JsonContent : StringContent + { + public JsonContent(object value) : base(Serialize(value), Encoding.UTF8, "application/json") { } + + private static string Serialize(object value) + { + return JsonConvert.SerializeObject(value, Formatting.None, new JsonSerializerSettings() + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + }); + } + } +} diff --git a/src/Intersvyaz.Net/Models/LoginRequestDto.cs b/src/Intersvyaz.Net/Models/LoginRequestDto.cs new file mode 100644 index 0000000..ba9f567 --- /dev/null +++ b/src/Intersvyaz.Net/Models/LoginRequestDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Intersvyaz.Net.Models +{ + public class LoginRequestDto + { + public string Username { get; set; } + + public string Password { get; set; } + } +} diff --git a/src/Intersvyaz.Net/Models/LoginResponseDto.cs b/src/Intersvyaz.Net/Models/LoginResponseDto.cs new file mode 100644 index 0000000..2468be5 --- /dev/null +++ b/src/Intersvyaz.Net/Models/LoginResponseDto.cs @@ -0,0 +1,41 @@ +using System; +using Newtonsoft.Json; + +namespace Intersvyaz.Net.Models +{ + public class LoginResponseDto + { + [JsonProperty("USER_ID")] + public long UserId { get; set; } + + [JsonProperty("PROFILE_ID")] + public long? ProfileId { get; set; } + + [JsonProperty("APP")] + public string Application { get; set; } + + [JsonProperty("ACCESS_BEGIN")] + public DateTime AccessBegin { get; set; } + + [JsonProperty("ACCESS_END")] + public DateTime AccessEnd { get; set; } + + [JsonProperty("TOKEN")] + public string Token { get; set; } + + [JsonProperty("AUTH_TYPE")] + public string AuthenticationType { get; set; } + + [JsonProperty("UNIQUE_DEVICE_ID")] + public string UniqueDeviceId { get; set; } + + [JsonProperty("PHONE")] + public int Phone { get; set; } + + [JsonProperty("LAST_CHECK_DATE")] + public DateTime LastCheckTime { get; set; } + + [JsonProperty("ACCESS_END_LEFT")] + public long AccessEndLeft { get; set; } + } +} diff --git a/src/Intersvyaz.Net/Models/ValidationErrorDto.cs b/src/Intersvyaz.Net/Models/ValidationErrorDto.cs new file mode 100644 index 0000000..bacfc18 --- /dev/null +++ b/src/Intersvyaz.Net/Models/ValidationErrorDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Intersvyaz.Net.Models +{ + public class ValidationErrorDto + { + public string Field { get; set; } + + public string Message { get; set; } + } +}