public async Task <IReadOnlyList <ResourceInstancePermissions> > GetResourceInstancePermissionsAsync(string roleId, int resourceId)
        {
            var definition = _resources.FirstOrDefault(d => d.ResourceId == resourceId);

            if (definition == null)
            {
                throw new ApplicationException($"Can not find resource with ID {resourceId}");
            }

            var dataProviderType = definition.ResourceInstanceProviderTypeOrNull;

            if (dataProviderType == null)
            {
                throw new ApplicationException($"Data provider not specified for resource {definition.PermissionEnumType}");
            }

            var dataProvider = _resourceInstanceProviders.FirstOrDefault(r => r.GetType() == dataProviderType);

            if (dataProvider == null)
            {
                throw new ApplicationException($"Can not resolve service {dataProviderType} from Dependency Injection.");
            }

            var instances = await dataProvider.GetAllInstancesAsync();

            var permissions = await _permissionStore.GetRoleInstancePermissionsAsync(roleId, resourceId);

            var metadata            = AttributeHelper.GetResourceMetadata(definition.PermissionEnumType);
            var permissionsMetadata = metadata.Permissions.Where(p => p.IsForInstance).ToList();

            return(instances
                   .Select(r => ConvertInstance(r, definition.PermissionEnumType, permissionsMetadata, permissions))
                   .OrderBy(r => r.Name)
                   .ToList());
        }
示例#2
0
        public static int ToEnum(this ResourceCollection resources, int resourceId, int number)
        {
            var definition = resources.FirstOrDefault(r => r.ResourceId == resourceId);

            if (definition != null)
            {
                if (Enum.IsDefined(definition.PermissionEnumType, number))
                {
                    return(number);
                }
                throw new Exception($"Enum {definition.PermissionEnumType} does not contains permission with value {number}");
            }
            throw new Exception($"Unknown permission with number {number}");
        }
示例#3
0
        public static ResourcePermissionKey ToNumber(this ResourceCollection resources, Type permissionEnum, int permissionValue)
        {
            var definition = resources.FirstOrDefault(r => r.PermissionEnumType == permissionEnum);

            if (definition != null)
            {
                return(new ResourcePermissionKey
                {
                    ResourceId = definition.ResourceId,
                    PermissionId = (int)permissionValue
                });
            }

            throw new Exception($"Unknown permission '{permissionValue}' with type {permissionEnum}");
        }