Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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;
                }
            }
        }
Esempio n. 3
0
        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;
                }
            }
        }