using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using ShopOnline.Api.Extensions; using ShopOnline.Api.Repositories.Contracts; using ShopOnline.Models.Dtos; namespace ShopOnline.Api.Controllers { [Route("api/[controller]")] [ApiController] public class ShoppingCartController : ControllerBase { private readonly IShoppingCartRepository shoppingCartRepository; private readonly IProductRepository productRepository; public ShoppingCartController(IShoppingCartRepository shoppingCartRepository, IProductRepository productRepository) { this.shoppingCartRepository = shoppingCartRepository; this.productRepository = productRepository; } [HttpGet] [Route("{userId}/GetItems")] public async Task>> GetItems(int userId) { try { var cartItems = await shoppingCartRepository.GetItems(userId); if(cartItems == null) { return NoContent(); } var products = await this.productRepository.GetItems(); if(products == null) { throw new Exception("No products exist in the system."); } var cartItemsDto = cartItems.ConvertToDto(products); return Ok(cartItemsDto); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } [HttpGet("{id:int}")] public async Task> GetItem(int id) { try { var cartItem = await this.shoppingCartRepository.GetItem(id); if (cartItem == null) { return NotFound(); } var product = await productRepository.GetItem(cartItem.ProductId); if(product == null) { return NotFound(); } var cartItemDto = cartItem.ConvertToDto(product); return Ok(cartItemDto); } catch(Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } [HttpPost] public async Task> PostItem([FromBody] CartItemToAddDto cartItemToAddDto) { try { var newCartItem = await this.shoppingCartRepository.AddItem(cartItemToAddDto); if(newCartItem == null) { return NoContent(); } var product = await productRepository.GetItem(newCartItem.ProductId); if(product == null) { throw new Exception($"Something went wrong when attempting to retrieve product (productID:({cartItemToAddDto.ProductId}))"); } var newCartItemDto = newCartItem.ConvertToDto(product); return CreatedAtAction(nameof(GetItem), new { id = newCartItemDto.Id }, newCartItemDto); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } [HttpDelete("{id:int}")] public async Task> DeleteItem(int id) { try { var cartItem = await this.shoppingCartRepository.DeleteItem(id); if(cartItem == null) { return NotFound(); } var product = await this.productRepository.GetItem(cartItem.ProductId); if(product == null) { return NotFound(); } var cartItemDto = cartItem.ConvertToDto(product); return Ok(cartItemDto); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } [HttpPatch("{id:int}")] public async Task> UpdateQuantity(int id, CartItemQuantityUpdateDto cartItemQuantityUpdateDto) { try { var cartItem = await this.shoppingCartRepository.UpdateQuantity(id, cartItemQuantityUpdateDto); if(cartItem == null) { return NotFound(); } var product = await productRepository.GetItem(cartItem.ProductId); var cartItemDto = cartItem.ConvertToDto(product); return Ok(cartItemDto); } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } } }