using Grpc.Core; using Microsoft.eShopOnContainers.Services.Basket.API.Model; using Microsoft.Extensions.Logging; using System.Linq; using System.Threading.Tasks; namespace grpc { public class BasketService : Basket.BasketBase { private readonly IBasketRepository _repository; private readonly ILogger _logger; public BasketService(IBasketRepository repository, ILogger logger) { _repository = repository; _logger = logger; } public override async Task GetBasketById(BasketRequest request, ServerCallContext context) { _logger.LogInformation($"Begin grpc call from method {context.Method} for basket id {request.Id}"); var data = await _repository.GetBasketAsync(request.Id); if (data != null) { context.Status = new Status(StatusCode.OK, $"Basket with id {request.Id} do exist"); return MapToCustomerBasketResponse(data); } else { context.Status = new Status(StatusCode.NotFound, $"Basket with id {request.Id} do not exist"); } return null; } public override async Task UpdateBasket(CustomerBasketRequest request, ServerCallContext context) { _logger.LogInformation($"Begin grpc call BasketService.UpdateBasketAsync for buyer id {request.Buyerid}"); var customerBasket = MapToCustomerBasket(request); var response = await _repository.UpdateBasketAsync(customerBasket); if (response != null) { return MapToCustomerBasketResponse(response); } context.Status = new Status(StatusCode.NotFound, $"Basket with buyer id {request.Buyerid} do not exist"); return null; } private CustomerBasketResponse MapToCustomerBasketResponse(CustomerBasket customerBasket) { var response = new CustomerBasketResponse { Buyerid = customerBasket.BuyerId }; customerBasket.Items.ForEach(item => response.Items.Add(new BasketItemResponse { Id = item.Id, Oldunitprice = (double)item.OldUnitPrice, Pictureurl = item.PictureUrl, Productid = item.ProductId, Productname = item.ProductName, Quantity = item.Quantity, Unitprice = (double)item.UnitPrice })); return response; } private CustomerBasket MapToCustomerBasket(CustomerBasketRequest customerBasketRequest) { var response = new CustomerBasket { BuyerId = customerBasketRequest.Buyerid }; customerBasketRequest.Items.ToList().ForEach(item => response.Items.Add(new BasketItem { Id = item.Id, OldUnitPrice = (decimal)item.Oldunitprice, PictureUrl = item.Pictureurl, ProductId = item.Productid, ProductName = item.Productname, Quantity = item.Quantity, UnitPrice = (decimal)item.Unitprice })); return response; } } }