using DomainResults.Common; using ExtensionMethods; using DataProviders; using Core.DomainObjects; using Core.DomainObjects.Documents; using Core.DomainObjects.L10n; using Core.Enumerations; using WeatherForecast.Models.Requests; using WeatherForecast.Models.Responses; using DataProviders.Collections; namespace WeatherForecast.Services { /// /// /// public interface IBlogItemService { /// /// /// /// /// /// (Guid?, IDomainResult) Post(Guid siteId, BlogItemRequestModel requestModel); /// /// /// /// /// /// (BlogItemResponseModel?, IDomainResult) Get(Guid siteId, Guid blogId); /// /// /// /// /// /// (BlogItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug); /// /// /// /// /// /// /// (Guid?, IDomainResult) Update(Guid siteId, Guid blogId, BlogItemRequestModel requestData); /// /// /// /// /// /// IDomainResult Delete(Guid siteId, Guid blogId); } /// /// /// public class BlogItemService : IBlogItemService { private readonly ILogger _logger; private readonly IBlogCatalogDataProvider _blogCatalogDataProvider; private readonly ICategoryDataProvider _categoryDataProvider; /// /// /// /// /// /// public BlogItemService( ILogger logger, IBlogCatalogDataProvider blogCatalogDataProvider, ICategoryDataProvider categoryDataProvider ) { _logger = logger; _blogCatalogDataProvider = blogCatalogDataProvider; _categoryDataProvider = categoryDataProvider; } /// /// /// /// /// /// /// public (Guid?, IDomainResult) Post(Guid siteId, BlogItemRequestModel requestModel) { try { var item = requestModel.ToDomainObject(); item.SiteId = siteId; var (_, getResult) = _blogCatalogDataProvider.GetBySlugs(item.SiteId, item.L10n.Select(x => x.Slug).ToList()); if (getResult.IsSuccess) return IDomainResult.Failed(); // TODO: should be recovered from users by jwt item.Author = "fdc5aa50-ee68-4bae-a8e6-b8ae2c258f60".ToGuid(); // TODO: should be placed to object storage item.Images = new List() { new Image { Src = "https://dummyimage.com/450x300/dee2e6/6c757d.jpg", L10n = new List { new ImageL10n { Locale = Locales.Us, Alt = "..." } } } }; // TODO: default value shoud not be hardcoded by database id item.Categories ??= new List { "e154e33f-3cc7-468d-bb66-e0390ddb9ae0".ToGuid() }; var (id, insertResult) = _blogCatalogDataProvider.Insert(item); if (!insertResult.IsSuccess) return IDomainResult.Failed(); return IDomainResult.Success(id); } catch (Exception ex) { return IDomainResult.Failed(ex.Message); } } /// /// /// /// /// /// public (BlogItemResponseModel?, IDomainResult) Get(Guid siteId, Guid blogId) { try { var (item, result) = _blogCatalogDataProvider.Get(siteId, blogId); if (!result.IsSuccess || item == null) return (null, result); var categories = new List(); if (item.Categories != null) { foreach (var catId in item.Categories) { var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId); if (!getCategoryResult.IsSuccess || category == null) return (null, getCategoryResult); categories.Add(category); } } return IDomainResult.Success(new BlogItemResponseModel(item, categories)); } catch (Exception ex) { return IDomainResult.Failed(ex.Message); } } /// /// /// /// /// /// public (BlogItemResponseModel?, IDomainResult) GetSlug(Guid siteId, string slug) { try { var (item, result) = _blogCatalogDataProvider.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 = new List(); if (item.Categories != null) { foreach (var catId in item.Categories) { var (category, getCategoryResult) = _categoryDataProvider.Get(siteId, catId); if (!getCategoryResult.IsSuccess || category == null) return (null, getCategoryResult); categories.Add(category); } } return IDomainResult.Success(new BlogItemResponseModel(item, categories, locale)); } catch (Exception ex) { return IDomainResult.Failed(ex.Message); } } /// /// /// /// /// /// /// /// public (Guid?, IDomainResult) Update(Guid siteId, Guid blogId, BlogItemRequestModel requestData) { try { var (item, getResult) = _blogCatalogDataProvider.Get(siteId, blogId); 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.Created = item.Created; newItem.Author = item.Author; if (!item.Equals(newItem)) { var (id, updateResult) = _blogCatalogDataProvider.Update(newItem); if (!updateResult.IsSuccess || id == null) return (null, updateResult); } return IDomainResult.Success(item.Id); } catch (Exception ex) { return IDomainResult.Failed(ex.Message); } } /// /// /// /// /// /// /// public IDomainResult Delete(Guid siteId, Guid blogId) { try { var (item, getResult) = _blogCatalogDataProvider.Get(siteId, blogId); if (!getResult.IsSuccess || item == null) return getResult; var result = _blogCatalogDataProvider.Delete(item.Id); if (!result.IsSuccess) return result; return IDomainResult.Success(); } catch (Exception ex) { return IDomainResult.Failed(ex.Message); } } } }