src/Relecloud.Web.CallCenter.Api/Services/TicketManagementService/DistributedTicketRenderingService.cs (37 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All Rights Reserved. // Licensed under the MIT License. using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Relecloud.Messaging; using Relecloud.Messaging.Messages; using Relecloud.Web.Api.Services.SqlDatabaseConcertRepository; namespace Relecloud.Web.Api.Services.TicketManagementService { /// <summary> /// Ticket rendering service that works by requesting rendering /// by a remote service via a message bus. /// </summary> public class DistributedTicketRenderingService : ITicketRenderingService { private readonly ConcertDataContext database; private readonly ILogger<DistributedTicketRenderingService> logger; private readonly IMessageSender<TicketRenderRequestMessage> messageSender; public DistributedTicketRenderingService(ConcertDataContext database, IMessageBus messageBus, IOptions<MessageBusOptions> options, ILogger<DistributedTicketRenderingService> logger) { var queueName = options.Value.RenderRequestQueueName ?? throw new ArgumentNullException("options.RenderRequestQueueName", "No render request queue name specified."); this.database = database; this.logger = logger; messageSender = messageBus.CreateMessageSender<TicketRenderRequestMessage>(queueName); } public async Task CreateTicketImageAsync(int ticketId) { // Get the ticket to render an image for. var ticket = database.Tickets .Include(ticket => ticket.Concert) .Include(ticket => ticket.User) .Include(ticket => ticket.Customer) .Where(ticket => ticket.Id == ticketId) .FirstOrDefault(); if (ticket is null) { logger.LogWarning("No Ticket found for id:{TicketId}", ticketId); return; } // Publish a message to request that the ticket be rendered. // If no output path is specified, the remote ticket rendering service will generate one. await messageSender.PublishAsync(new TicketRenderRequestMessage(Guid.NewGuid(), ticket, null, DateTime.Now), CancellationToken.None); logger.LogInformation("Requested ticket rendering for ticket {TicketId}.", ticketId); // The database is not updated with the blob name until the ticket is rendered. } } }