using DomainResults.Common; using DataProviders.Collections; using WeatherForecast.Models.Requests; using WeatherForecast.Services.Abstractions; using DomainObjects.Documents; using WeatherForecast.Models.Shop.Responses; using DomainObjects.Enumerations; namespace WeatherForecast.Services { /// /// /// public interface IShopItemService { /// /// /// /// /// /// /// (Guid?, IDomainResult) Post(ShopDocument shopItem); /// /// /// /// /// /// (ShopItemResponseModel?, IDomainResult) Get(ShopDocument shopItem); /// /// /// /// /// /// (ShopItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug); /// /// /// /// /// /// /// (Guid?, IDomainResult) Update(Guid siteId, string sku, ShopItemRequestModel requestData); } /// /// /// public class ShopItemService : PostItemServiceBase, IShopItemService { private readonly IShopCatalogDataProvider _shopCatalogDataProvider; /// /// /// /// /// /// public ShopItemService( ILogger logger, IShopCatalogDataProvider shopCatalogDataProvider, ICategoryDataProvider categoryDataProvider ) : base(logger, categoryDataProvider) { _shopCatalogDataProvider = shopCatalogDataProvider; } /// /// /// /// /// public (Guid?, IDomainResult) Post(ShopDocument shopItem) { var (_, getResult) = _shopCatalogDataProvider.Get(shopItem.SiteId, shopItem.Sku); if (getResult.IsSuccess) return IDomainResult.Failed(); var (categories, addCategoriesResult) = AddCategoryIfNullOrEmpty(shopItem.SiteId, shopItem.Categories); if (!addCategoriesResult.IsSuccess || categories == null) return (null, addCategoriesResult); shopItem.Categories = categories; var (id, insertResult) = _shopCatalogDataProvider.Insert(shopItem); if (!insertResult.IsSuccess) return IDomainResult.Failed(); return IDomainResult.Success(id); } /// /// /// /// /// /// public (ShopItemResponseModel?, IDomainResult) Get(ShopDocument shopItem) { var (categories, getCategoryResult) = _categoryDataProvider.GetMany(shopItem.SiteId, shopItem.Categories); if (!getCategoryResult.IsSuccess || categories == null) return IDomainResult.Failed(); return IDomainResult.Success(new ShopItemResponseModel(shopItem, categories)); } /// /// /// /// /// /// public (ShopItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) { try { var (item, result) = _shopCatalogDataProvider.GetBySlug(siteId, slug); if (!result.IsSuccess || item == null) return (null, result); var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us; var (categories, getCategoryResult) = _categoryDataProvider.GetMany(siteId, item.Categories); if (!getCategoryResult.IsSuccess || categories == null) return IDomainResult.Failed(); return IDomainResult.Success(new ShopItemResponseModel(item, categories, locale)); } catch (Exception ex) { _logger.LogError(ex, "Unhandled exception"); return IDomainResult.Failed(ex.Message); } } /// /// /// /// /// /// /// public (Guid?, IDomainResult) Update(Guid siteId, string sku, ShopItemRequestModel requestData) { var (item, getResult) = _shopCatalogDataProvider.Get(siteId, sku); if (!getResult.IsSuccess || item == null) return (null, getResult); // construct domain object from model var newItem = requestData.ToDomainObject(); newItem.Id = item.Id; newItem.SiteId = siteId; newItem.Sku = sku; newItem.Created = item.Created; newItem.Author = item.Author; var (categories, addCategoriesResult) = AddCategoryIfNullOrEmpty(siteId, requestData.Categories); if (!addCategoriesResult.IsSuccess || categories == null) return (null, addCategoriesResult); item.Categories = categories; if (!item.Equals(newItem)) { var (id, updateResult) = _shopCatalogDataProvider.Update(newItem); if (!updateResult.IsSuccess || id == null) return (null, updateResult); } return IDomainResult.Success(item.Id); } } }