Example #1
0
        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());
        }