using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using Abp.Application.Features;
using Abp.Localization;
using Abp.MultiTenancy;
namespace Abp.Authorization
{
///
/// Represents a permission.
/// A permission is used to restrict functionalities of the application from unauthorized users.
///
public class Permission
{
///
/// Parent of this permission if one exists.
/// If set, this permission can be granted only if parent is granted.
///
public Permission Parent { get; private set; }
///
/// Unique name of the permission.
/// This is the key name to grant permissions.
///
public string Name { get; }
///
/// Display name of the permission.
/// This can be used to show permission to the user.
///
public ILocalizableString DisplayName { get; set; }
///
/// A brief description for this permission.
///
public ILocalizableString Description { get; set; }
///
/// Which side can use this permission.
///
public MultiTenancySides MultiTenancySides { get; set; }
///
/// Depended feature(s) of this permission.
///
public IFeatureDependency FeatureDependency { get; set; }
///
/// List of child permissions. A child permission can be granted only if parent is granted.
///
public IReadOnlyList Children => _children.ToImmutableList();
private readonly List _children;
///
/// Creates a new Permission.
///
/// Unique name of the permission
/// Display name of the permission
/// A brief description for this permission
/// Which side can use this permission
/// Depended feature(s) of this permission
public Permission(
string name,
ILocalizableString displayName = null,
ILocalizableString description = null,
MultiTenancySides multiTenancySides = MultiTenancySides.Host | MultiTenancySides.Tenant,
IFeatureDependency featureDependency = null)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
Name = name;
DisplayName = displayName;
Description = description;
MultiTenancySides = multiTenancySides;
FeatureDependency = featureDependency;
_children = new List();
}
///
/// Adds a child permission.
/// A child permission can be granted only if parent is granted.
///
/// Returns newly created child permission
public Permission CreateChildPermission(
string name,
ILocalizableString displayName = null,
ILocalizableString description = null,
MultiTenancySides multiTenancySides = MultiTenancySides.Host | MultiTenancySides.Tenant,
IFeatureDependency featureDependency = null)
{
var permission = new Permission(name, displayName, description, multiTenancySides, featureDependency) { Parent = this };
_children.Add(permission);
return permission;
}
public void RemoveChildPermission(string name)
{
_children.RemoveAll(p => p.Name == name);
}
public override string ToString()
{
return string.Format("[Permission: {0}]", Name);
}
}
}