diff --git a/Birdmap.API/Controllers/DevicesController.cs b/Birdmap.API/Controllers/DevicesController.cs
index 2791598..1cec346 100644
--- a/Birdmap.API/Controllers/DevicesController.cs
+++ b/Birdmap.API/Controllers/DevicesController.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Authorization;
namespace Birdmap.API.Controllers
{
- [Authorize]
+ [Authorize(Roles = "Admin")]
[ApiController]
[Route("api/[controller]")]
public class DevicesController : ControllerBase
@@ -26,6 +26,7 @@ namespace Birdmap.API.Controllers
/// Get all device info
/// Array of devices
+ [Authorize(Roles = "User,Admin")]
[HttpGet]
public async Task>> Getall()
{
@@ -61,6 +62,7 @@ namespace Birdmap.API.Controllers
/// Get all device info
/// ID of device to query
/// Information about a particular device
+ [Authorize(Roles = "User,Admin")]
[HttpGet, Route("{deviceID}")]
public async Task> Getdevice([BindRequired] Guid deviceID)
{
@@ -99,6 +101,7 @@ namespace Birdmap.API.Controllers
/// ID of device to query
/// ID of sensor to query
/// Information about a sensor
+ [Authorize(Roles = "User,Admin")]
[HttpGet, Route("{deviceID}/{sensorID}")]
public async Task> Getsensor([BindRequired] Guid deviceID, [BindRequired] Guid sensorID)
{
diff --git a/Birdmap.API/Controllers/ServicesController.cs b/Birdmap.API/Controllers/ServicesController.cs
index 6da1729..085b9fc 100644
--- a/Birdmap.API/Controllers/ServicesController.cs
+++ b/Birdmap.API/Controllers/ServicesController.cs
@@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace Birdmap.API.Controllers
{
- [Authorize]
+ [Authorize(Roles = "Admin")]
[ApiController]
[Route("api/[controller]")]
public class ServicesController : ControllerBase
@@ -30,6 +30,7 @@ namespace Birdmap.API.Controllers
_logger = logger;
}
+ [Authorize(Roles = "User,Admin")]
[HttpGet, ProducesResponseType(StatusCodes.Status200OK)]
public async Task>> GetAsync()
{
diff --git a/Birdmap.BLL/Helpers/IEnumerableExtensions.cs b/Birdmap.BLL/Helpers/IEnumerableExtensions.cs
new file mode 100644
index 0000000..a103ea2
--- /dev/null
+++ b/Birdmap.BLL/Helpers/IEnumerableExtensions.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Birdmap.BLL.Helpers
+{
+ public static class IEnumerableExtensions
+ {
+ public static TSource RandomElementAt(this IEnumerable source, Random random = null)
+ {
+ random ??= new Random();
+
+ return source.ElementAt(random.Next(source.Count()));
+ }
+ }
+}
diff --git a/Birdmap.BLL/Interfaces/IInputService.cs b/Birdmap.BLL/Interfaces/IInputService.cs
new file mode 100644
index 0000000..6584309
--- /dev/null
+++ b/Birdmap.BLL/Interfaces/IInputService.cs
@@ -0,0 +1,163 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Birdmap.BLL.Interfaces
+{
+
+ [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")]
+ public partial interface IInputService
+ {
+ /// Get input object by ID
+ /// ID of input object file
+ /// input object
+ /// A server side error occurred.
+ System.Threading.Tasks.Task GetInputAsync(System.Guid tagID);
+
+ /// A cancellation token that can be used by other objects or threads to receive notice of cancellation.
+ /// Get input object by ID
+ /// ID of input object file
+ /// input object
+ /// A server side error occurred.
+ System.Threading.Tasks.Task GetInputAsync(System.Guid tagID, System.Threading.CancellationToken cancellationToken);
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ public partial class InputSingeResponse
+ {
+ [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
+ public string Status { get; set; }
+
+ [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required]
+ public InputObject Message { get; set; } = new InputObject();
+
+ private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary();
+
+ [Newtonsoft.Json.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties; }
+ set { _additionalProperties = value; }
+ }
+
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ public partial class InputResponse : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ public partial class InputObject
+ {
+ [Newtonsoft.Json.JsonProperty("tag", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
+ public System.Guid Tag { get; set; }
+
+ [Newtonsoft.Json.JsonProperty("date", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
+ [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
+ public System.DateTimeOffset Date { get; set; }
+
+ [Newtonsoft.Json.JsonProperty("device_id", Required = Newtonsoft.Json.Required.Always)]
+ public Guid Device_id { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary();
+
+ [Newtonsoft.Json.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties; }
+ set { _additionalProperties = value; }
+ }
+
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ public partial class ApiResponse
+ {
+ [Newtonsoft.Json.JsonProperty("status", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
+ public string Status { get; set; }
+
+ [Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
+ [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
+ public string Message { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary();
+
+ [Newtonsoft.Json.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties; }
+ set { _additionalProperties = value; }
+ }
+
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ public partial class Description
+ {
+ [Newtonsoft.Json.JsonProperty("deviceid", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
+ public string Deviceid { get; set; }
+
+ [Newtonsoft.Json.JsonProperty("date", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
+ [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
+ public System.DateTimeOffset Date { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties = new System.Collections.Generic.Dictionary();
+
+ [Newtonsoft.Json.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties; }
+ set { _additionalProperties = value; }
+ }
+
+
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
+ internal class DateFormatConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter
+ {
+ public DateFormatConverter()
+ {
+ DateTimeFormat = "yyyy-MM-dd";
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")]
+ public partial class FileParameter
+ {
+ public FileParameter(System.IO.Stream data)
+ : this(data, null, null)
+ {
+ }
+
+ public FileParameter(System.IO.Stream data, string fileName)
+ : this(data, fileName, null)
+ {
+ }
+
+ public FileParameter(System.IO.Stream data, string fileName, string contentType)
+ {
+ Data = data;
+ FileName = fileName;
+ ContentType = contentType;
+ }
+
+ public System.IO.Stream Data { get; private set; }
+
+ public string FileName { get; private set; }
+
+ public string ContentType { get; private set; }
+ }
+
+}
diff --git a/Birdmap.BLL/Services/DeviceServiceBase.cs b/Birdmap.BLL/Services/DeviceAndInputServiceBase.cs
similarity index 87%
rename from Birdmap.BLL/Services/DeviceServiceBase.cs
rename to Birdmap.BLL/Services/DeviceAndInputServiceBase.cs
index aeab79d..9e421fa 100644
--- a/Birdmap.BLL/Services/DeviceServiceBase.cs
+++ b/Birdmap.BLL/Services/DeviceAndInputServiceBase.cs
@@ -6,8 +6,12 @@ using System.Threading.Tasks;
namespace Birdmap.BLL.Services
{
- public abstract class DeviceServiceBase : IDeviceService
+ public abstract class DeviceAndInputServiceBase : IDeviceService, IInputService
{
+ public virtual Task GetInputAsync(Guid tagID)
+ => GetInputAsync(tagID, CancellationToken.None);
+ public abstract Task GetInputAsync(Guid tagID, CancellationToken cancellationToken);
+
public virtual Task> GetallAsync()
=> GetallAsync(CancellationToken.None);
public abstract Task> GetallAsync(CancellationToken cancellationToken);
diff --git a/Birdmap.BLL/Services/DummyDeviceService.cs b/Birdmap.BLL/Services/DummyDeviceAndInputService.cs
similarity index 66%
rename from Birdmap.BLL/Services/DummyDeviceService.cs
rename to Birdmap.BLL/Services/DummyDeviceAndInputService.cs
index 617a83a..1728ae9 100644
--- a/Birdmap.BLL/Services/DummyDeviceService.cs
+++ b/Birdmap.BLL/Services/DummyDeviceAndInputService.cs
@@ -1,4 +1,5 @@
-using Birdmap.BLL.Interfaces;
+using Birdmap.BLL.Helpers;
+using Birdmap.BLL.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -7,33 +8,40 @@ using System.Threading.Tasks;
namespace Birdmap.BLL.Services
{
- public class DummyDeviceService : DeviceServiceBase
+ public class DummyDeviceAndInputService : DeviceAndInputServiceBase
{
+ private const int numberOfDevices = 15;
+
private const double centerLong = 21.469640;
private const double centerLat = 48.275939;
private const double radius = 0.000200;
- private readonly Lazy> _devices = new Lazy>(GenerateDevices);
+ private static readonly Random Rand = new Random();
+
+ private static readonly Lazy> Devices = new Lazy>(GenerateDevices);
+
+ private static readonly Dictionary TagToInput = new Dictionary();
+ private static readonly object InputLock = new object();
+
private static ListOfDevices GenerateDevices()
{
var devices = new ListOfDevices();
- var rand = new Random();
T GetRandomEnum()
{
var values = Enum.GetValues(typeof(T));
- return (T)values.GetValue(rand.Next(values.Length));
+ return (T)values.GetValue(Rand.Next(values.Length));
}
double GetPlusMinus(double center, double radius)
{
- return center - radius + rand.NextDouble() * radius * 2;
+ return center - radius + Rand.NextDouble() * radius * 2;
}
- for (int d = 0; d < 15; d++)
+ for (int d = 0; d < numberOfDevices; d++)
{
var sensors = new ArrayofSensors();
- for (int s = 0; s < rand.Next(1, 5); s++)
+ for (int s = 0; s < Rand.Next(1, 6); s++)
{
sensors.Add(new Sensor
{
@@ -61,17 +69,17 @@ namespace Birdmap.BLL.Services
public override Task> GetallAsync(CancellationToken cancellationToken)
{
- return Task.FromResult(_devices.Value);
+ return Task.FromResult(Devices.Value);
}
public override Task GetdeviceAsync(Guid deviceID, CancellationToken cancellationToken)
{
- return Task.FromResult(_devices.Value.SingleOrDefault(d => d.Id == deviceID));
+ return Task.FromResult(Devices.Value.SingleOrDefault(d => d.Id == deviceID));
}
public override Task GetsensorAsync(Guid deviceID, Guid sensorID, CancellationToken cancellationToken)
{
- return Task.FromResult(_devices.Value.SingleOrDefault(d => d.Id == deviceID)?.Sensors.SingleOrDefault(s => s.Id == sensorID));
+ return Task.FromResult(Devices.Value.SingleOrDefault(d => d.Id == deviceID)?.Sensors.SingleOrDefault(s => s.Id == sensorID));
}
public override Task OfflineallAsync(CancellationToken cancellationToken)
@@ -114,7 +122,7 @@ namespace Birdmap.BLL.Services
private void SetStatus(DeviceStatus deviceStatus, SensorStatus sensorStatus)
{
- foreach (var device in _devices.Value)
+ foreach (var device in Devices.Value)
{
device.Status = deviceStatus;
foreach (var sensor in device.Sensors)
@@ -135,5 +143,29 @@ namespace Birdmap.BLL.Services
var sensor = GetsensorAsync(deviceId, sensorID).Result;
sensor.Status = status;
}
+
+ public override Task GetInputAsync(Guid tagID, CancellationToken cancellationToken)
+ {
+ lock (InputLock)
+ {
+ if (!TagToInput.TryGetValue(tagID, out var value))
+ {
+ value = new InputSingeResponse
+ {
+ Status = "Dummy_OK",
+ Message = new InputObject
+ {
+ Tag = tagID,
+ Date = DateTime.Now,
+ Device_id = Devices.Value.Where(d => d.Status == DeviceStatus.Online).RandomElementAt(Rand).Id,
+ }
+ };
+
+ TagToInput.TryAdd(tagID, value);
+ }
+
+ return Task.FromResult(value);
+ }
+ }
}
}
diff --git a/Birdmap.BLL/Services/LiveInputService.cs b/Birdmap.BLL/Services/LiveInputService.cs
new file mode 100644
index 0000000..d231010
--- /dev/null
+++ b/Birdmap.BLL/Services/LiveInputService.cs
@@ -0,0 +1,477 @@
+//----------------------
+//
+// Generated using the NSwag toolchain v13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org)
+//
+//----------------------
+
+#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
+#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
+#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
+#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
+#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
+
+namespace Birdmap.BLL.Services
+{
+ using Birdmap.BLL.Interfaces;
+ using System = global::System;
+
+ [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")]
+ public partial class LiveInputService : IInputService
+ {
+ private string _baseUrl = "https://birb.k8s.kmlabz.com";
+ private System.Net.Http.HttpClient _httpClient;
+ private System.Lazy _settings;
+
+ public LiveInputService(System.Net.Http.HttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ _settings = new System.Lazy(CreateSerializerSettings);
+ }
+
+ private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
+ {
+ var settings = new Newtonsoft.Json.JsonSerializerSettings();
+ UpdateJsonSerializerSettings(settings);
+ return settings;
+ }
+
+ public string BaseUrl
+ {
+ get { return _baseUrl; }
+ set { _baseUrl = value; }
+ }
+
+ protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } }
+
+ partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings);
+ partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
+ partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
+ partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
+
+ /// Get all stored input queries
+ /// Array of input objects
+ /// A server side error occurred.
+ public System.Threading.Tasks.Task> GetallAsync()
+ {
+ return GetallAsync(System.Threading.CancellationToken.None);
+ }
+
+ /// A cancellation token that can be used by other objects or threads to receive notice of cancellation.
+ /// Get all stored input queries
+ /// Array of input objects
+ /// A server side error occurred.
+ public async System.Threading.Tasks.Task> GetallAsync(System.Threading.CancellationToken cancellationToken)
+ {
+ var urlBuilder_ = new System.Text.StringBuilder();
+ urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample");
+
+ var client_ = _httpClient;
+ var disposeClient_ = false;
+ try
+ {
+ using (var request_ = new System.Net.Http.HttpRequestMessage())
+ {
+ request_.Method = new System.Net.Http.HttpMethod("GET");
+ request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
+
+ PrepareRequest(client_, request_, urlBuilder_);
+ var url_ = urlBuilder_.ToString();
+ request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
+ PrepareRequest(client_, request_, url_);
+
+ var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
+ var disposeResponse_ = true;
+ try
+ {
+ var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
+ if (response_.Content != null && response_.Content.Headers != null)
+ {
+ foreach (var item_ in response_.Content.Headers)
+ headers_[item_.Key] = item_.Value;
+ }
+
+ ProcessResponse(client_, response_);
+
+ var status_ = (int)response_.StatusCode;
+ if (status_ == 200)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ return objectResponse_.Object;
+ }
+ else
+ if (status_ == 404)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("No object matching filter", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ {
+ var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
+ throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
+ }
+ }
+ finally
+ {
+ if (disposeResponse_)
+ response_.Dispose();
+ }
+ }
+ }
+ finally
+ {
+ if (disposeClient_)
+ client_.Dispose();
+ }
+ }
+
+ /// uploads a sample into the system
+ /// successful operation
+ /// A server side error occurred.
+ public System.Threading.Tasks.Task UploadFileAsync(Description description, FileParameter file)
+ {
+ return UploadFileAsync(description, file, System.Threading.CancellationToken.None);
+ }
+
+ /// A cancellation token that can be used by other objects or threads to receive notice of cancellation.
+ /// uploads a sample into the system
+ /// successful operation
+ /// A server side error occurred.
+ public async System.Threading.Tasks.Task UploadFileAsync(Description description, FileParameter file, System.Threading.CancellationToken cancellationToken)
+ {
+ var urlBuilder_ = new System.Text.StringBuilder();
+ urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample");
+
+ var client_ = _httpClient;
+ var disposeClient_ = false;
+ try
+ {
+ using (var request_ = new System.Net.Http.HttpRequestMessage())
+ {
+ var boundary_ = System.Guid.NewGuid().ToString();
+ var content_ = new System.Net.Http.MultipartFormDataContent(boundary_);
+ content_.Headers.Remove("Content-Type");
+ content_.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary_);
+ if (description == null)
+ throw new System.ArgumentNullException("description");
+ else
+ {
+ content_.Add(new System.Net.Http.StringContent(ConvertToString(description, System.Globalization.CultureInfo.InvariantCulture)), "description");
+ }
+ if (file == null)
+ throw new System.ArgumentNullException("file");
+ else
+ {
+ var content_file_ = new System.Net.Http.StreamContent(file.Data);
+ if (!string.IsNullOrEmpty(file.ContentType))
+ content_file_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(file.ContentType);
+ content_.Add(content_file_, "file", file.FileName ?? "file");
+ }
+ request_.Content = content_;
+ request_.Method = new System.Net.Http.HttpMethod("POST");
+ request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
+
+ PrepareRequest(client_, request_, urlBuilder_);
+ var url_ = urlBuilder_.ToString();
+ request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
+ PrepareRequest(client_, request_, url_);
+
+ var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
+ var disposeResponse_ = true;
+ try
+ {
+ var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
+ if (response_.Content != null && response_.Content.Headers != null)
+ {
+ foreach (var item_ in response_.Content.Headers)
+ headers_[item_.Key] = item_.Value;
+ }
+
+ ProcessResponse(client_, response_);
+
+ var status_ = (int)response_.StatusCode;
+ if (status_ == 200)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ return objectResponse_.Object;
+ }
+ else
+ if (status_ == 400)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("JSON parse error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ if (status_ == 415)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("Media type error", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ if (status_ == 417)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("JSON invalid schema", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ if (status_ == 469)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("No file found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ if (status_ == 470)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("Description missing", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ {
+ var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
+ throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
+ }
+ }
+ finally
+ {
+ if (disposeResponse_)
+ response_.Dispose();
+ }
+ }
+ }
+ finally
+ {
+ if (disposeClient_)
+ client_.Dispose();
+ }
+ }
+
+ /// Get input object by ID
+ /// ID of input object file
+ /// input object
+ /// A server side error occurred.
+ public System.Threading.Tasks.Task GetInputAsync(System.Guid tagID)
+ {
+ return GetInputAsync(tagID, System.Threading.CancellationToken.None);
+ }
+
+ /// A cancellation token that can be used by other objects or threads to receive notice of cancellation.
+ /// Get input object by ID
+ /// ID of input object file
+ /// input object
+ /// A server side error occurred.
+ public async System.Threading.Tasks.Task GetInputAsync(System.Guid tagID, System.Threading.CancellationToken cancellationToken)
+ {
+ if (tagID == null)
+ throw new System.ArgumentNullException("tagID");
+
+ var urlBuilder_ = new System.Text.StringBuilder();
+ urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/sample/{tagID}");
+ urlBuilder_.Replace("{tagID}", System.Uri.EscapeDataString(ConvertToString(tagID, System.Globalization.CultureInfo.InvariantCulture)));
+
+ var client_ = _httpClient;
+ var disposeClient_ = false;
+ try
+ {
+ using (var request_ = new System.Net.Http.HttpRequestMessage())
+ {
+ request_.Method = new System.Net.Http.HttpMethod("GET");
+ request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
+
+ PrepareRequest(client_, request_, urlBuilder_);
+ var url_ = urlBuilder_.ToString();
+ request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
+ PrepareRequest(client_, request_, url_);
+
+ var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
+ var disposeResponse_ = true;
+ try
+ {
+ var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
+ if (response_.Content != null && response_.Content.Headers != null)
+ {
+ foreach (var item_ in response_.Content.Headers)
+ headers_[item_.Key] = item_.Value;
+ }
+
+ ProcessResponse(client_, response_);
+
+ var status_ = (int)response_.StatusCode;
+ if (status_ == 200)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ return objectResponse_.Object;
+ }
+ else
+ if (status_ == 404)
+ {
+ var objectResponse_ = await ReadObjectResponseAsync(response_, headers_).ConfigureAwait(false);
+ if (objectResponse_.Object == null)
+ {
+ throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
+ }
+ throw new ApiException("Tag not found", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
+ }
+ else
+ {
+ var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
+ throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
+ }
+ }
+ finally
+ {
+ if (disposeResponse_)
+ response_.Dispose();
+ }
+ }
+ }
+ finally
+ {
+ if (disposeClient_)
+ client_.Dispose();
+ }
+ }
+
+ protected struct ObjectResponseResult
+ {
+ public ObjectResponseResult(T responseObject, string responseText)
+ {
+ this.Object = responseObject;
+ this.Text = responseText;
+ }
+
+ public T Object { get; }
+
+ public string Text { get; }
+ }
+
+ public bool ReadResponseAsString { get; set; }
+
+ protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers)
+ {
+ if (response == null || response.Content == null)
+ {
+ return new ObjectResponseResult(default(T), string.Empty);
+ }
+
+ if (ReadResponseAsString)
+ {
+ var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+ try
+ {
+ var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject(responseText, JsonSerializerSettings);
+ return new ObjectResponseResult(typedBody, responseText);
+ }
+ catch (Newtonsoft.Json.JsonException exception)
+ {
+ var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
+ throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
+ }
+ }
+ else
+ {
+ try
+ {
+ using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
+ using (var streamReader = new System.IO.StreamReader(responseStream))
+ using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
+ {
+ var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings);
+ var typedBody = serializer.Deserialize(jsonTextReader);
+ return new ObjectResponseResult(typedBody, string.Empty);
+ }
+ }
+ catch (Newtonsoft.Json.JsonException exception)
+ {
+ var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
+ throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
+ }
+ }
+ }
+
+ private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
+ {
+ if (value == null)
+ {
+ return null;
+ }
+
+ if (value is System.Enum)
+ {
+ var name = System.Enum.GetName(value.GetType(), value);
+ if (name != null)
+ {
+ var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
+ if (field != null)
+ {
+ var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
+ as System.Runtime.Serialization.EnumMemberAttribute;
+ if (attribute != null)
+ {
+ return attribute.Value != null ? attribute.Value : name;
+ }
+ }
+
+ return System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
+ }
+ }
+ else if (value is bool)
+ {
+ return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
+ }
+ else if (value is byte[])
+ {
+ return System.Convert.ToBase64String((byte[])value);
+ }
+ else if (value.GetType().IsArray)
+ {
+ var array = System.Linq.Enumerable.OfType