1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2024-10-17 03:42:50 +02:00
Minecraft-Phantom-Panel/Web/Phantom.Web/Shared/UserRolesDialog.razor

106 lines
3.8 KiB
Plaintext

@using System.Collections.Immutable
@using Phantom.Common.Data.Web.Users
@using Phantom.Web.Services.Authentication
@using Phantom.Web.Services.Users
@inherits UserEditDialogBase
@inject RoleManager RoleManager
@inject UserRoleManager UserRoleManager
<Modal Id="@ModalId" TitleText="Manage User Roles">
<Body>
Roles for user: <strong class="fw-semibold">@EditedUserName</strong><br>
@for (var index = 0; index < items.Count; index++) {
var item = items[index];
<div class="mt-1">
<input id="role-@index" type="checkbox" class="form-check-input" @bind="@item.Checked" />
<label for="role-@index" class="form-check-label">@item.Role.Name</label>
</div>
}
</Body>
<Footer>
<FormSubmitError Model="SubmitModel" />
<FormButtonSubmit Model="SubmitModel" Label="Save Roles" type="button" class="btn btn-success" @onclick="Submit" />
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @onclick="OnClosed">Cancel</button>
</Footer>
</Modal>
@code {
private ImmutableDictionary<Guid, RoleInfo> allRolesByGuid = ImmutableDictionary<Guid, RoleInfo>.Empty;
private List<RoleItem> items = new();
protected override async Task BeforeShown(UserInfo user) {
var allRoles = await RoleManager.GetAll(CancellationToken);
this.allRolesByGuid = allRoles.ToImmutableDictionary(static role => role.Guid, static role => role);
var currentRoleGuids = await UserRoleManager.GetUserRoles(user.Guid, CancellationToken);
this.items = allRoles.Select(role => new RoleItem(role, currentRoleGuids.Contains(role.Guid))).ToList();
}
protected override async Task<UserActionFailure?> DoEdit(AuthenticatedUser? authenticatedUser, UserInfo editedUser) {
var currentRoleGuids = await UserRoleManager.GetUserRoles(editedUser.Guid, CancellationToken);
var addToRoleGuids = ImmutableHashSet.CreateBuilder<Guid>();
var removeFromRoleGuids = ImmutableHashSet.CreateBuilder<Guid>();
foreach (var item in items) {
var roleGuid = item.Role.Guid;
var shouldHaveRole = item.Checked;
if (shouldHaveRole == currentRoleGuids.Contains(roleGuid)) {
continue;
}
if (shouldHaveRole) {
addToRoleGuids.Add(roleGuid);
}
else {
removeFromRoleGuids.Add(roleGuid);
}
}
return await DoChangeUserRoles(authenticatedUser, editedUser, addToRoleGuids.ToImmutable(), removeFromRoleGuids.ToImmutable());
}
private async Task<UserActionFailure?> DoChangeUserRoles(AuthenticatedUser? authenticatedUser, UserInfo editedUser, ImmutableHashSet<Guid> addToRoleGuids, ImmutableHashSet<Guid> removeFromRoleGuids) {
var result = await UserRoleManager.ChangeUserRoles(authenticatedUser, editedUser.Guid, addToRoleGuids, removeFromRoleGuids, CancellationToken);
if (!result) {
return result.Error;
}
var failedToAdd = addToRoleGuids.Except(result.Value.AddedToRoleGuids);
var failedToRemove = removeFromRoleGuids.Except(result.Value.RemovedFromRoleGuids);
if (failedToAdd.IsEmpty && failedToRemove.IsEmpty) {
await OnEditSuccess();
return null;
}
var errors = new List<string>();
foreach (var roleGuid in failedToAdd) {
errors.Add("Could not add role: " + GetRoleName(roleGuid));
}
foreach (var roleGuid in failedToRemove) {
errors.Add("Could not remove role: " + GetRoleName(roleGuid));
}
OnEditFailure(string.Join("\n", errors));
return null;
}
private string GetRoleName(Guid roleGuid) {
return allRolesByGuid.TryGetValue(roleGuid, out var role) ? role.Name : "?";
}
private sealed class RoleItem {
public RoleInfo Role { get; }
public bool Checked { get; set; }
public RoleItem(RoleInfo role, bool @checked) {
this.Role = role;
this.Checked = @checked;
}
}
}