using System; using System.Linq; using xModels.Dtos; using xIds.DbContext; using xIds.Interfaces; using xCommons.Extensions; using xIds.Configurations; using xIdentityModels.Dtos; using xExceptions.Constants; using System.Threading.Tasks; using xIdentityModels.Models; using System.Linq.Expressions; using IdentityServer4.Extensions; using xIdentityModels.Extensions; using Microsoft.EntityFrameworkCore.Query; namespace xIds.Providers { /// /// a Service For Manage Security Applications and also Api Key(s) ... /// public partial class XApplicationProvider : IXApplicationProvider { private readonly string permittedRole; private readonly XIdentityDbContext dbContext; private readonly IXIdentityManager identityManager; private readonly XDataServiceConfiguration configuration; private readonly XApiKeyConfiguration apiKeyConfiguration; public XApplicationProvider( XIdentityDbContext dbContext, IXIdentityManager identityManager, XDataServiceConfiguration configuration, XApiKeyConfiguration apiKeyConfiguration, string permittedRole = "admin" ) { // this.dbContext = dbContext; this.permittedRole = permittedRole; this.configuration = configuration; this.identityManager = identityManager; this.apiKeyConfiguration = apiKeyConfiguration; } /// /// Retrieve Owner ... /// /// /// public async Task GetOwner(string ownerId) { // if (ownerId.IsNullOrEmpty()) { XException.InvalidArgs.Throw(); } // var user = await identityManager.GetUserAsync(ownerId); XPersonDto result = user.ToXPerson(); if (result.IsNullOrDefault()) { XException.NotFound.Throw(); } // return result; } /// /// Check Specifed User Info is Owned for Action or not ... /// /// /// /// public bool IsOwned( XApplication source, XUserClaimsInfoDto userInfo = null ) { // var result = !source.IsNullOrDefault() && !userInfo.IsNullOrDefault() && (userInfo.UserId == source.OwnerId || userInfo.Roles .Any(r => r.ToNormalString() == permittedRole.ToNormalString())); // return result; } /// /// Check Specifed User Info is Owned for Action or not ... /// /// /// /// public bool IsOwned( XApplicationDto source, XUserClaimsInfoDto userInfo = null ) { // var result = !source.IsNullOrDefault() && !userInfo.IsNullOrDefault() && (userInfo.UserId == source.OwnerId || userInfo.Roles .Any(r => r.ToNormalString() == permittedRole.ToNormalString())); // return result; } /// /// Normalize an XQuery based on Data Service Configurations ... /// /// /// /// public XQuery NormalizeQuery( XQuery source, XDataServiceConfiguration configuration // ) { // if (source.IsNull()) { source = new XQuery(); } // // Page Size Normalization ... if (source.PageSize < configuration.PagingConfiguration.MinAvailablePageSize) { source.PageSize = configuration.PagingConfiguration.MinAvailablePageSize; } if (source.PageSize > configuration.PagingConfiguration.MaxAvailablePageSize) { source.PageSize = configuration.PagingConfiguration.MaxAvailablePageSize; } // return source; } /// /// Prepare a Queryable of Items ... /// /// /// /// /// public IQueryable GetApplicationsQeryable( Expression> predicate = null, Func, IOrderedQueryable> orderBuilder = null, Func, IIncludableQueryable> includeBuilder = null ) { // // Global Result ... var result = dbContext.Applications.AsQueryable(); // // Handle Filtering ... if (!predicate.IsNull()) { result = result.Where(predicate); } // // Handle Including ... if (!includeBuilder.IsNull()) { result = includeBuilder(result); } // // Handle Ordering ... if (!orderBuilder.IsNull()) { result = orderBuilder(result); } // // Return result ... return result; } /// /// Prepare a Queryable of Items ... /// /// /// /// /// public IQueryable GetApiKeysQeryable( Expression> predicate = null, Func, IOrderedQueryable> orderBuilder = null, Func, IIncludableQueryable> includeBuilder = null ) { // // Global Result ... var result = dbContext.ApiKeys.AsQueryable(); // // Handle Filtering ... if (!predicate.IsNull()) { result = result.Where(predicate); } // // Handle Including ... if (!includeBuilder.IsNull()) { result = includeBuilder(result); } // // Handle Ordering ... if (!orderBuilder.IsNull()) { result = orderBuilder(result); } // // Return result ... return result; } /// /// Prepare a Queryable of Items ... /// /// /// /// /// public IQueryable GetApiKeyUsagesQeryable( Expression> predicate = null, Func, IOrderedQueryable> orderBuilder = null, Func, IIncludableQueryable> includeBuilder = null ) { // // Global Result ... var result = dbContext.ApiKeyUsage.AsQueryable(); // // Handle Filtering ... if (!predicate.IsNull()) { result = result.Where(predicate); } // // Handle Including ... if (!includeBuilder.IsNull()) { result = includeBuilder(result); } // // Handle Ordering ... if (!orderBuilder.IsNull()) { result = orderBuilder(result); } // // Return result ... return result; } } }