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; }
+ }
+}