public async Task <Result <BasketView> > RemoveDishByIdAsync(string dishId, string userIdFromIdentity, CancellationToken cancellationToken = default) { UserDB user = await _context.Users.Where(_ => _.IdFromIdentity == userIdFromIdentity).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken); AppUser userIdentity = await _userManager.FindByIdAsync(userIdFromIdentity); if (user is null || userIdentity is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.USER_WAS_NOT_FOUND)); } BasketDB basket = await _context.Baskets.Where(_ => _.UserId == user.Id).AsNoTracking().FirstOrDefaultAsync(cancellationToken); if (basket is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.BASKET_WAS_NOT_FOUND)); } BasketDishDB connection = await _context.BasketDishes.Where(_ => _.BasketId == basket.Id && _.DishId == Guid.Parse(dishId)).AsNoTracking().FirstOrDefaultAsync(cancellationToken); if (connection is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.DISHES_IN_BASKET_WAS_NOT_FOUND)); } basket.ModificationTime = DateTime.Now; _context.Entry(basket).Property(c => c.ModificationTime).IsModified = true; _context.BasketDishes.Remove(connection); try { await _context.SaveChangesAsync(cancellationToken); var dishList = await _context.BasketDishes.Where(_ => _.BasketId == basket.Id).AsNoTracking().ToListAsync(cancellationToken); BasketView view = CollectBasket(basket, dishList, userIdentity).Result.Data; return(Result <BasketView> .Ok(_mapper.Map <BasketView>(view))); } catch (DbUpdateConcurrencyException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message)); } catch (DbUpdateException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message)); } catch (ArgumentNullException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.SOURCE_IS_NULL + ex.Message)); } }
public async Task <Result <BasketView> > AddUpdateDishAsync(string dishId, string userIdFromIdentity, int quantity, CancellationToken cancellationToken = default) { DishDB dishToAdd = await _context.Dishes.Where(_ => _.Id == Guid.Parse(dishId)).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken); if (dishToAdd is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.DISH_WAS_NOT_FOUND)); } UserDB user = await _context.Users.Where(_ => _.IdFromIdentity == userIdFromIdentity).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken); AppUser userIdentity = await _userManager.FindByIdAsync(userIdFromIdentity); if (user is null || userIdentity is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.USER_WAS_NOT_FOUND)); } BasketDB basket = await _context.Baskets.Where(_ => _.UserId == user.Id).AsNoTracking().FirstOrDefaultAsync(cancellationToken); if (basket is null) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.BASKET_WAS_NOT_FOUND)); } var connection = await _context.BasketDishes.Where(_ => _.BasketId == basket.Id && _.DishId == Guid.Parse(dishId)).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken); if (connection is null) { BasketDishDB basketDish = new BasketDishDB() { BasketId = basket.Id, DishId = dishToAdd.Id, Quantity = quantity, DishPrice = dishToAdd.Price, Sale = dishToAdd.Sale }; _context.BasketDishes.Add(basketDish); } else { if (quantity > 0) { connection.Quantity = quantity; _context.Entry(connection).Property(c => c.Quantity).IsModified = true; } else // quantity == 0 { _context.BasketDishes.Remove(connection); } } basket.ModificationTime = DateTime.Now; _context.Entry(basket).Property(c => c.ModificationTime).IsModified = true; try { await _context.SaveChangesAsync(cancellationToken); var dishList = await _context.BasketDishes.Where(_ => _.BasketId == basket.Id).AsNoTracking().ToListAsync(cancellationToken); //BasketView view = CollectBasket(basket, dishList, userIdentity).Result.Data; //return Result<BasketView>.Ok(view); return(CollectBasket(basket, dishList, userIdentity).Result); } catch (DbUpdateConcurrencyException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message)); } catch (DbUpdateException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message)); } catch (ArgumentNullException ex) { return(Result <BasketView> .Fail <BasketView>(ExceptionConstants.SOURCE_IS_NULL + ex.Message)); } }