using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using Umbraco.Core; using Umbraco.Core.CodeAnnotations; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Actions; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { /// /// Converts an IUserGroup instance into a dictionary of permissions by category /// internal class UserGroupDefaultPermissionsResolver { private readonly ILocalizedTextService _textService; private readonly ActionCollection _actions; public UserGroupDefaultPermissionsResolver(ILocalizedTextService textService, ActionCollection actions) { _actions = actions; _textService = textService ?? throw new ArgumentNullException(nameof(textService)); } public IDictionary> Resolve(IUserGroup source) { return _actions .Where(x => x.CanBePermissionAssigned) .Select(x => GetPermission(x, source)) .GroupBy(x => x.Category) .ToDictionary(x => x.Key, x => (IEnumerable) x.ToArray()); } private Permission GetPermission(IAction action, IUserGroup source) { var result = new Permission(); result.Category = action.Category.IsNullOrWhiteSpace() ? _textService.Localize($"actionCategories/{Constants.Conventions.PermissionCategories.OtherCategory}") : _textService.Localize($"actionCategories/{action.Category}"); result.Name = _textService.Localize($"actions/{action.Alias}"); result.Description = _textService.Localize($"actionDescriptions/{action.Alias}"); result.Icon = action.Icon; result.Checked = source.Permissions != null && source.Permissions.Contains(action.Letter.ToString(CultureInfo.InvariantCulture)); result.PermissionCode = action.Letter.ToString(CultureInfo.InvariantCulture); return result; } } }