This commit is contained in:
2026-05-30 00:40:48 +03:30
parent 4f7e1e1586
commit 3e141bd70f
7 changed files with 248 additions and 1047 deletions
@@ -1,387 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using xCommons.Configurations;
using xCommons.Extensions;
using xCommons.Providers;
using xExceptions.Constants;
using xIdentityService.Controllers;
using xIdentityService.Interfaces;
using xModels.Base;
using xModels.Dtos;
using xStringService.Interfaces;
using xStringService.Models.Dtos;
namespace xStringService.Controllers
{
/// <summary>
/// an Implementation of Base Actions of a Controller which Provides
/// XString Resource Service Actions ...
/// </summary>
public abstract class XBaseStringResourceProviderControllerBase : XBaseIdentityApiV1Controller, IXBaseStringResourceProviderControllerBase
{
private readonly IXBaseStringResourceProvider resourceProvider;
protected XBaseStringResourceProviderControllerBase(
ILogger<XBaseStringResourceProviderControllerBase> logger,
XAppConfiguration appConfiguration,
IXIdentityProvider identityProvider,
XValidationProvider validationProvider,
IXBaseStringResourceProvider resourceProvider
) : base(
logger,
appConfiguration,
identityProvider,
validationProvider
)
{
this.resourceProvider = resourceProvider;
}
/// <summary>
/// Add Specified Locales ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="locales"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("Add")]
public virtual async Task<ActionResult<IEnumerable<XStringDto>>> Add(
[FromQuery] string suffix,
[FromBody] XBaseRangeRequest<XLocaleResourceDto> locales,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(suffix)
.AddNotNull(locales)
.AddNotZeroChilds(locales.Items)
.ValidateGroupAsync();
//
var connectionId = GetConnectionId();
//
var result = await resourceProvider.Add(
suffix: suffix,
locales: locales.Items,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Add or Update Specified Locales ...
/// </summary>
/// <param name="resource"></param>
/// <param name="locales"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("AddOrUpdate")]
public virtual async Task<ActionResult<IEnumerable<XStringDto>>> AddOrUpdate(
[FromQuery] string resource,
[FromBody] XBaseRangeRequest<XLocaleResourceDto> locales,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(resource)
.AddNotNull(locales)
.AddNotZeroChilds(locales.Items)
.ValidateGroupAsync();
//
var connectionId = GetConnectionId();
//
var result = await resourceProvider.AddOrUpdate(
resource: resource,
locales: locales.Items,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Add Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="item"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("AddResource")]
public virtual async Task<ActionResult<XResourceDto>> AddResource(
[FromQuery] string suffix,
[FromBody] XResourceDto item,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(suffix)
.AddNotNull(item)
.AddNotZeroChilds(item.Locales)
.ValidateGroupAsync();
//
var connectionId = GetConnectionId();
//
var result = await resourceProvider.AddResource(
item: item,
suffix: suffix,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Get Specified Locale ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpGet("GetLocale")]
public virtual async Task<ActionResult<XLocaleResourceDto>> GetLocale(
[FromQuery] string suffix,
[FromQuery] string language = null,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(suffix)
.ValidateGroupAsync();
//
var result = await resourceProvider.GetLocale(
suffix: suffix,
language: language,
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Get Resources of Specified Resource Title ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpGet("GetResource")]
public virtual async Task<ActionResult<XResourceDto>> GetResource(
[FromQuery] string suffix,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(suffix)
.ValidateGroupAsync();
//
var result = await resourceProvider.GetResource(
suffix: suffix,
cancellationToken: cancellationToken
);
//
return Ok(result.ToDynamicObject());
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Remove all Resources which belongs to Specified Suffix ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpDelete("Remove")]
public virtual async Task<ActionResult> Remove(
[FromQuery] string suffix,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(suffix)
.ValidateGroupAsync();
//
var connectionId = GetConnectionId();
//
await resourceProvider.Remove(
suffix: suffix,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
/// <summary>
/// Remove Specified Resource ...
/// </summary>
/// <param name="resource"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpDelete("RemoveResource")]
public virtual async Task<ActionResult> Remove(
[FromQuery] string resource,
[FromQuery] string language,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
if (!ModelState.IsValid)
{
XException.InvalidArgs.Throw();
}
await ValidationProvider
.GroupValidationBuilder()
.AddNotEmpty(resource)
.AddNotEmpty(language)
.ValidateGroupAsync();
//
var connectionId = GetConnectionId();
//
await resourceProvider.Remove(
resource: resource,
language: language,
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
return Ok();
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
}
}
-136
View File
@@ -1,136 +0,0 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using xCommons.Configurations;
using xModels.Dtos;
using xStringService.Interfaces.Dtos;
using xStringService.Models.Dtos;
namespace xStringService.Interfaces
{
/// <summary>
/// a Base Class for Handling Resources Based on Specified Types on
/// String Resources Use ...
/// such as:
/// - Terms and Conditions;
/// - Contents;
/// - News;
/// - etc ...
/// </summary>
public interface IXBaseStringResourceProvider
{
//
#region Props ...
string Prefix { get; }
IXStringServiceProvider Provider { get; }
XAppConfiguration AppConfiguration { get; }
#endregion
//
#region Actions ...
/// <summary>
/// Prepare Resource Title by Given Data ...
/// </summary>
/// <param name="suffix"></param>
/// <returns></returns>
string GetResourceTitle(string suffix);
/// <summary>
/// Add Specified Locales ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="locales"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<XStringDto>> Add(
string suffix,
IEnumerable<XLocaleResourceDto> locales,
string connectionId = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Add Or Update Specified Locals ...
/// </summary>
/// <param name="resource"></param>
/// <param name="locales"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<XStringDto>> AddOrUpdate(
string resource,
IEnumerable<XLocaleResourceDto> locales,
string connectionId = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Get Specified Locale ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<XLocaleResourceDto> GetLocale(
string suffix,
string language = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Add Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="item"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<XResourceDto> AddResource(
string suffix,
XResourceDto item,
string connectionId = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Get Resources of Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<XResourceDto> GetResource(
string suffix,
CancellationToken cancellationToken = default
);
/// <summary>
/// Remove Specified Suffix Resources ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Remove(
string suffix,
string connectionId = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Remove Specified Resource ...
/// </summary>
/// <param name="resource"></param>
/// <param name="language"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task Remove(
string resource,
string language,
string connectionId = null,
CancellationToken cancellationToken = default
);
#endregion
}
}
@@ -1,111 +0,0 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using xModels.Base;
using xModels.Dtos;
using xStringService.Models.Dtos;
namespace xStringService.Interfaces
{
/// <summary>
/// an Interface which Described Base Actions of a Controller which Provides
/// XString Resource Service Actions ...
/// </summary>
public interface IXBaseStringResourceProviderControllerBase
{
/// <summary>
/// Add Specified Locales ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="locales"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("Add")]
Task<ActionResult<IEnumerable<XStringDto>>> Add(
[FromQuery] string suffix,
[FromBody] XBaseRangeRequest<XLocaleResourceDto> locales,
CancellationToken cancellationToken = default
);
/// <summary>
/// Add or Update Specified Locales ...
/// </summary>
/// <param name="resource"></param>
/// <param name="locales"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("AddOrUpdate")]
Task<ActionResult<IEnumerable<XStringDto>>> AddOrUpdate(
[FromQuery] string resource,
[FromBody] XBaseRangeRequest<XLocaleResourceDto> locales,
CancellationToken cancellationToken = default
);
/// <summary>
/// Add Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="item"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpPost("AddResource")]
Task<ActionResult<XResourceDto>> AddResource(
[FromQuery] string suffix,
[FromBody] XResourceDto item,
CancellationToken cancellationToken = default
);
/// <summary>
/// Get Specified Locale ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpGet("GetLocale")]
Task<ActionResult<XLocaleResourceDto>> GetLocale(
[FromQuery] string suffix,
[FromQuery] string language = null,
CancellationToken cancellationToken = default
);
/// <summary>
/// Get Resources of Specified Resource Title ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpGet("GetResource")]
Task<ActionResult<XResourceDto>> GetResource(
[FromQuery] string suffix,
CancellationToken cancellationToken = default
);
/// <summary>
/// Remove all Resources which belongs to Specified Suffix ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpDelete("Remove")]
Task<ActionResult> Remove(
[FromQuery] string suffix,
CancellationToken cancellationToken = default
);
/// <summary>
/// Remove Specified Resource ...
/// </summary>
/// <param name="resource"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpDelete("RemoveResource")]
Task<ActionResult> Remove(
[FromQuery] string resource,
[FromQuery] string language,
CancellationToken cancellationToken = default
);
}
}
+56
View File
@@ -0,0 +1,56 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using xStringService.Models.Dtos;
namespace xStringService.Interfaces
{
public interface IXItemResourceProvider
{
//
#region All Item Actions ...
/// <summary>
/// Retrieve a List of Exists Languages for Current Item ...
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<string>> GetLanguages(
CancellationToken cancellationToken = default
);
/// <summary>
/// Retrieve all Exists Items of type ...
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<XStringDto>> GetResourceLocales(
CancellationToken cancellationToken = default
);
#endregion
//
#region Single Item Actions ...
/// <summary>
/// Retrieve a List of Exists Languages for Current Item ...
/// </summary>
/// <param name="identifier"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<string>> GetLanguages(
object identifier,
CancellationToken cancellationToken = default
);
/// <summary>
/// Retrieve all Exists Items of type ...
/// </summary>
/// <param name="identifier"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<XStringDto>> GetResourceLocales(
object identifier,
CancellationToken cancellationToken = default
);
#endregion
}
}
+189
View File
@@ -0,0 +1,189 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using xCommons.Extensions;
using xExceptions.Constants;
using xStringService.Interfaces;
using xStringService.Interfaces.Dtos;
using xStringService.Models.Dtos;
namespace xStringService.Providers
{
public abstract class XBaseItemResourceProvider : IXItemResourceProvider
{
/// <summary>
/// Item Name for Resource Providing ...
/// </summary>
private readonly string item;
/// <summary>
/// an Implementation of Item Resource Provider
/// </summary>
/// <value></value>
private readonly XBaseResourceProvider provider;
/// <summary>
/// String Provider Service ...
/// </summary>
private readonly IXStringServiceProvider stringProvider;
//
#region Constructor ...
protected XBaseItemResourceProvider(
string item,
IXStringServiceProvider stringProvider
)
{
//
this.item = item;
this.stringProvider = stringProvider;
provider = new XBaseResourceProvider(
item,
stringProvider
);
}
#endregion
//
#region All Item Actions ...
/// <summary>
/// Retrieve a List of Exists Languages for Current Item ...
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<string>> GetLanguages(
CancellationToken cancellationToken = default
)
{
//
var result =
(await GetResourceLocales(cancellationToken))
.Select(x => x.Language)
.Distinct()
.ToList();
//
return result;
}
/// <summary>
/// Retrieve all Exists Items of type ...
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<XStringDto>> GetResourceLocales(
CancellationToken cancellationToken = default
)
{
//
var identifier = GetResourceTitle();
var result = await stringProvider
.FindManyAsync(
includeBuilder: null,
ignoreSoftDeleteds: true,
cancellationToken: cancellationToken,
orderBuilder:
x => x
.OrderBy(y => y.Language)
.ThenBy(y => y.ResourceTitle),
predicate: x =>
x.ResourceTitle.StartsWith(identifier, StringComparison.InvariantCultureIgnoreCase)
);
//
return result;
}
#endregion
//
#region Single Item Actions ...
/// <summary>
/// Retrieve a List of Exists Languages for Current Item ...
/// </summary>
/// <param name="identifier"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<string>> GetLanguages(
object identifier,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
var isValid = !identifier.IsNull();
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Set Identifier ...
SetResourceTitle(identifier);
//
var result =
await provider.GetLanguages(cancellationToken);
return result;
}
/// <summary>
/// Retrieve all Exists Items of type ...
/// </summary>
/// <param name="identifier"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<XStringDto>> GetResourceLocales(
object identifier,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
var isValid = !identifier.IsNull();
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Set Identifier ...
SetResourceTitle(identifier);
//
var result =
await provider.GetResourceLocales(cancellationToken);
return result;
}
#endregion
//
#region Private ...
private string GetResourceTitle(object identifier = null)
{
//
var result = item;
//
if (!identifier.IsNull())
{
result = $"{item}_{identifier}";
}
//
return result;
}
private void SetResourceTitle(object identifier = null)
{
//
var itemIdentifier = GetResourceTitle(identifier);
provider.SetField(
field: "resource",
value: $"{itemIdentifier}"
);
}
#endregion
}
}
+3 -8
View File
@@ -14,12 +14,12 @@ using xStringService.Models.Dtos;
namespace xStringService.Providers
{
public abstract class XBaseResourceProvider : IXResourceProvider
public class XBaseResourceProvider : IXResourceProvider
{
protected string resource;
private readonly IXStringServiceProvider provider;
protected XBaseResourceProvider(
public XBaseResourceProvider(
string resource,
IXStringServiceProvider provider
)
@@ -364,7 +364,7 @@ namespace xStringService.Providers
#endregion
//
#region Provate ...
#region Private ...
private async Task<IEnumerable<XStringDto>> ExtractItems(
CancellationToken cancellationToken = default
)
@@ -384,11 +384,6 @@ namespace xStringService.Providers
//
return result;
}
// public void SetResourceTitle(string resource)
// {
// this.resource = resource;
// }
#endregion
}
}
-405
View File
@@ -1,405 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using xCommons.Configurations;
using xCommons.Extensions;
using xExceptions.Constants;
using xModels.Dtos;
using xStringService.Extensions;
using xStringService.Interfaces;
using xStringService.Interfaces.Dtos;
using xStringService.Models.Dtos;
namespace xStringService.Providers
{
/// <summary>
/// a Base Class for Handling Resources Based on Specified Types on
/// String Resources Use ...
/// such as:
/// - Terms and Conditions;
/// - Contents;
/// - News;
/// - etc ...
/// </summary>
public abstract class XBaseStringResourceProvider : IXBaseStringResourceProvider
{
//
#region Props ...
public string Prefix { get; }
public IXStringServiceProvider Provider { get; }
public XAppConfiguration AppConfiguration { get; }
#endregion
//
#region Constructor ...
public XBaseStringResourceProvider(
string prefix,
IXStringServiceProvider provider,
XAppConfiguration appConfiguration
)
{
//
Prefix = prefix;
Provider = provider;
AppConfiguration = appConfiguration;
}
#endregion
//
#region Actions ...
/// <summary>
/// Prepare Resource Title by Given Data ...
/// </summary>
/// <param name="suffix"></param>
/// <returns></returns>
public string GetResourceTitle(string suffix)
{
//
string result = "";
//
if (suffix.IsNullOrEmpty())
{
return result;
}
//
result = $"{Prefix}_${suffix}";
//
return result;
}
/// <summary>
/// Add Specified Locales ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="locales"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<XStringDto>> Add(
string suffix,
IEnumerable<XLocaleResourceDto> locales,
string connectionId = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
var has =
locales.HasChild() &&
!suffix.IsNullOrEmpty();
if (!has)
{
XException.InvalidArgs.Throw();
}
//
// Prepare Resource ID ...
string resourceID = GetResourceTitle(suffix);
var result = await locales.SelectAsync(async l =>
{
//
// Normalize Language ...
if (l.Language.IsNullOrEmpty())
{
l.Language = AppConfiguration.DefaultLanguage;
}
//
// Prepare Model for Add ...
var model = new XStringDto
{
Language = l.Language,
TranslatedValue = l.Value,
ResourceTitle = resourceID,
};
model = await Provider.AddAsync(
item: model,
saveChanges: true,
connectionId: connectionId,
cancellationToken: cancellationToken
);
return model;
});
//
return result;
}
/// <summary>
/// Add Or Update Specified Locals ...
/// </summary>
/// <param name="resource"></param>
/// <param name="locales"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<IEnumerable<XStringDto>> AddOrUpdate(
string resource,
IEnumerable<XLocaleResourceDto> locales,
string connectionId = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
bool isValid =
locales.HasChild() &&
!resource.IsNullOrEmpty() &&
locales.All(l => !l.Value.IsNullOrEmpty() && !l.Language.IsNullOrEmpty());
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Check Resource ...
isValid = resource.Contains(Prefix);
if (!isValid)
{
XException.NotAllowed.Throw();
}
//
var result = await locales.SelectAsync(async l =>
await Provider.AddOrUpdateByLocaleResource(
item: l,
resource: resource,
connectionId: connectionId,
cancellationToken: cancellationToken
)
);
//
return result;
}
/// <summary>
/// Get Specified Locale ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="language"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<XLocaleResourceDto> GetLocale(
string suffix,
string language = null,
CancellationToken cancellationToken = default
)
{
//
// Normalize ...
if (language.IsNullOrEmpty())
{
language = AppConfiguration.DefaultLanguage;
}
//
// Validate ...
if (suffix.IsNullOrEmpty() || language.IsNullOrEmpty())
{
XException.InvalidArgs.Throw();
}
//
// Prepare Resource Title ...
string resource = GetResourceTitle(suffix);
//
// Check Resource Exists ...
var isExists = await Provider.IsResourceExists(
resource: resource,
language: language,
cancellationToken: cancellationToken
);
if (!isExists)
{
XException.NotFound.Throw();
}
//
// Retrieve and Validate Dto Model ...
var model = await Provider.Get(
resource: resource,
language: language,
cancellationToken: cancellationToken
);
if (model.IsNullOrDefault())
{
XException.ActionFailed.Throw();
}
//
// Prepare Result ...
var result = model
.ToXLocaleResourceDto();
return result;
}
/// <summary>
/// Add Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="item"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<XResourceDto> AddResource(
string suffix,
XResourceDto item,
string connectionId = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
if (suffix.IsNullOrEmpty() ||
item.IsNull() ||
!item.Locales.HasChild() ||
!item.Locales.All(l => !l.Value.IsNullOrEmpty()))
{
XException.InvalidArgs.Throw();
}
//
// Prepare Resource ID ...
var addedLocals = await Add(
suffix: suffix,
locales: item.Locales,
connectionId: connectionId,
cancellationToken: cancellationToken
);
if (!addedLocals.HasChild())
{
XException.ActionFailed.Throw();
}
//
var result = await GetResource(
suffix: suffix,
cancellationToken: cancellationToken
);
return result;
}
/// <summary>
/// Get Resources of Specified Resource ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<XResourceDto> GetResource(
string suffix,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
if (suffix.IsNullOrEmpty())
{
XException.InvalidArgs.Throw();
}
//
// Prepare Resource ID ...
string resourceID = GetResourceTitle(suffix);
//
// Prepare ...
var result = await Provider.GetResource(
resource: resourceID,
cancellationToken: cancellationToken
);
return result;
}
/// <summary>
/// Remove Specified Suffix Resources ...
/// </summary>
/// <param name="suffix"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task Remove(
string suffix,
string connectionId = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
if (suffix.IsNullOrEmpty())
{
XException.InvalidArgs.Throw();
}
//
var resourceID = GetResourceTitle(suffix);
await Provider.RemoveResource(
resource: resourceID,
connectionId: connectionId,
cancellationToken: cancellationToken
);
}
/// <summary>
/// Remove Specified Resource ...
/// </summary>
/// <param name="resource"></param>
/// <param name="language"></param>
/// <param name="connectionId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task Remove(
string resource,
string language,
string connectionId = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
bool isValid =
!resource.IsNullOrEmpty() &&
!language.IsNullOrEmpty();
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Check resource ID Contains Prefix ...
isValid = resource.Contains(Prefix);
if (!isValid)
{
XException.NotAllowed.Throw();
}
//
// Check Exists ...
var isExists = await Provider.IsResourceExists(
resource: resource,
language: language,
cancellationToken: cancellationToken
);
if (!isExists)
{
XException.NotFound.Throw();
}
//
// Remove Resource ...
await Provider.Remove(
resource: resource,
language: language,
connectionId: connectionId,
cancellationToken: cancellationToken
);
}
#endregion
}
}