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);
}
}
}