using DomainResults.Common; using DataProviders.Collections; using Core.Abstractions; using WeatherForecast.Models.Responses; using WeatherForecast.Models.Shop.Requests; using DomainObjects.Documents; using DomainObjects.Enumerations; namespace WeatherForecast.Services; /// /// /// public interface IShopCartItemService { /// /// /// /// /// /// /// /// (Guid?, IDomainResult) Post(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestModel); /// /// /// /// /// /// /// /// (ShopCartItemResponseModel?, IDomainResult) Get(ShopCartDocument cartItem, string? locale); /// /// /// /// /// /// /// /// (Guid?, IDomainResult) Update(ShopCartDocument cartItem, ShopCartItemRequestModel requestData); } /// /// /// public class ShopCartItemService : ServiceBase, IShopCartItemService { private readonly IShopCatalogDataProvider _shopCatalogDataProvider; private readonly IShopCartDataProvider _shopCartDataProvider; /// /// /// /// /// /// public ShopCartItemService( ILogger logger, IShopCatalogDataProvider shopCatalogDataProvider, IShopCartDataProvider shopCartDataprovider ) : base(logger) { _shopCatalogDataProvider = shopCatalogDataProvider; _shopCartDataProvider = shopCartDataprovider; } /// /// /// /// /// /// /// /// public (Guid?, IDomainResult) Post(Guid siteId, Guid userId, string sku, ShopCartItemRequestModel requestModel) { var (_, getResult) = _shopCartDataProvider.Get(siteId, userId, sku); if (getResult.IsSuccess) return IDomainResult.Failed(); var item = requestModel.ToDomainObject(); item.SiteId = siteId; item.UserId = userId; item.Sku = sku; var (id, insertResult) = _shopCartDataProvider.Insert(item); if (!insertResult.IsSuccess) return IDomainResult.Failed(); return IDomainResult.Success(id); } /// /// /// /// /// /// public (ShopCartItemResponseModel?, IDomainResult) Get(ShopCartDocument cartItem, string? locale) { var (item, result) = _shopCatalogDataProvider.Get(cartItem.SiteId, cartItem.Sku); if (!result.IsSuccess || item == null) { var delteResult = _shopCartDataProvider.Delete(cartItem.Id); if (!delteResult.IsSuccess) return (null, delteResult); return IDomainResult.NotFound(); } else return IDomainResult.Success(new ShopCartItemResponseModel(item, cartItem, Enumeration.FromDisplayName(locale ?? "en-US"))); } /// /// /// /// /// /// public (Guid?, IDomainResult) Update(ShopCartDocument cartItem, ShopCartItemRequestModel requestData) { // construct domain object from model var newItem = requestData.ToDomainObject(); newItem.Id = cartItem.Id; newItem.SiteId = cartItem.SiteId; newItem.UserId = cartItem.UserId; newItem.Sku = cartItem.Sku; newItem.Created = cartItem.Created; if (!cartItem.Equals(newItem)) { var (id, updateResult) = _shopCartDataProvider.Update(newItem); if (!updateResult.IsSuccess || id == null) return (null, updateResult); } return IDomainResult.Success(cartItem.Id); } }