예제 #1
0
        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());
        }