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()); }