using System.Linq;
using WeApp.Authorization.Roles;
using WeApp.Authorization.Users;
using WeApp.Configuration;
using WeApp.EF;
using WeApp.MultiTenancy;
using IwbZero.Authorization.Base.Permissions;
using IwbZero.Authorization.Base.Users;
using IwbZero.MultiTenancy;
namespace WeApp.SeedData
{
public class RoleAndUserCreator
{
private readonly WeAppDbContext _context;
private int DefaultTenantId { get; set; }
public RoleAndUserCreator(WeAppDbContext context)
{
_context = context;
DefaultTenantId = 1;
}
public void Create()
{
CreateHostUsers();
CreateDefaultTenant();
CreateRolesAndUsers();
}
private void CreateHostUsers()
{
// Admin user for host
var adminUserForHost = _context.Users
.FirstOrDefault(u => u.TenantId == null && u.UserName == UserBase.HostAdminName);
if (adminUserForHost == null)
{
var user = User.CreateHostAdminUser();
user.SetNormalizedNames();
adminUserForHost = _context.Users.Add(user);
_context.SaveChanges();
}
AddUserPermission(adminUserForHost.Id, null);
// SYSTEM user for host
var systemUserForHost = _context.Users
.FirstOrDefault(u => u.TenantId == null && u.UserName == UserBase.HostSystemName);
if (systemUserForHost == null)
{
var user = User.CreateHostSystemUser();
user.SetNormalizedNames();
systemUserForHost = _context.Users.Add(user);
_context.SaveChanges();
}
AddUserPermission(systemUserForHost.Id, null);
}
private void CreateDefaultTenant()
{
var defaultTenant = _context.Tenants.FirstOrDefault(t => t.TenancyName == "Iwb");
if (defaultTenant == null)
{
defaultTenant = _context.Tenants.Add(new Tenant(TenantBase.DefaultTenantName, $"{TenantBase.DefaultTenantName}-租主"));
_context.SaveChanges();
}
DefaultTenantId = defaultTenant.Id;
}
private void CreateRolesAndUsers()
{
// admin role
var adminRole = _context.Roles.FirstOrDefault(r => r.TenantId == DefaultTenantId && r.Name == StaticRoleNames.Tenants.Admin);
if (adminRole == null)
{
adminRole = _context.Roles
.Add(new Role(DefaultTenantId, StaticRoleNames.Tenants.Admin, StaticRoleNames.Tenants.Admin)
{
IsStatic = true,
RoleType = UsersAndRolesTypeDefinition.Supper,
AccountType = AccountTypeDefinition.System,
});
_context.SaveChanges();
}
AddRolePermission(adminRole.Id);
// Admin user
var adminUser = _context.Users.FirstOrDefault(u => u.TenantId == DefaultTenantId && u.UserName == UserBase.AdminUserName);
if (adminUser == null)
{
adminUser = User.CreateTenantAdminUser(DefaultTenantId);
adminUser.IsEmailConfirmed = true;
adminUser.IsActive = true;
adminUser = _context.Users.Add(adminUser);
_context.SaveChanges();
}
// User Permission
AddUserPermission(adminUser.Id);
// System role
var systemRole = _context.Roles.FirstOrDefault(r => r.TenantId == DefaultTenantId && r.Name == StaticRoleNames.Tenants.System);
if (systemRole == null)
{
systemRole = _context.Roles
.Add(new Role(DefaultTenantId, StaticRoleNames.Tenants.System, StaticRoleNames.Tenants.System)
{
IsStatic = true,
RoleType = UsersAndRolesTypeDefinition.Supper,
AccountType = AccountTypeDefinition.System,
});
_context.SaveChanges();
}
// Role Permission
AddRolePermission(systemRole.Id);
// System user
var systemUser = _context.Users.FirstOrDefault(u => u.TenantId == DefaultTenantId && u.UserName == UserBase.SystemUserName);
if (systemUser == null)
{
systemUser = User.CreateTenantSystemUser(DefaultTenantId);
systemUser.IsEmailConfirmed = true;
systemUser.IsActive = true;
systemUser = _context.Users.Add(systemUser);
_context.SaveChanges();
// Assign Admin role to admin user
_context.UserRoles.Add(new UserRole(DefaultTenantId, systemUser.Id, systemRole.Id));
_context.SaveChanges();
}
}
#region 添加权限
///
/// 添加用户权限
///
///
///
private void AddUserPermission(long userId, int? tenantId = 0)
{
tenantId = tenantId == 0 ? DefaultTenantId : tenantId;
var funs = _context.SysFunctions.Where(a => a.IsDeleted == false).OrderBy(a => a.CreationTime);
foreach (var fun in funs)
{
_context.Permissions.Add(new PermissionSetting()
{
Name = fun.PermissionName,
TenantId = tenantId,
IsGranted = true,
Master = 2,
MasterValue = userId + ""
});
}
_context.SaveChanges();
}
///
/// 添加角色权限
///
///
///
private void AddRolePermission(int roleId, int? tenantId = 0)
{
var funs = _context.SysFunctions.Where(a => a.IsDeleted == false).OrderBy(a => a.CreationTime);
tenantId = tenantId == 0 ? DefaultTenantId : tenantId;
foreach (var fun in funs)
{
_context.Permissions.Add(new PermissionSetting
{
Name = fun.PermissionName,
TenantId = tenantId,
IsGranted = true,
Master = 1,
MasterValue = roleId + ""
});
}
_context.SaveChanges();
}
#endregion
}
}