using Microsoft.Extensions.Logging; using MongoDB.Driver; using MongoDB.Bson.Serialization; using DomainResults.Common; using DataProviders.Abstractions; using Core.DomainObjects.Documents; using Core.DomainObjects.L10n; using Core.Enumerations; namespace DataProviders.Collections { public interface ICategoryDataProvider { (Guid?, IDomainResult) Insert(Category obj); (Guid?, IDomainResult) CreateDefault(Guid siteId); (Category?, IDomainResult) Get(Guid siteId, Guid categoryId); (List?, IDomainResult) GetMany(Guid siteId, List categoryIds); (Category?, IDomainResult) GetBySlug(Guid siteId, string slug); (List?, IDomainResult) GetBySlugs(Guid siteId, List slugs); (List?, IDomainResult) GetAll(Guid siteId); (Guid?, IDomainResult) Update(Category obj); IDomainResult Delete(Guid id); IDomainResult DeleteAll(Guid siteId); } public class CategoryDataProvider : CollectionDataProviderBase, ICategoryDataProvider { private const string _collectionName = "categories"; public CategoryDataProvider( ILogger> logger, IMongoClient client, IIdGenerator idGenerator, ISessionService sessionService) : base(logger, client, idGenerator, sessionService) { } public (Guid?, IDomainResult) Insert(Category obj) => Insert(obj, _collectionName); public (Guid?, IDomainResult) CreateDefault(Guid siteId) { var (list, result) = GetWithPredicate(x => x.SiteId == siteId && x.L10n.Any(y => y.Slug == "default"), _collectionName); if (result.IsSuccess && list != null) return (list.First().Id, result); return Insert(new Category { SiteId = siteId, L10n = new List { new CategoryL10n { Locale = Locales.Us, Slug = "default", Text = "Default category" } } }); } public (Category?, IDomainResult) Get(Guid siteId, Guid categoryId) { var (list, result) = GetWithPredicate(x => x.SiteId == siteId && x.Id == categoryId, _collectionName); if (!result.IsSuccess || list == null) return (null, result); return (list.First(), result); } public (List?, IDomainResult) GetMany(Guid siteId, List categoryIds) => GetWithPredicate(x => x.SiteId == siteId && categoryIds.Contains(x.Id), _collectionName); public (Category?, IDomainResult) GetBySlug(Guid siteId, string slug) { var (list, result) = GetBySlugs(siteId, new List { slug }); if (!result.IsSuccess || list == null) return (null, result); return (list.First(), result); } public (List?, IDomainResult) GetBySlugs(Guid siteId, List slugs) => GetWithPredicate(x => x.SiteId == siteId && x.L10n.Any(y => slugs.Contains(y.Slug)), _collectionName); public (List?, IDomainResult) GetAll(Guid siteId) => GetWithPredicate(x => x.SiteId == siteId, _collectionName); public (Guid?, IDomainResult) Update(Category obj) => UpdateWithPredicate(obj, x => x.Id == obj.Id, _collectionName); public IDomainResult Delete(Guid id) => DeleteWithPredicate(x => x.Id == id, _collectionName); public IDomainResult DeleteAll(Guid siteId) => DeleteManyWithPredicate(x => x.SiteId == siteId, _collectionName); } }