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 @@
+