using Microsoft.EntityFrameworkCore; using ShopOnline.Api.Data; using ShopOnline.Api.Entities; using ShopOnline.Api.Repositories.Contracts; using ShopOnline.Models.Dtos; namespace ShopOnline.Api.Repositories { public class ShoppingCartRepository : IShoppingCartRepository { private readonly ShopOnlineDbContext shopOnlineDbContext; public ShoppingCartRepository(ShopOnlineDbContext shopOnlineDbContext) { this.shopOnlineDbContext = shopOnlineDbContext; } private async Task CartItemExists(int cartId, int productId) { return await this.shopOnlineDbContext.CartItems.AnyAsync(c => c.CartId == cartId && c.ProductId == productId); } public async Task AddItem(CartItemToAddDto cartItemToAddDto) { if(await CartItemExists(cartItemToAddDto.CartId, cartItemToAddDto.ProductId) == false) { var item = await (from product in this.shopOnlineDbContext.Products where product.Id == cartItemToAddDto.ProductId select new CartItem { CartId = cartItemToAddDto.CartId, ProductId = product.Id, Quantity = cartItemToAddDto.Quantity, }).SingleOrDefaultAsync(); if(item != null) { var result = await this.shopOnlineDbContext.CartItems.AddAsync(item); await this.shopOnlineDbContext.SaveChangesAsync(); return result.Entity; } } return null; } public async Task DeleteItem(int id) { var item = await this.shopOnlineDbContext.CartItems.FindAsync(id); if(item != null) { this.shopOnlineDbContext.CartItems.Remove(item); await this.shopOnlineDbContext.SaveChangesAsync(); } return item; } public async Task GetItem(int id) { return await (from cart in this.shopOnlineDbContext.Carts join cartItem in this.shopOnlineDbContext.CartItems on cart.Id equals cartItem.CartId where cartItem.Id == id select new CartItem { Id = cartItem.Id, ProductId = cartItem.ProductId, Quantity = cartItem.Quantity, CartId = cartItem.CartId }).SingleOrDefaultAsync(); } public async Task> GetItems(int userId) { return await (from cart in this.shopOnlineDbContext.Carts join cartItem in this.shopOnlineDbContext.CartItems on cart.Id equals cartItem.CartId where cart.UserId == userId select new CartItem { Id = cartItem.Id, ProductId = cartItem.ProductId, Quantity = cartItem.Quantity, CartId = cartItem.CartId }).ToListAsync(); } public async Task UpdateQuantity(int id, CartItemQuantityUpdateDto cartItemQuantityUpdateDto) { var item = await this.shopOnlineDbContext.CartItems.FindAsync(id); if(item != null) { item.Quantity = cartItemQuantityUpdateDto.Quantity; await this.shopOnlineDbContext.SaveChangesAsync(); return item; } return null; } } }