91 lines
No EOL
3.2 KiB
Text
91 lines
No EOL
3.2 KiB
Text
@using LANCommander.Server.Models
|
|
@using Microsoft.EntityFrameworkCore
|
|
@inject DatabaseServiceFactory DatabaseServiceFactory
|
|
@inherits FeedbackComponent<Guid, Guid>
|
|
@inject IMessageService MessageService
|
|
@inject ILogger<ManageRolesDialog> Logger
|
|
|
|
<Transfer DataSource="TransferItems" TargetKeys="TargetKeys" OnChange="OnChange" Titles="@(new string[] { "Available", "Assigned" })" />
|
|
|
|
@code {
|
|
User User;
|
|
ICollection<Role> Roles = new List<Role>();
|
|
ICollection<Role> SelectedRoles = new List<Role>();
|
|
IEnumerable<TransferItem> TransferItems { get; set; } = new List<TransferItem>();
|
|
List<string> TargetKeys { get; set; } = new List<string>();
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
TransferItems = Roles.Select(r => new TransferItem()
|
|
{
|
|
Key = r.Id.ToString(),
|
|
Title = r.Name
|
|
});
|
|
|
|
if (SelectedRoles != null)
|
|
TargetKeys = SelectedRoles.Select(i => i.Id.ToString()).ToList();
|
|
}
|
|
}
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await LoadData();
|
|
}
|
|
|
|
private async Task LoadData()
|
|
{
|
|
using (var userService = DatabaseServiceFactory.Create<UserService>())
|
|
using (var roleService = DatabaseServiceFactory.Create<RoleService>())
|
|
{
|
|
User = await userService.GetAsync(Options);
|
|
Roles = await roleService.GetAsync();
|
|
|
|
var currentRoles = await userService.GetRolesAsync(User.UserName);
|
|
|
|
SelectedRoles = Roles.Where(r => currentRoles.Any(cr => r.Name == cr.Name)).ToList();
|
|
}
|
|
}
|
|
|
|
async Task OnChange(TransferChangeArgs e)
|
|
{
|
|
SelectedRoles = Roles.Where(r => e.TargetKeys.Contains(r.Id.ToString())).ToList();
|
|
}
|
|
|
|
public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args)
|
|
{
|
|
using (var userService = DatabaseServiceFactory.Create<UserService>())
|
|
using (var roleService = DatabaseServiceFactory.Create<RoleService>())
|
|
{
|
|
var currentAdmins = await roleService.GetUsersAsync(RoleService.AdministratorRoleName);
|
|
|
|
try
|
|
{
|
|
var currentRoles = await userService.GetRolesAsync(User.UserName);
|
|
|
|
await userService.AddToRolesAsync(User.UserName, SelectedRoles.Select(r => r.Name).Where(r => !currentRoles.Any(cr => cr.Name == r)));
|
|
|
|
foreach (var role in currentRoles)
|
|
{
|
|
if (!SelectedRoles.Any(r => r.Name == role.Name))
|
|
{
|
|
if (role.Name == RoleService.AdministratorRoleName && currentAdmins.Any())
|
|
MessageService.Warning("Cannot demote the only administrator!");
|
|
else
|
|
await userService.RemoveFromRole(User.UserName, role.Name);
|
|
}
|
|
}
|
|
|
|
MessageService.Success("Updated user roles!");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageService.Error("Could not update user roles!");
|
|
Logger.LogError(ex, "Could not update user roles!");
|
|
}
|
|
}
|
|
|
|
await base.OkCancelRefWithResult!.OnOk(User.Id);
|
|
}
|
|
} |