src/Relecloud.Web.CallCenter/Services/RelecloudApiServices/RelecloudApiTicketPurchaseService.cs (48 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All Rights Reserved. // Licensed under the MIT License. using Microsoft.Extensions.Options; using Microsoft.Identity.Web; using Relecloud.Models.TicketManagement; using Relecloud.Web.CallCenter.Infrastructure; using System.Net; using System.Net.Http.Headers; using System.Text.Json; namespace Relecloud.Web.CallCenter.Services.RelecloudApiServices { public class RelecloudApiTicketPurchaseService : ITicketPurchaseService { private readonly HttpClient httpClient; private readonly IHttpContextAccessor httpContextAccessor; private readonly ITokenAcquisition tokenAcquisition; private readonly IOptions<RelecloudApiOptions> options; public RelecloudApiTicketPurchaseService(IHttpContextAccessor httpContextAccessor, HttpClient httpClient, ITokenAcquisition tokenAcquisition, IOptions<RelecloudApiOptions> options) { this.httpContextAccessor = httpContextAccessor; this.httpClient = httpClient; this.tokenAcquisition = tokenAcquisition; this.options = options; } public async Task<PurchaseTicketsResult> PurchaseTicketAsync(PurchaseTicketsRequest request) { await PrepareAuthenticatedClient(); var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "api/Ticket/Purchase"); httpRequestMessage.Content = JsonContent.Create(request); var httpResponseMessage = await this.httpClient.SendAsync(httpRequestMessage); var responseMessage = await httpResponseMessage.Content.ReadAsStringAsync(); if (httpResponseMessage.StatusCode != HttpStatusCode.Accepted) { throw new InvalidOperationException(nameof(PurchaseTicketAsync), new WebException(responseMessage)); } return JsonSerializer.Deserialize<PurchaseTicketsResult>(responseMessage, RelecloudApiConfiguration.GetSerializerOptions()) ?? new PurchaseTicketsResult(); } private async Task PrepareAuthenticatedClient() { if (this.httpContextAccessor.HttpContext?.User?.Identity != null) { var scopes = new[] { this.options.Value.AttendeeScope ?? throw new ArgumentNullException(nameof(this.options.Value.AttendeeScope)) }; var accessToken = await this.tokenAcquisition.GetAccessTokenForUserAsync(scopes); this.httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); this.httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } } } }