src/Relecloud.Web.CallCenter.Api/Services/TicketManagementService/TicketManagementService.cs (60 lines of code) (raw):
using Microsoft.EntityFrameworkCore;
using Relecloud.Web.Api.Services.SqlDatabaseConcertRepository;
using Relecloud.Web.Models.ConcertContext;
using Relecloud.Web.Models.TicketManagement;
namespace Relecloud.Web.Api.Services.TicketManagementService
{
public class TicketManagementService : ITicketManagementService
{
private readonly ConcertDataContext database;
private readonly ITicketRenderingService ticketRenderingService;
private readonly ILogger<TicketManagementService> logger;
public TicketManagementService(ConcertDataContext database, ITicketRenderingService ticketRenderingService, ILogger<TicketManagementService> logger)
{
this.database = database;
this.ticketRenderingService = ticketRenderingService;
this.logger = logger;
}
public Task<CountAvailableTicketsResult> CountAvailableTicketsAsync(int concertId)
{
// in the future tickets will be limited due to seating
// for current scope ticket sales are unlimited
return Task.FromResult(new CountAvailableTicketsResult
{
CountOfAvailableTickets = 100
});
}
public async Task<HaveTicketsBeenSoldResult> HaveTicketsBeenSoldAsync(int concertId)
{
// in the future tickets will be limited due to seating
// as part of that plan we need to check to see if tickets have been sold
// a business rule will be added:
// if tickets have been sold then we cannot change the visibility of a concert from visible to hidden
var soldTicketCount = await database.Tickets.AsNoTracking()
.Where(ticket => ticket.ConcertId == concertId)
.CountAsync();
return new HaveTicketsBeenSoldResult
{
HaveTicketsBeenSold = soldTicketCount > 0
};
}
public async Task<ReserveTicketsResult> ReserveTicketsAsync(int concertId, string userId, int numberOfTickets, int customerId)
{
var newTickets = new List<Ticket>();
for (int i = 0; i < numberOfTickets; i++)
{
var newTicket = new Ticket
{
ConcertId = concertId,
UserId = userId,
CustomerId = customerId
//TicketNumber = not used. planned for use when tickets become limited due to seating
};
database.Tickets.Add(newTicket);
newTickets.Add(newTicket);
}
await database.SaveChangesAsync();
foreach (var ticket in newTickets)
{
await ticketRenderingService.CreateTicketImageAsync(ticket.Id);
}
return new ReserveTicketsResult
{
Status = ReserveTicketsResultStatus.Success,
// TicketNumbers = not used. planned for use when tickets become limited due to seating
};
}
}
}