Ejemplo n.º 1
0
        public async Task CreateConsumerUser(UserRequestModel userRequestModel)
        {
            var user = UserMapper.Map(userRequestModel);

            user.Id           = Guid.NewGuid();
            user.PasswordHash = Helper.HashPassword(userRequestModel.Password);
            user.UserType     = (int)UserType.Consumer;
            await foodAppDbContext.AddAsync(user);

            await foodAppDbContext.SaveChangesAsync();
        }
Ejemplo n.º 2
0
        public async Task <Guid> CreateFoodAsync(FoodRequestModel foodRequestModel)
        {
            var food = FoodMapper.Map(foodRequestModel);

            food.Id = Guid.NewGuid();

            await foodAppDbContext.AddAsync(food);

            await foodAppDbContext.SaveChangesAsync();

            return(food.Id);
        }
Ejemplo n.º 3
0
        public async Task <(BadRequestResponseModel, Guid)> CreateOrder(OrderRequestModel orderRequestModel, Guid userId)
        {
            Guid orderId    = Guid.Empty;
            var  restuarant = await this.foodAppDbContext.Restaurants.AsNoTracking().FirstOrDefaultAsync(x => x.Id == orderRequestModel.RestaurantId);

            if (restuarant == null)
            {
                return(new BadRequestResponseModel()
                {
                    ErrorMessage = "Invalid RestaurantId"
                }, orderId);
            }

            var restuarantFoodCategoryIds = await this.foodAppDbContext.RestaurantFoodCategoryMaps.AsNoTracking()
                                            .Include(x => x.FoodCategory)
                                            .Where(x => x.RestaurantId == orderRequestModel.RestaurantId)
                                            .Select(x => x.FoodCategory.Id)
                                            .ToListAsync();

            var restaurantFoods = await this.foodAppDbContext.Foods.AsNoTracking()
                                  .Where(x => restuarantFoodCategoryIds.Any(r => r == x.FoodCategoryId))
                                  .ToListAsync();

            var restaurantFoodIds   = restaurantFoods.Select(x => x.Id).ToList();
            var orderRequestFoodIds = orderRequestModel.OrderLines.Select(x => x.FoodId).ToList();

            var foodCustomizationIds = await this.foodAppDbContext.FoodCategoryCustomizationMaps.AsNoTracking()
                                       .Where(x => restuarantFoodCategoryIds.Any(r => r == x.FoodCategoryId))
                                       .Select(x => x.FoodCustomizationId)
                                       .ToListAsync();

            var foodCustomizationOptions = await this.foodAppDbContext.FoodCustomizationOptions.AsNoTracking()
                                           .Where(x => foodCustomizationIds.Any(f => f == x.FoodCustomizationId))
                                           .ToListAsync();

            bool isFoodIdValid = !orderRequestFoodIds.Except(restaurantFoodIds).Any();

            if (!isFoodIdValid)
            {
                return(new BadRequestResponseModel()
                {
                    ErrorMessage = "FoodId doesnt belong to selected restaurant"
                }, orderId);
            }

            using (var transaction = foodAppDbContext.Database.BeginTransaction())
            {
                try
                {
                    var order = OrderMapper.Map(orderRequestModel, userId);
                    orderId = order.Id;
                    var orderLines       = new List <OrderLine>();
                    var orderLineOptions = new List <OrderLineOption>();
                    var totalAmount      = 0.00m;
                    foreach (var orderLineRequest in orderRequestModel.OrderLines)
                    {
                        var food      = restaurantFoods.FirstOrDefault(x => x.Id == orderLineRequest.FoodId);
                        var orderLine = OrderMapper.Map(orderLineRequest, order.Id, food.UnitPrice);
                        orderLines.Add(orderLine);
                        totalAmount += (orderLineRequest.Quantity * food.UnitPrice);
                        foreach (var orderLineOptionRequest in orderLineRequest.OrderLineOptions)
                        {
                            var foodCustomizationOption = foodCustomizationOptions.FirstOrDefault(x => x.Id == orderLineOptionRequest.FoodCustomizationOptionId);
                            orderLineOptions.Add(OrderMapper.Map(orderLineOptionRequest, orderLine.Id, foodCustomizationOption.UnitPrice));
                            totalAmount += foodCustomizationOption.UnitPrice;
                        }
                    }

                    order.TotalAmount = totalAmount;

                    await foodAppDbContext.AddAsync(order);

                    await foodAppDbContext.SaveChangesAsync();

                    await foodAppDbContext.AddRangeAsync(orderLines);

                    await foodAppDbContext.SaveChangesAsync();

                    await foodAppDbContext.AddRangeAsync(orderLineOptions);

                    await foodAppDbContext.SaveChangesAsync();

                    await transaction.CommitAsync();
                }
                catch (Exception)
                {
                    await transaction.RollbackAsync();

                    throw;
                }
            }
            return(null, orderId);
        }