using xStringService.Interfaces.Entities; using xServices.TermsConditions.Interfaces; using System.Threading.Tasks; using xCommons.Extensions; using xCommons.Configurations; using xStringService.Models.Entities; using xExceptions.Constants; using xIdentityModels.Models; using System.Linq; using Microsoft.AspNetCore.SignalR; using xServices.TermsConditions.Push; using System.Collections.Generic; using xPushService.Constants; namespace xServices.TermsConditions.Provides { public class XTermsComditionsProvider : IXTermsComditionsProvider { // #region Props ... private readonly string termsId; private readonly IHubContext hub; private readonly XAppConfiguration appConfiguration; private readonly IXStringRepository stringRepository; #endregion // #region Constructor ... public XTermsComditionsProvider( XAppConfiguration appConfiguration, IXStringRepository stringRepository, IHubContext hub = null, string termsId = "terms" ) { // this.termsId = termsId; this.stringRepository = stringRepository; this.hub = hub; this.appConfiguration = appConfiguration; } #endregion // #region Actions ... /// /// Retrieved all Exists Languages Terms and Conditions ... /// /// public async Task> TermsLanguages() { // var result = (await stringRepository .FindManyAsync(x => x.ResourceTitle == termsId)) .Select(x => x.Language); return result; } /// /// Check Has Terms and Conditions based on Specified Language ... /// /// if null, used Default Language ... /// public async Task HasTerms(string language = null) { // // Normalize ... if (language.IsNullOrEmpty()) { language = appConfiguration.DefaultLanguage; } // var result = !(await GetString(language: language)) .IsNullOrDefault(); // return result; } /// /// Retrieve Terms and Conditions for Specified Language ... /// /// if null, used Default Language ... /// public async Task GetTerms(string language = null) { // var result = string.Empty; var entity = await GetString(language: language); // if (!entity.IsNullOrDefault()) { result = entity.TranslatedValue; } // return result; } /// /// Add Terms and Conditions for Specified Language ... /// /// /// /// /// /// public async Task AddTerms( string language, string terms, XUserClaimsInfoDto userInfo = null, string connectionId = null ) { // // Validate ... var isValid = !language.IsNullOrEmpty() && !terms.IsNullOrEmpty() && !userInfo.IsNullOrDefault() && language != appConfiguration.DefaultLanguage; if (!isValid) { XException.InvalidArgs.Throw(); } // // Check Exists ... isValid = await HasTerms(language: language); if (isValid) { XException.Duplicate.Throw(); } // // Check Permission ... isValid = !userInfo.IsNullOrDefault() && userInfo.Roles.Any(r => r.ToNormalString().Contains("admin")); if (!isValid) { XException.NotAllowed.Throw(); } // // Add Terms ... XString entity = null; try { // entity = new XString { Language = language, ResourceTitle = termsId, TranslatedValue = terms, }; entity = await stringRepository.AddAsync(entity); } catch { } // var result = string.Empty; if (!entity.IsNullOrDefault()) { result = entity.TranslatedValue; } // if (!result.IsNullOrEmpty()) { // await SendPush( action: XBaseEntityHubAction.Add.GetStringValue(), payLoad: entity.ToJSON(camelCase: true), connectionId: connectionId ); } // return result; } /// /// Remove Terms and Conditions of Specified Language ... /// /// /// /// /// /// public async Task RemoveTerms( string language, XUserClaimsInfoDto userInfo = null, string connectionId = null ) { // var isValid = !language.IsNullOrEmpty() && !userInfo.IsNullOrDefault() && language != appConfiguration.DefaultLanguage; if (!isValid) { XException.InvalidArgs.Throw(); } // // Check Exists ... XString entity = await GetString(language); isValid = !entity.IsNullOrDefault(); if (!isValid) { XException.NotFound.Throw(); } // // Check Permission ... isValid = !userInfo.IsNullOrDefault() && userInfo.Roles.Any(r => r.ToNormalString().Contains("admin")); if (!isValid) { XException.NotAllowed.Throw(); } // try { entity = await stringRepository.RemoveAsync(entity.Id); } catch { entity = null; } // var result = !entity.IsNullOrDefault(); if (result) { // await SendPush( action: XBaseEntityHubAction.Delete.GetStringValue(), payLoad: entity.ToJSON(camelCase: true), connectionId: connectionId ); } // return result; } /// /// Update Terms and Conditions of Specified Language ... /// /// /// /// /// /// public async Task UpdateTerms( string language, string terms, XUserClaimsInfoDto userInfo = null, string connectionId = null ) { // var isValid = !terms.IsNullOrEmpty() && !language.IsNullOrEmpty() && !userInfo.IsNullOrDefault(); if (!isValid) { XException.InvalidArgs.Throw(); } // // Check Exists ... XString entity = await GetString(language); isValid = !entity.IsNullOrDefault(); if (!isValid) { XException.NotFound.Throw(); } // // Check Permission ... isValid = !userInfo.IsNullOrDefault() && userInfo.Roles.Any(r => r.ToNormalString().Contains("admin")); if (!isValid) { XException.NotAllowed.Throw(); } // try { // entity.TranslatedValue = terms; entity = await stringRepository.UpdateAsync(entity.Id, entity); } catch { entity = null; } // var result = !entity.IsNullOrDefault(); if (result) { // await SendPush( action: XBaseEntityHubAction.Update.GetStringValue(), payLoad: entity.ToJSON(camelCase: true), connectionId: connectionId ); } // return result; } #endregion // #region Hub Actions ... /// /// Send Custom Push Message ... /// /// /// /// /// public async Task SendPush( string action, string payLoad, string connectionId = null ) { // var actions = new List { XBaseEntityHubAction.Add.GetStringValue(), XBaseEntityHubAction.Update.GetStringValue(), XBaseEntityHubAction.Delete.GetStringValue(), }; // // Validate ... var isValid = !hub.IsNull() && !action.IsNullOrEmpty() && actions.Contains(action); if (!isValid) { return; } // var clients = hub.Clients.All; if (!connectionId.IsNullOrEmpty()) { clients = hub.Clients.AllExcept(connectionId); } try { await clients.SendAsync(action, payLoad, connectionId); } catch { } } #endregion // #region Private ... /// /// Retrieve Terms and Conditions XString Entity ... /// /// /// private async Task GetString(string language = null) { // // Normalize ... if (language.IsNullOrEmpty()) { language = appConfiguration.DefaultLanguage; } // // Retrieve ... XString result = null; try { // result = await stringRepository.FindOneAsync(x => x.Language == language && x.ResourceTitle == this.termsId ); } catch { } // return result; } #endregion } }