Initial commit
This commit is contained in:
189
FarmmapsApi/Services/FarmmapsApiService.cs
Normal file
189
FarmmapsApi/Services/FarmmapsApiService.cs
Normal file
@@ -0,0 +1,189 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Mime;
|
||||
using System.Security.Authentication;
|
||||
using System.Threading.Tasks;
|
||||
using FarmmapsApi.Models;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using static IdentityModel.OidcConstants;
|
||||
|
||||
namespace FarmmapsApi.Services
|
||||
{
|
||||
public class FarmmapsApiService
|
||||
{
|
||||
private readonly HttpClient _httpClient;
|
||||
private readonly OpenIdConnectService _openIdConnectService;
|
||||
private readonly Configuration _configuration;
|
||||
|
||||
public FarmmapsApiService(HttpClient httpClient,
|
||||
OpenIdConnectService openIdConnectService, Configuration configuration)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_openIdConnectService = openIdConnectService;
|
||||
_configuration = configuration;
|
||||
|
||||
_httpClient.BaseAddress = new Uri(configuration.Endpoint);
|
||||
_httpClient.DefaultRequestHeaders.Add("Accept", MediaTypeNames.Application.Json);
|
||||
}
|
||||
|
||||
public async Task AuthenticateAsync()
|
||||
{
|
||||
if (_httpClient.DefaultRequestHeaders.Authorization != null &&
|
||||
_httpClient.DefaultRequestHeaders.Authorization.Scheme !=
|
||||
AuthenticationSchemes.AuthorizationHeaderBearer)
|
||||
throw new AuthenticationException("Already seems to be authenticated");
|
||||
|
||||
var disco = await _openIdConnectService.GetDiscoveryDocumentAsync();
|
||||
var token = await _openIdConnectService.GetTokenClientCredentialsAsync(disco.TokenEndpoint,
|
||||
_configuration.ClientId, _configuration.ClientSecret);
|
||||
|
||||
if (token.IsError)
|
||||
throw new AuthenticationException(token.Error);
|
||||
|
||||
_httpClient.DefaultRequestHeaders.Authorization =
|
||||
new AuthenticationHeaderValue(AuthenticationSchemes.AuthorizationHeaderBearer,
|
||||
token.AccessToken);
|
||||
}
|
||||
|
||||
public async Task<string> GetCurrentUserCodeAsync()
|
||||
{
|
||||
var response = await _httpClient.GetAsync(ResourceEndpoints.CURRENTUSER_RESOURCE);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
var json = JsonConvert.DeserializeObject<JObject>(jsonString);
|
||||
return json["code"].Value<string>();
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<UserRoot>> GetCurrentUserRootsAsync()
|
||||
{
|
||||
var response = await _httpClient.GetAsync(ResourceEndpoints.MYROOTS_RESOURCE);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
|
||||
return JsonConvert.DeserializeObject<List<UserRoot>>(jsonString);
|
||||
}
|
||||
|
||||
public async Task<Item> GetItemAsync(string itemCode)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMS_RESOURCE, itemCode);
|
||||
var response = await _httpClient.GetAsync(resourceUri);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
return JsonConvert.DeserializeObject<Item>(jsonString);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Item>> GetItemChildrenAsync(string itemCode)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMS_CHILDREN_RESOURCE, itemCode);
|
||||
var response = await _httpClient.GetAsync(resourceUri);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
return JsonConvert.DeserializeObject<IEnumerable<Item>>(jsonString);
|
||||
}
|
||||
|
||||
public async Task<Item> CreateItemAsync(ItemRequest itemRequest)
|
||||
{
|
||||
var jsonString = JsonConvert.SerializeObject(itemRequest);
|
||||
var response = await _httpClient.PostAsync(ResourceEndpoints.ITEMS_CREATE_RESOURCE,
|
||||
new StringContent(jsonString));
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonStringResponse = await response.Content.ReadAsStringAsync();
|
||||
return JsonConvert.DeserializeObject<Item>(jsonStringResponse);
|
||||
}
|
||||
|
||||
public async Task DeleteItemAsync(string itemCode)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMS_RESOURCE, itemCode);
|
||||
var response = await _httpClient.DeleteAsync(resourceUri);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
}
|
||||
|
||||
public async Task DeleteItemsAsync(IList<string> itemCodes)
|
||||
{
|
||||
var jsonString = JsonConvert.SerializeObject(itemCodes);
|
||||
var content = new StringContent(jsonString);
|
||||
var response = await _httpClient.PostAsync(ResourceEndpoints.ITEMS_DELETE_RESOURCE, content);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
}
|
||||
|
||||
public async Task DownloadItemAsync(string itemCode, string filePath)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMS_DOWNLOAD_RESOURCE, itemCode);
|
||||
var response = await _httpClient.GetAsync(resourceUri, HttpCompletionOption.ResponseHeadersRead);
|
||||
|
||||
if(response.IsSuccessStatusCode)
|
||||
{
|
||||
await using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
|
||||
await using Stream streamToWriteTo = File.Open(filePath, FileMode.Create);
|
||||
await streamToReadFrom.CopyToAsync(streamToWriteTo);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new FileNotFoundException(response.ReasonPhrase);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> QueueTaskAsync(string itemCode, TaskRequest taskRequest)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMTASK_REQUEST_RESOURCE, itemCode);
|
||||
|
||||
var jsonString = JsonConvert.SerializeObject(taskRequest);
|
||||
var response = await _httpClient.PostAsync(resourceUri, new StringContent(jsonString));
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonStringResponse = await response.Content.ReadAsStringAsync();
|
||||
var json = JsonConvert.DeserializeObject<JObject>(jsonStringResponse);
|
||||
|
||||
return json["code"].Value<string>();
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<ItemTaskStatus>> GetTasksStatusAsync(string itemCode)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMTASKS_RESOURCE, itemCode);
|
||||
var response = await _httpClient.GetAsync(resourceUri);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
return JsonConvert.DeserializeObject<List<ItemTaskStatus>>(jsonString);
|
||||
}
|
||||
|
||||
public async Task<ItemTaskStatus> GetTaskStatusAsync(string itemCode, string itemTaskCode)
|
||||
{
|
||||
var resourceUri = string.Format(ResourceEndpoints.ITEMTASK_RESOURCE, itemCode, itemTaskCode);
|
||||
var response = await _httpClient.GetAsync(resourceUri);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
throw new Exception(response.ReasonPhrase);
|
||||
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
return JsonConvert.DeserializeObject<ItemTaskStatus>(jsonString);
|
||||
}
|
||||
}
|
||||
}
|
54
FarmmapsApi/Services/OpenIdConnectService.cs
Normal file
54
FarmmapsApi/Services/OpenIdConnectService.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using FarmmapsApi.Models;
|
||||
using IdentityModel.Client;
|
||||
|
||||
namespace FarmmapsApi.Services
|
||||
{
|
||||
public class OpenIdConnectService
|
||||
{
|
||||
private readonly IDiscoveryCache _discoveryCache;
|
||||
private readonly Configuration _configuration;
|
||||
private readonly HttpClient _httpClient;
|
||||
|
||||
public OpenIdConnectService(IDiscoveryCache discoveryCache,
|
||||
IHttpClientFactory httpFactory, Configuration configuration)
|
||||
{
|
||||
_discoveryCache = discoveryCache;
|
||||
_configuration = configuration;
|
||||
_httpClient = httpFactory.CreateClient();
|
||||
}
|
||||
|
||||
public async Task<DiscoveryDocumentResponse> GetDiscoveryDocumentAsync()
|
||||
{
|
||||
var disco = await _discoveryCache.GetAsync();
|
||||
if (disco.IsError)
|
||||
throw new Exception(disco.Error);
|
||||
|
||||
return disco;
|
||||
}
|
||||
|
||||
public async Task<TokenResponse> GetTokenClientCredentialsAsync(string tokenEndpointUrl, string clientId, string clientSecret)
|
||||
{
|
||||
return await _httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest()
|
||||
{
|
||||
Address = tokenEndpointUrl,
|
||||
ClientId = clientId,
|
||||
ClientSecret = clientSecret,
|
||||
Scope = string.Join(" ", _configuration.Scopes)
|
||||
});
|
||||
}
|
||||
|
||||
public async Task<TokenResponse> RefreshTokensAsync(string tokenEndpointUrl, string refreshToken)
|
||||
{
|
||||
return await _httpClient.RequestRefreshTokenAsync(new RefreshTokenRequest()
|
||||
{
|
||||
Address = tokenEndpointUrl,
|
||||
ClientId = _configuration.ClientId,
|
||||
ClientSecret = _configuration.ClientSecret,
|
||||
RefreshToken = refreshToken
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user