using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; 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 { public class XBaseResourceProvider : IXResourceProvider { protected string resource; private readonly IXStringServiceProvider provider; public XBaseResourceProvider( string resource, IXStringServiceProvider provider ) { this.resource = resource; this.provider = provider; } // #region Actions ... /// /// Retrieve a List of Exists Languages ... /// /// /// public virtual async Task> GetLanguages( CancellationToken cancellationToken = default ) { // var result = (await ExtractItems(cancellationToken)) .Select(x => x.Language) .Distinct() .ToList(); // return result; } /// /// Retrieve all Exists Items ... /// /// Specified Resource Title /// /// public virtual async Task> GetResourceLocales( CancellationToken cancellationToken = default ) { // var result = await ExtractItems(cancellationToken); // return result; } /// /// Extract Translation of in Specified Language ... /// /// Specified Language ... /// /// public virtual async Task GetResourceTranslation( string language, CancellationToken cancellationToken = default ) { // var item = (await ExtractItems(cancellationToken)) .FirstOrDefault(x => x.Language.Equals(language, StringComparison.InvariantCultureIgnoreCase)); // var result = item?.TranslatedValue ?? string.Empty; // return result; } /// /// Check Has Specified Translation or not ... /// /// Specified Language ... /// /// public virtual async Task HasLocale( string language, CancellationToken cancellationToken = default ) { // var item = (await ExtractItems(cancellationToken)) .FirstOrDefault(x => x.Language.Equals(language, StringComparison.InvariantCultureIgnoreCase)); // var result = !item.IsNullOrDefault(); // return result; } /// /// Retrieve as Locale Model ... /// /// Specified Language ... /// /// public virtual async Task GetLocale( string language, CancellationToken cancellationToken = default ) { // var item = (await ExtractItems(cancellationToken)) .FirstOrDefault(x => x.Language.Equals(language, StringComparison.InvariantCultureIgnoreCase)); // var result = !item.IsNullOrDefault() ? item.ToXLocaleResourceDto() : null; // return result; } /// /// Retrieve all Exists Locale Models ... /// /// /// public virtual async Task> GetLocales( CancellationToken cancellationToken = default ) { // var result = (await ExtractItems(cancellationToken)) .Select(x => x.ToXLocaleResourceDto()) .ToList(); // return result; } /// /// Retrieve as XResourceDto ... /// /// /// /// public virtual async Task GetResource( CancellationToken cancellationToken = default ) { // var locales = await GetLocales(); // var result = new XResourceDto { Locales = locales, Resource = resource, }; // return result; } /// /// Add or Update a Resource Model ... /// /// a XResourceDto Model ... /// /// /// public virtual async Task AddOrUpdateResource( XResourceDto resource, string connectionId = null, CancellationToken cancellationToken = default ) { // var isValid = !resource.IsNullOrDefault() && resource.Resource == this.resource; if (!isValid) { XException.InvalidArgs.Throw(); } // // Retrieve Exists Resource ... var result = await GetResource(cancellationToken); isValid = !result.IsNullOrDefault() && result.Locales.HasChild(); if (isValid) { await RemoveResource( resource: result, connectionId: connectionId, cancellationToken: cancellationToken ); } // foreach (var locale in resource.Locales) { // var item = new XStringDto { Language = locale.Language, ResourceTitle = this.resource, TranslatedValue = locale.Value, }; // await provider.AddAsync( item: item, saveChanges: true, connectionId: connectionId, cancellationToken: cancellationToken ); } // result = await GetResource(cancellationToken); return result; } /// /// Add Or Update Locale ... /// /// /// /// public virtual async Task AddOrUpdateLocale( XLocaleResourceDto locale, string connectionId = null, CancellationToken cancellationToken = default ) { // var item = (await ExtractItems(cancellationToken)) .FirstOrDefault(x => x.ResourceTitle == resource && x.Language == locale.Language); var isExists = !item.IsNullOrDefault(); if (isExists) { item.TranslatedValue = locale.Value; item = await provider.UpdateAsync( item: item, id: item.Id, saveChanges: true, connectionId: connectionId, cancellationToken: cancellationToken ); } else { item = new XStringDto { ResourceTitle = resource, Language = locale.Language, TranslatedValue = locale.Value }; item = await provider.AddAsync( item: item, saveChanges: true, connectionId: connectionId, cancellationToken: cancellationToken ); } // var result = await GetResource(cancellationToken); // return result; } /// /// Remove Locale ... /// /// /// /// /// public virtual async Task RemoveLocale( XLocaleResourceDto locale, string connectionId = null, CancellationToken cancellationToken = default ) { // var item = (await ExtractItems(cancellationToken)) .FirstOrDefault(x => x.ResourceTitle == resource && x.Language == locale.Language); var isExists = !item.IsNullOrDefault(); if (isExists) { await provider.RemoveAsync( id: item.Id, softDelete: false, saveChanges: true, connectionId: connectionId, cancellationToken: cancellationToken ); } // var result = await GetResource(cancellationToken); // return result; } /// /// Remove Specified Resource Model ... /// /// a XResourceDto Model ... /// /// /// public virtual async Task RemoveResource( XResourceDto resource, string connectionId = null, CancellationToken cancellationToken = default ) { // // Validate Resource ... var isValid = !resource.IsNullOrDefault() && !resource.Resource.IsNullOrEmpty() && resource.Resource == this.resource; if (!isValid) { XException.InvalidArgs.Throw(); } // var items = await ExtractItems(cancellationToken); // foreach (var item in items) { // await provider.RemoveAsync( id: item.Id, softDelete: false, saveChanges: true, connectionId: connectionId, cancellationToken: cancellationToken ); } } #endregion // #region Private ... private async Task> ExtractItems( CancellationToken cancellationToken = default ) { // var result = await provider.FindManyAsync( includeBuilder: null, ignoreSoftDeleteds: true, orderBuilder: x => x .OrderBy(y => y.Language) .ThenBy(y => y.ResourceTitle), cancellationToken: cancellationToken, predicate: x => x.ResourceTitle.Equals(resource, StringComparison.InvariantCultureIgnoreCase) ); // return result; } #endregion } }