using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Abp;
using Abp.Application.Features;
using Abp.Authorization;
using Abp.Collections.Extensions;
using Abp.Dependency;
using Abp.Domain.Repositories;
using Abp.MultiTenancy;
using Abp.Runtime.Session;
using IwbZero.Authorization.Users;
using IwbZero.BaseSysInfo;
namespace IwbZero.Authorization.Permissions
{
///
/// Permission manager.
///
public class IwbPermissionManager : IwbPermissionDefinitionContextBase, IIwbPermissionManager, ISingletonDependency
where TUser:IwbSysUser
where TFun:IwbSysFunction
{
public IAbpSession AbpSession { get; set; }
protected readonly IIocManager IocManager;
///
/// Constructor.
///
public IwbPermissionManager(IIocManager iocManager)
{
IocManager = iocManager;
AbpSession = NullAbpSession.Instance;
}
public virtual void Initialize()
{
using (var funRepository = IocManager.ResolveAsDisposable>())
{
var funs = funRepository.Object.GetAllList(a => a.IsDeleted == false);
Initialize(funs);
}
}
public virtual void Initialize(List funs)
{
var topFunNo = System.Configuration.ConfigurationManager.AppSettings["SystemFunction.Top.FunctionNo"] ?? "HTSystem";
var topFun = funs.FirstOrDefault(a => a.FunctionNo == topFunNo);
var topPermName = topFun?.PermissionName ?? "Pages";
var topPermission = GetPermissionOrNull(topPermName) ?? CreatePermission(topPermName);
AddChildPermission(topPermission, funs, topFunNo);
Permissions.AddAllPermissions();
}
public virtual Permission AddChildPermission(Permission permission, List funs, string parentFunNo)
{
var childFuns = funs.Where(a => a.ParentNo == parentFunNo);
foreach (var f in childFuns)
{
var childPermssion = permission.CreateChildPermission(f.PermissionName);
AddChildPermission(childPermssion, funs, f.FunctionNo);
}
return permission;
}
public virtual Permission GetPermission(string name)
{
var permission = Permissions.GetOrDefault(name);
if (permission == null)
{
throw new AbpException("There is no permission with name: " + name);
}
return permission;
}
public virtual IReadOnlyList GetAllPermissions(bool tenancyFilter = true)
{
using (var featureDependencyContext = IocManager.ResolveAsDisposable())
{
var featureDependencyContextObject = featureDependencyContext.Object;
return Permissions.Values
.WhereIf(tenancyFilter, p => p.MultiTenancySides.HasFlag(AbpSession.MultiTenancySide))
.Where(p =>
p.FeatureDependency == null ||
AbpSession.MultiTenancySide == MultiTenancySides.Host ||
p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
).ToImmutableList();
}
}
public virtual IReadOnlyList GetAllPermissions(MultiTenancySides multiTenancySides)
{
using (var featureDependencyContext = IocManager.ResolveAsDisposable())
{
var featureDependencyContextObject = featureDependencyContext.Object;
return Permissions.Values
.Where(p => p.MultiTenancySides.HasFlag(multiTenancySides))
.Where(p =>
p.FeatureDependency == null ||
AbpSession.MultiTenancySide == MultiTenancySides.Host ||
(p.MultiTenancySides.HasFlag(MultiTenancySides.Host) &&
multiTenancySides.HasFlag(MultiTenancySides.Host)) ||
p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
).ToImmutableList();
}
}
}
}