using System;
using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Wino.Core.Domain.Interfaces;
namespace Wino.Core.Requests.Bundles
{
///
/// Bundle that encapsulates batch request and native request without a response.
///
/// Http type for each integrator. eg. ClientServiceRequest for Gmail and RequestInformation for Microsoft Graph.
/// Native type to send via http.
/// Batch request that is generated by base synchronizer.
public record HttpRequestBundle(TRequest NativeRequest, IRequestBase Request) : IRequestBundle
{
public string BundleId { get; set; } = string.Empty;
public override string ToString()
{
if (Request is IRequest singleRequest)
return $"Single {singleRequest.Operation}. No response.";
else if (Request is IBatchChangeRequest batchChangeRequest)
return $"Batch {batchChangeRequest.Operation} for {batchChangeRequest.Items.Count()} items. No response.";
else
return "Unknown http request bundle.";
}
}
///
/// Bundle that encapsulates batch request and native request with response.
///
/// Http type for each integrator. eg. ClientServiceRequest for Gmail and RequestInformation for Microsoft Graph.
/// Native type to send via http.
/// Batch request that is generated by base synchronizer.
public record HttpRequestBundle(TRequest NativeRequest, IRequestBase Request) : HttpRequestBundle(NativeRequest, Request)
{
public async Task DeserializeBundleAsync(HttpResponseMessage httpResponse, CancellationToken cancellationToken = default)
{
var content = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
return JsonSerializer.Deserialize(content) ?? throw new InvalidOperationException("Invalid Http Response Deserialization");
}
public override string ToString()
{
if (Request is IRequest singleRequest)
return $"Single {singleRequest.Operation}. Expecting '{typeof(TResponse).FullName}' type.";
else if (Request is IBatchChangeRequest batchChangeRequest)
return $"Batch {batchChangeRequest.Operation} for {batchChangeRequest.Items.Count()} items. Expecting '{typeof(TResponse).FullName}' type.";
else
return "Unknown http request bundle.";
}
}
}