using DomainResults.Common; using DataProviders.Collections; using DomainObjects.Documents; using WeatherForecast.Services.Abstractions; using WeatherForecast.Models.Blog.Responses; using WeatherForecast.Models.Blog.Requests; namespace WeatherForecast.Services { /// /// /// public interface IBlogItemService { /// /// /// /// /// (Guid?, IDomainResult) Post(BlogDocument blogItem); /// /// /// /// /// (BlogItemResponseModel?, IDomainResult) Get(BlogDocument blogItem); /// /// /// /// /// /// (BlogItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug); /// /// /// /// /// /// (Guid?, IDomainResult) Update(BlogDocument blogItem, BlogItemRequestModel requestData); } /// /// /// public class BlogItemService : PostItemServiceBase, IBlogItemService { private readonly IBlogCatalogDataProvider _blogCatalogDataProvider; /// /// /// /// /// /// public BlogItemService( ILogger logger, IBlogCatalogDataProvider blogCatalogDataProvider, ICategoryDataProvider categoryDataProvider ) : base(logger, categoryDataProvider) { _blogCatalogDataProvider = blogCatalogDataProvider; } /// /// /// /// /// public (Guid?, IDomainResult) Post(BlogDocument blogItem) { var (_, getResult) = _blogCatalogDataProvider.GetBySlugs(blogItem.SiteId, blogItem.L10n.Select(x => x.Slug).ToList()); if (getResult.IsSuccess) return IDomainResult.Failed(); // will create default category if no categories are specified blogItem.Categories var (categories, addCategoriesResult) = AddCategoryIfNullOrEmpty(blogItem.SiteId, blogItem.Categories); if (!addCategoriesResult.IsSuccess || categories == null) return (null, addCategoriesResult); blogItem.Categories = categories; var (id, insertResult) = _blogCatalogDataProvider.Insert(blogItem); if (!insertResult.IsSuccess) return IDomainResult.Failed(); return IDomainResult.Success(id); } /// /// /// /// /// public (BlogItemResponseModel?, IDomainResult) Get(BlogDocument item) { var (categories, getCategoryResult) = _categoryDataProvider.GetMany(item.SiteId, item.Categories); if (!getCategoryResult.IsSuccess || categories == null) return IDomainResult.Failed(); return IDomainResult.Success(new BlogItemResponseModel(item, categories)); } /// /// /// /// /// /// public (BlogItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) { var (blog, getBlogItemResult) = _blogCatalogDataProvider.GetBySlug(siteId, slug); if (!getBlogItemResult.IsSuccess || blog == null) return IDomainResult.Failed(); var (categories, getCategoryResult) = _categoryDataProvider.GetMany(blog.SiteId, blog.Categories); if (!getCategoryResult.IsSuccess || categories == null) return IDomainResult.Failed(); var locale = blog.L10n.Single(x => x.Slug == slug).Locale; return IDomainResult.Success(new BlogItemResponseModel(blog, categories, locale)); } /// /// /// /// /// /// public (Guid?, IDomainResult) Update(BlogDocument blogItem, BlogItemRequestModel requestData) { // construct domain object from model var newItem = requestData.ToDomainObject(); newItem.Id = blogItem.Id; newItem.SiteId = blogItem.SiteId; newItem.Created = blogItem.Created; newItem.Author = blogItem.Author; var (categories, addCategoriesResult) = AddCategoryIfNullOrEmpty(blogItem.SiteId, requestData.Categories); if (!addCategoriesResult.IsSuccess || categories == null) return (null, addCategoriesResult); blogItem.Categories = categories; if (!blogItem.Equals(newItem)) { var (id, updateResult) = _blogCatalogDataProvider.Update(newItem); if (!updateResult.IsSuccess || id == null) return (null, updateResult); } return IDomainResult.Success(blogItem.Id); } } }