using Core.Enumerations; using DataProviders; using DomainResults.Common; using WeatherForecast.Models.Requests; using WeatherForecast.Models.Responses; namespace WeatherForecast.Services { /// /// /// public interface ICategoryItemService { /// /// /// /// /// /// (Guid?, IDomainResult) Post(Guid siteId, CategoryItemRequestModel requestModel); /// /// /// /// /// /// (CategoryItemResponseModel?, IDomainResult) Get(Guid siteId, Guid categoryId); /// /// /// /// /// /// (CategoryItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug); /// /// /// /// /// /// /// (Guid?, IDomainResult) Update(Guid siteId, Guid categoryId, CategoryItemRequestModel requestData); /// /// /// /// /// /// IDomainResult Delete(Guid siteId, Guid categoryId); } /// /// /// public class CategoryItemService : ICategoryItemService { private readonly ILogger _logger; private readonly ICategoryDataProvider _categoryDataProvider; /// /// /// /// /// public CategoryItemService( ILogger logger, ICategoryDataProvider categoryDataProvider ) { _logger = logger; _categoryDataProvider = categoryDataProvider; } /// /// /// /// /// /// public (Guid?, IDomainResult) Post(Guid siteId, CategoryItemRequestModel requestModel) { var (_, getResult) = _categoryDataProvider.GetBySlugs(siteId, requestModel.L10n.Select(x => x.Slug).ToList()); if (getResult.IsSuccess) return IDomainResult.Failed(); var item = requestModel.ToDomainObject(); item.SiteId = siteId; var (id, insertResult) = _categoryDataProvider.Insert(item); if (!insertResult.IsSuccess) return IDomainResult.Failed(); return IDomainResult.Success(id); } /// /// /// /// /// /// public (CategoryItemResponseModel?, IDomainResult) Get(Guid siteId, Guid categoryId) { var (item, result) = _categoryDataProvider.Get(siteId, categoryId); if (!result.IsSuccess || item == null) return (null, result); return IDomainResult.Success(new CategoryItemResponseModel(item)); } /// /// /// /// /// /// public (CategoryItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) { var (item, result) = _categoryDataProvider.GetBySlug(siteId, slug); if (!result.IsSuccess || item == null) return (null, result); var locale = item.L10n.SingleOrDefault(x => x.Slug == slug)?.Locale ?? Locales.Us; return IDomainResult.Success(new CategoryItemResponseModel(item, locale)); } /// /// /// /// /// /// /// public (Guid?, IDomainResult) Update(Guid siteId, Guid categoryId, CategoryItemRequestModel requestData) { var (item, result) = _categoryDataProvider.Get(siteId, categoryId); if (!result.IsSuccess || item == null) return (null, result); // construct domain object from model var newItem = requestData.ToDomainObject(); newItem.Id = item.Id; newItem.SiteId = item.SiteId; if (!item.Equals(newItem)) { var (id, updateResult) = _categoryDataProvider.Update(newItem); if (!updateResult.IsSuccess || id == null) return (null, updateResult); } return IDomainResult.Success(item.Id); } /// /// /// /// /// /// public IDomainResult Delete(Guid siteId, Guid categoryId) { var (item, getResult) = _categoryDataProvider.Get(siteId, categoryId); if (!getResult.IsSuccess || item == null) return getResult; var result = _categoryDataProvider.Delete(item.Id); if (!result.IsSuccess) return result; return IDomainResult.Success(); } } }