using System.Text.Encodings.Web; using Microsoft.AspNetCore.Mvc.Rendering; using Nop.Core; using Nop.Core.Domain.Customers; using Nop.Core.Domain.Security; using Nop.Services.Customers; using Nop.Services.Localization; using Nop.Services.Security; using Nop.Web.Areas.Admin.Models.Security; using Nop.Web.Framework.Models.Extensions; namespace Nop.Web.Areas.Admin.Factories; /// /// Represents the security model factory implementation /// public partial class SecurityModelFactory : ISecurityModelFactory { #region Fields protected readonly HtmlEncoder _htmlEncoder; protected readonly ICustomerService _customerService; protected readonly ILocalizationService _localizationService; protected readonly IPermissionService _permissionService; #endregion #region Ctor public SecurityModelFactory(HtmlEncoder htmlEncoder, ICustomerService customerService, ILocalizationService localizationService, IPermissionService permissionService) { _htmlEncoder = htmlEncoder; _customerService = customerService; _localizationService = localizationService; _permissionService = permissionService; } #endregion #region Methods /// /// Prepare permission configuration model /// /// Permission configuration model /// /// A task that represents the asynchronous operation /// The task result contains the permission configuration model /// public virtual async Task PreparePermissionConfigurationModelAsync(PermissionConfigurationModel model) { ArgumentNullException.ThrowIfNull(model); var customerRoles = await _customerService.GetAllCustomerRolesAsync(true); model.AreCustomerRolesAvailable = customerRoles.Any(); var permissionRecords = await _permissionService.GetAllPermissionRecordsAsync(); model.IsPermissionsAvailable = permissionRecords.Any(); return model; } /// /// Prepare permission item model /// /// Permission record /// All available customer roles /// /// A task that represents the asynchronous operation /// The task result contains the permission item model /// public virtual async Task PreparePermissionItemModelAsync(PermissionRecord permissionRecord, IList availableRoles = null) { availableRoles ??= await _customerService.GetAllCustomerRolesAsync(showHidden: true); var mapping = await _permissionService.GetMappingByPermissionRecordIdAsync(permissionRecord.Id); var names = await mapping .Select(m => availableRoles.FirstOrDefault(p => p.Id == m.CustomerRoleId)) .Where(r => r != null).Select(r => _htmlEncoder.Encode(r.Name)).ToListAsync(); var (ids, appliedFor) = (mapping.Select(m => m.CustomerRoleId).ToList(), string.Join(", ", names)); //fill in model values from the entity var permissionItemModel = new PermissionItemModel { Id = permissionRecord.Id, PermissionName = await _localizationService.GetLocalizedPermissionNameAsync(permissionRecord), PermissionAppliedFor = appliedFor, SelectedCustomerRoleIds = ids.ToList(), AvailableCustomerRoles = availableRoles.Select(role => new SelectListItem { Text = role.Name, Value = role.Id.ToString(), Selected = ids.Contains(role.Id) }).ToList() }; return permissionItemModel; } /// /// Prepare permission category list model /// /// permission category search model /// /// A task that represents the asynchronous operation /// The task result contains the permission category list model /// public virtual async Task PreparePermissionCategoryListModelAsync(PermissionCategorySearchModel searchModel) { var permissions = await _permissionService.GetAllPermissionRecordsAsync(); var types = permissions .GroupBy(p => p.Category, p => p) .Select(p => p.Key).ToList(); var pagedTypes = types.ToPagedList(searchModel); //prepare list model var model = new PermissionCategoryListModel().PrepareToGrid(searchModel, pagedTypes, () => { //fill in model values from the entity return pagedTypes.Select(t => new PermissionCategoryModel { Name = t, Text = CommonHelper.SplitCamelCaseWord(t) }); }); return model; } /// /// Prepare paged permission item list model /// /// Permission item search model /// /// A task that represents the asynchronous operation /// The task result contains the permission item list model /// public virtual async Task PreparePermissionItemListModelAsync(PermissionItemSearchModel searchModel) { ArgumentNullException.ThrowIfNull(searchModel); //get permissions var permissionItems = (await _permissionService.GetAllPermissionRecordsAsync()) .Where(p => p.Category == searchModel.PermissionCategoryName) .ToList() .ToPagedList(searchModel); var availableRoles = await _customerService.GetAllCustomerRolesAsync(showHidden: true); //prepare list model var model = await new PermissionItemListModel().PrepareToGridAsync(searchModel, permissionItems, () => { //fill in model values from the entity return permissionItems.SelectAwait(async item => await PreparePermissionItemModelAsync(item, availableRoles)); }); return model; } #endregion }