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.Domain.Models.Requests { /// /// 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."; } } }