public async Task AddSeat(int seatId, int userId) { if (seatId <= 0 || userId <= 0) { throw new ArgumentException(); } var seat = await _eventSeatService.Get(seatId); if (!seat.State.Equals(SeatState.Available)) { throw new CartException("Seat is locked"); } var findCart = await _context.CartRepository.FindByAsync(x => x.UserId == userId); var cart = findCart.FirstOrDefault(); using (var transaction = _context.CreateTransaction()) { try { if (cart == null) { var newCart = new Cart { UserId = userId }; _context.CartRepository.Create(newCart); await _context.SaveAsync(); cart = newCart; } seat.State = SeatState.Ordered; await _eventSeatService.Update(seat); _context.OrderedSeatsRepository.Create(new OrderedSeat { CartId = cart.Id, SeatId = seatId }); await _context.SaveAsync(); transaction.Commit(); } catch { transaction.Rollback(); throw; } } }
public async Task Create(UserDto entity) { if (entity == null) { throw new ArgumentNullException(); } if (IsUserNameTaken(entity, true)) { throw new UserException("Username is already taken"); } if (IsEmailTaken(entity, true)) { throw new UserException("Email is already taken"); } var addUser = MapToUser(entity); using (var transacrion = _context.CreateTransaction()) { try { _context.UserRepository.Create(addUser); await _context.SaveAsync(); var findRole = await _context.RoleRepository.FindByAsync(x => x.Name.Equals("user", StringComparison.OrdinalIgnoreCase)); var role = findRole.FirstOrDefault(); if (role == null) { throw new UserException("Role User does not exists"); } _context.UserRoleRepository.Create(new UserRole { RoleId = role.Id, UserId = addUser.Id }); await _context.SaveAsync(); transacrion.Commit(); entity.Id = addUser.Id; } catch (Exception) { transacrion.Rollback(); throw; } } }
public async Task <decimal> Create(int userId) { if (userId <= 0) { throw new ArgumentException(); } var orderedSeats = await _cartService.GetOrderedSeats(userId); if (!orderedSeats.Any()) { throw new OrderException("User has no ordered seats"); } using (var transaction = _context.CreateTransaction()) { try { var user = await _userService.Get(userId); var orderTotal = orderedSeats.Sum(x => x.Area.Price); if (user.Amount < orderTotal) { throw new OrderException("Balance of user is less than total amount of order"); } var order = new Order { Date = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTimeOffset.Now, user.Timezone), UserId = userId }; _context.OrderRepository.Create(order); await _context.SaveAsync(); foreach (var seat in orderedSeats) { _context.PurchasedSeatRepository.Create(new PurchasedSeat { SeatId = seat.Seat.Id, OrderId = order.Id, Price = seat.Area.Price }); var updateSeat = await _context.EventSeatRepository.GetAsync(seat.Seat.Id); updateSeat.State = (byte)SeatState.Purchased; } await _context.SaveAsync(); user.Amount -= orderTotal; await _userService.Update(user); await _cartService.DeleteUserCart(userId); transaction.Commit(); Notify(user, order.Id); return(orderTotal); } catch (Exception) { transaction.Rollback(); throw; } } }