diff --git a/Constants/XContentServiceConstants.cs b/Constants/XContentServiceConstants.cs index 9e08908..e71b3a3 100644 --- a/Constants/XContentServiceConstants.cs +++ b/Constants/XContentServiceConstants.cs @@ -23,5 +23,8 @@ namespace xContentService.Constants // // EF Repositories Helper Extensions ... public const string GetXContentEFRepositoryDescriptor = "GetXContentEFRepositoryDescriptor"; + + public const string XContentTitleIdentifier = "CntnT"; + public const string XContentDescriptionIdentifier = "CntnD"; } } \ No newline at end of file diff --git a/DI/XDIHelperExtensions.cs b/DI/XDIHelperExtensions.cs index 02f48a2..990127e 100644 --- a/DI/XDIHelperExtensions.cs +++ b/DI/XDIHelperExtensions.cs @@ -1,21 +1,25 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using xCommons.Extensions; -using xContentService.Constants; -using xContentService.Providers.Dtos; -using xContentService.Providers.Entities; -using xDataService.Constants; -using xDataService.Models; +using System; using xPushService.DI; using xDataService.DI; -using xPushService.Helpers; -using System; -using xExceptions.Constants; -using xContentService.Helpers; -using xCommons.Helpers; -using xContentService.Interfaces.Dtos; -using xContentService.Interfaces.Entities; using xDataService.Db; +using xCommons.Helpers; +using xDataService.Models; +using xCommons.Extensions; +using xPushService.Helpers; +using xExceptions.Constants; +using xDataService.Constants; +using xContentService.Helpers; +using xContentService.Constants; +using xContentService.Providers; +using xContentService.Interfaces; +using Microsoft.AspNetCore.Builder; +using xContentService.Providers.Dtos; +using xContentService.Interfaces.Dtos; +using xContentService.Providers.Entities; +using xContentService.Interfaces.Entities; +using xContentService.Providers.Enrichers; +using xContentService.Interfaces.Enrichers; +using Microsoft.Extensions.DependencyInjection; namespace xContentService.DI { @@ -43,7 +47,7 @@ namespace xContentService.DI repositoryType: repositoryType ); } - + /// /// Register Service ... /// @@ -205,6 +209,19 @@ namespace xContentService.DI descriptor: descriptor ); + // + services.Add( + new ServiceDescriptor(typeof(IXContentTitleResourceProvider), typeof(XContentTitleResourceProvider), lifeTime) + ); + services.Add( + new ServiceDescriptor(typeof(IXContentDescriptionResourceProvider), typeof(XContentDescriptionResourceProvider), lifeTime) + ); + + // + services.Add( + new ServiceDescriptor(typeof(IXContentEnricher), typeof(XContentEnricher), lifeTime) + ); + // // Register Dto Services ... services.Add( @@ -231,7 +248,7 @@ namespace xContentService.DI // Log("Service Regitration Succeed ..."); - } + } #endregion } } \ No newline at end of file diff --git a/Interfaces/Dtos/IXContentRepositoryService.cs b/Interfaces/Dtos/IXContentRepositoryService.cs index 9525c69..3535164 100644 --- a/Interfaces/Dtos/IXContentRepositoryService.cs +++ b/Interfaces/Dtos/IXContentRepositoryService.cs @@ -1,10 +1,60 @@ using System; +using System.Threading; +using System.Threading.Tasks; +using xDataService.Interfaces; +using System.Collections.Generic; using xContentService.Models.Dtos; using xContentService.Models.Entities; -using xDataService.Interfaces; namespace xContentService.Interfaces.Dtos { public interface IXContentRepositoryService : IXBaseRepositoryService - { } + { + // + #region Enrichers ... + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + Task Enrich( + XContent source, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + Task Enrich( + XContentDto source, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ); + #endregion + } } \ No newline at end of file diff --git a/Interfaces/Enrichers/IXContentEnricher.cs b/Interfaces/Enrichers/IXContentEnricher.cs index e614e0e..ac93821 100644 --- a/Interfaces/Enrichers/IXContentEnricher.cs +++ b/Interfaces/Enrichers/IXContentEnricher.cs @@ -1,6 +1,58 @@ +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using xContentService.Models.Dtos; +using xContentService.Models.Entities; + namespace xContentService.Interfaces.Enrichers { - // TODO: Complete this ... public interface IXContentEnricher - { } + { + // + #region Enrichers ... + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + Task Enrich( + XContent source, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + Task Enrich( + XContentDto source, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ); + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ); + #endregion + } } \ No newline at end of file diff --git a/Interfaces/IXContentDescriptionResourceProvider.cs b/Interfaces/IXContentDescriptionResourceProvider.cs new file mode 100644 index 0000000..775a31a --- /dev/null +++ b/Interfaces/IXContentDescriptionResourceProvider.cs @@ -0,0 +1,7 @@ +using xStringService.Interfaces; + +namespace xContentService.Interfaces +{ + public interface IXContentDescriptionResourceProvider : IXItemResourceProvider + { } +} \ No newline at end of file diff --git a/Interfaces/IXContentProvider.cs b/Interfaces/IXContentProvider.cs new file mode 100644 index 0000000..6d81cdd --- /dev/null +++ b/Interfaces/IXContentProvider.cs @@ -0,0 +1,7 @@ +namespace xContentService.Interfaces +{ + public interface IXContentProvider + { + + } +} \ No newline at end of file diff --git a/Interfaces/IXContentTitleResourceProvider.cs b/Interfaces/IXContentTitleResourceProvider.cs new file mode 100644 index 0000000..5990531 --- /dev/null +++ b/Interfaces/IXContentTitleResourceProvider.cs @@ -0,0 +1,7 @@ +using xStringService.Interfaces; + +namespace xContentService.Interfaces +{ + public interface IXContentTitleResourceProvider : IXItemResourceProvider + { } +} \ No newline at end of file diff --git a/Providers/Dtos/XContentRepositoryService.cs b/Providers/Dtos/XContentRepositoryService.cs index 0968b73..677b4d7 100644 --- a/Providers/Dtos/XContentRepositoryService.cs +++ b/Providers/Dtos/XContentRepositoryService.cs @@ -1,26 +1,174 @@ using System; -using System.Collections.Generic; using AutoMapper; -using xContentService.Interfaces.Dtos; -using xContentService.Interfaces.Entities; -using xContentService.Models.Dtos; -using xContentService.Models.Entities; +using System.Linq; +using xModels.Dtos; +using System.Threading; +using xCommons.Extensions; using xDataService.Providers; +using System.Threading.Tasks; +using System.Collections.Generic; +using xContentService.Interfaces; +using xContentService.Models.Dtos; +using xIdentityService.Interfaces; +using xIdentityService.Extensions; +using xContentService.Interfaces.Dtos; +using xContentService.Models.Entities; +using xContentService.Interfaces.Entities; namespace xContentService.Providers.Dtos { public class XContentRepositoryService : XBaseRepositoryService, IXContentRepositoryService { + private readonly IXIdentityProvider identityProvider; + private readonly IXContentTitleResourceProvider titleResourceProvider; + private readonly IXContentDescriptionResourceProvider descriptionResourceProvider; + public XContentRepositoryService( IXContentRepository repository, + IXIdentityProvider identityProvider, + IXContentTitleResourceProvider titleResourceProvider, + IXContentDescriptionResourceProvider descriptionResourceProvider, IEnumerable mapperProfiles = null ) : base( repository, mapperProfiles ) - { } + { + this.identityProvider = identityProvider; + this.titleResourceProvider = titleResourceProvider; + this.descriptionResourceProvider = descriptionResourceProvider; + } // - // TODO: Implement Enrichers ... + #region Enrichers ... + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + public async Task Enrich( + XContent source, + CancellationToken cancellationToken = default + ) + { + // + // Mapping Default ... + var result = Mapper.Map(source); + result = await Enrich( + source: result, + cancellationToken: cancellationToken + ); + + // + return result; + } + + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + public async Task Enrich( + XContentDto source, + CancellationToken cancellationToken = default + ) + { + // + // Handdle Owner ... + XPersonDto owner = null; + if (!source.OwnerId.IsNullOrEmpty()) + { + // + // Try to Retrieve User Info ... + var device = identityProvider.GetDevice(); + var userInfo = await identityProvider.GetUserInfo( + device: device, + userSelectByParam: source.OwnerId + ); + owner = userInfo.ToXPersonDto(); + } + + // + // Hanlde Content Title ... + string contentTitle = string.Empty; + XResourceDto titleResource = await titleResourceProvider.GetResource( + identifier: source.Id, + cancellationToken: cancellationToken + ); + if (!titleResource.IsNullOrDefault()) + { + contentTitle = titleResource.Resource; + } + + // + // Hanlde Content Description ... + string contentDescription = string.Empty; + XResourceDto descriptionResource = await descriptionResourceProvider.GetResource( + identifier: source.Id, + cancellationToken: cancellationToken + ); + if (!descriptionResource.IsNullOrDefault()) + { + contentDescription = descriptionResource.Resource; + } + + // + // Attach Extracted Items ... + var result = Mapper.Map(source, options => + { + // + options.Items[nameof(source.Owner)] = owner; + options.Items[nameof(source.Title)] = contentTitle; + options.Items[nameof(source.TitleResource)] = titleResource; + options.Items[nameof(source.Description)] = contentDescription; + options.Items[nameof(source.DescriptionResource)] = descriptionResource; + }); + + // + return result; + } + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + public async Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ) + { + // + var tasks = sources + .Select(x => Enrich(x, cancellationToken)); + + // + var result = await Task.WhenAll(tasks); + return result; + } + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + public async Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ) + { + // + var tasks = sources + .Select(x => Enrich(x, cancellationToken)); + + // + var result = await Task.WhenAll(tasks); + return result; + } + #endregion } } \ No newline at end of file diff --git a/Providers/Enrichers/XContentEnricher.cs b/Providers/Enrichers/XContentEnricher.cs index 32731f8..f51e3d5 100644 --- a/Providers/Enrichers/XContentEnricher.cs +++ b/Providers/Enrichers/XContentEnricher.cs @@ -1,10 +1,162 @@ +using System.Linq; +using xModels.Dtos; +using System.Threading; +using xCommons.Extensions; +using System.Threading.Tasks; +using System.Collections.Generic; +using xContentService.Interfaces; +using xContentService.Models.Dtos; +using xIdentityService.Interfaces; +using xIdentityService.Extensions; +using xContentService.Models.Entities; using xContentService.Interfaces.Enrichers; namespace xContentService.Providers.Enrichers { public class XContentEnricher : IXContentEnricher { + private readonly IXIdentityProvider identityProvider; + private readonly IXContentTitleResourceProvider titleResourceProvider; + private readonly IXContentDescriptionResourceProvider descriptionResourceProvider; + + public XContentEnricher( + IXIdentityProvider identityProvider, + IXContentTitleResourceProvider titleResourceProvider, + IXContentDescriptionResourceProvider descriptionResourceProvider + ) + { + this.identityProvider = identityProvider; + this.titleResourceProvider = titleResourceProvider; + this.descriptionResourceProvider = descriptionResourceProvider; + } + // - // TODO: Complete this ... + #region Enrichers ... + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + public async Task Enrich( + XContent source, + CancellationToken cancellationToken = default + ) + { + // + // Mapping Default ... + var result = source.MapConvert(); + result = await Enrich( + source: result, + cancellationToken: cancellationToken + ); + + // + return result; + } + + /// + /// Enrich Specified Item ... + /// + /// + /// + /// + public async Task Enrich( + XContentDto source, + CancellationToken cancellationToken = default + ) + { + // + // Handdle Owner ... + XPersonDto owner = null; + if (!source.OwnerId.IsNullOrEmpty()) + { + // + // Try to Retrieve User Info ... + var device = identityProvider.GetDevice(); + var userInfo = await identityProvider.GetUserInfo( + device: device, + userSelectByParam: source.OwnerId + ); + owner = userInfo.ToXPersonDto(); + } + + // + // Hanlde Content Title ... + string contentTitle = string.Empty; + XResourceDto titleResource = await titleResourceProvider.GetResource( + identifier: source.Id, + cancellationToken: cancellationToken + ); + if (!titleResource.IsNullOrDefault()) + { + contentTitle = titleResource.Resource; + } + + // + // Hanlde Content Description ... + string contentDescription = string.Empty; + XResourceDto descriptionResource = await descriptionResourceProvider.GetResource( + identifier: source.Id, + cancellationToken: cancellationToken + ); + if (!descriptionResource.IsNullOrDefault()) + { + contentDescription = descriptionResource.Resource; + } + + // + // Attach Extracted Items ... + var result = source.MapConvert(); + result.Owner = owner; + result.Title = contentTitle; + result.TitleResource = titleResource; + result.Description = contentDescription; + result.DescriptionResource = descriptionResource; + + // + return result; + } + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + public async Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ) + { + // + var tasks = sources + .Select(x => Enrich(x, cancellationToken)); + + // + var result = await Task.WhenAll(tasks); + return result; + } + + /// + /// Enrich Specified Items ... + /// + /// + /// + /// + public async Task> EnrichRange( + IEnumerable sources, + CancellationToken cancellationToken = default + ) + { + // + var tasks = sources + .Select(x => Enrich(x, cancellationToken)); + + // + var result = await Task.WhenAll(tasks); + return result; + } + #endregion } } \ No newline at end of file diff --git a/Providers/XContentDescriptionResourceProvider.cs b/Providers/XContentDescriptionResourceProvider.cs new file mode 100644 index 0000000..7129237 --- /dev/null +++ b/Providers/XContentDescriptionResourceProvider.cs @@ -0,0 +1,18 @@ +using xStringService.Providers; +using xContentService.Constants; +using xContentService.Interfaces; +using xStringService.Interfaces.Dtos; + +namespace xContentService.Providers +{ + public class XContentDescriptionResourceProvider : XBaseItemResourceProvider, IXContentDescriptionResourceProvider + { + public XContentDescriptionResourceProvider( + IXStringServiceProvider stringProvider + ) : base( + stringProvider: stringProvider, + item: XContentServiceConstants.XContentDescriptionIdentifier + ) + { } + } +} \ No newline at end of file diff --git a/Providers/XContentProvider.cs b/Providers/XContentProvider.cs new file mode 100644 index 0000000..020338c --- /dev/null +++ b/Providers/XContentProvider.cs @@ -0,0 +1,9 @@ +using xContentService.Interfaces; + +namespace xContentService.Providers +{ + public class XContentProvider : IXContentProvider + { + + } +} \ No newline at end of file diff --git a/Providers/XContentTitleResourceProvider.cs b/Providers/XContentTitleResourceProvider.cs new file mode 100644 index 0000000..1790b64 --- /dev/null +++ b/Providers/XContentTitleResourceProvider.cs @@ -0,0 +1,18 @@ +using xStringService.Providers; +using xContentService.Constants; +using xContentService.Interfaces; +using xStringService.Interfaces.Dtos; + +namespace xContentService.Providers +{ + public class XContentTitleResourceProvider : XBaseItemResourceProvider, IXContentTitleResourceProvider + { + public XContentTitleResourceProvider( + IXStringServiceProvider stringProvider + ) : base( + stringProvider: stringProvider, + item: XContentServiceConstants.XContentTitleIdentifier + ) + { } + } +} \ No newline at end of file diff --git a/xContentService.csproj b/xContentService.csproj index 7b617e3..438f671 100644 --- a/xContentService.csproj +++ b/xContentService.csproj @@ -31,6 +31,7 @@ +