public async Task UpdatePersonXTicket(PersonXTicket personXTicket, Ticket ticket) { using var transaction = await _dataContext.Database.BeginTransactionAsync(); try { _dataContext.Update(personXTicket); _dataContext.Update(ticket); await _dataContext.SaveChangesAsync(); // Commit transaction if all commands succeed, transaction will auto-rollback // when disposed if either commands fails await transaction.CommitAsync(); } catch (Exception e) { await transaction.RollbackAsync(); throw new Exception(e.ToString()); } }
public async Task <IActionResult> Create([FromBody] PersonXTicketDto model) { var currentUser = await _identityService.GetCurrentUser(); if (currentUser == null) { return(BadRequest(new { error = "You are not allowed!" })); } var person = await _identityService.GetPersonByUserId(currentUser.Id); if (person == null) { return(BadRequest(new { error = "Person does not exist for this user" })); } if (!ModelState.IsValid) { return(NotFound()); } if (model == null) { return(NotFound()); } var ticket = await _ticketService.GetTicketById(model.TicketId); if (ticket == null) { return(BadRequest(new { error = "Selected ticket was not found" })); } if (ticket.Remaining <= 0 || ticket.Remaining - model.NrOfBought < 0) { return(BadRequest(new { error = $"There aren't so many tickets available. There are only {ticket.Remaining} more!" })); } if (model.NrOfBought <= 0) { return(BadRequest(new { error = "Number of bought tickets must be higher than 0" })); } var existingLink = await _personXTicketService.ExistingPersonXTicket(model.PersonId, model.TicketId); ticket.Remaining -= model.NrOfBought; if (existingLink != null) { existingLink.NrOfBought += model.NrOfBought; await _personXTicketService.UpdatePersonXTicket(existingLink, ticket); } else { var personXTicket = new PersonXTicket() { TicketId = model.TicketId, NrOfBought = model.NrOfBought, NrOfReturned = 0, PersonId = person.Id }; await _personXTicketService.CreatePersonXTicket(personXTicket, ticket); } return(Ok()); }