Lieb-Website/Lieb/Pages/User/UserEdit.razor
2022-12-08 21:22:09 +01:00

133 lines
No EOL
4.1 KiB
Text

@page "/useredit"
@page "/useredit/{_userId}"
@using Lieb.Data
@using Lieb.Models
@using Lieb.Models.GuildWars2
@using System.ComponentModel.DataAnnotations
@using System.Security.Claims
@inject UserService UserService
@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject IJSRuntime JsRuntime
<h3>User Edit</h3>
<EditForm Model="@_user" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<AuthorizeView Policy="@Constants.Roles.Admin.Name" Context="authorizationContext">
<Authorized>
<p>@_submitMessage</p>
<p>
<label>
Banned Until:
<InputDate @bind-Value="_user.BannedUntil" />
</label>
@if (_user.BannedUntil >= DateTime.Now.Date)
{
<button type="delete">Ban</button>
}
else
{
<button type="submit">Unban</button>
}
</p>
</Authorized>
</AuthorizeView>
</EditForm>
<table>
<tr>
<th></th>
<th>Role</th>
<th>Type</th>
</tr>
@foreach (LiebRole role in _roles)
{
<tr>
@{
bool hasRole = _user.RoleAssignments.Where(a => a.LiebRoleId == role.LiebRoleId).Any();
bool disabled = _editingUserRights < role.LevelToAssign || role.Type == RoleType.GuildRole;
}
<td><input type="checkbox" disabled="@disabled" checked="@hasRole" @onchange="args => RoleStatusChanged(role, args)" /></td>
<td>@role.RoleName</td>
<td>@role.Type.ToString()</td>
</tr>
}
</table>
<br />
@code {
[Parameter]
public string _userId { get; set; }
private LiebUser _user;
private int _editingUserRights = 0;
private List<LiebRole> _roles;
private string _submitMessage = string.Empty;
protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
ulong discordId = ulong.Parse(authState.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value);
LiebUser editingUser = UserService.GetLiebUser(discordId);
foreach(RoleAssignment assignment in editingUser.RoleAssignments)
{
if(_editingUserRights < assignment.LiebRole.Level)
{
_editingUserRights = assignment.LiebRole.Level;
}
}
if(!string.IsNullOrEmpty(_userId) && ulong.TryParse(_userId, out ulong parsedId))
{
_user = UserService.GetLiebUser(parsedId);
_roles = UserService.GetLiebRoles();
}
else
{
NavigationManager.NavigateTo("useroverview");
}
}
async Task RoleStatusChanged(LiebRole role, ChangeEventArgs args)
{
bool isChecked = bool.Parse(args.Value.ToString());
RoleAssignment? assignment = _user.RoleAssignments.FirstOrDefault(a => a.LiebRoleId == role.LiebRoleId);
if(isChecked && assignment == null)
{
RoleAssignment roleAssignment = new RoleAssignment()
{
LiebRoleId = role.LiebRoleId,
LiebUserId = _user.Id
};
await UserService.AddRoleToUser(_user.Id, role.LiebRoleId);
_user.RoleAssignments.Add(roleAssignment);
}
else if(!isChecked && assignment != null)
{
await UserService.RemoveRoleFromUser(_user.Id, role.LiebRoleId);
_user.RoleAssignments.Remove(assignment);
}
}
private async Task HandleValidSubmit()
{
await UserService.UpdateBannedUntil(_user.Id, _user.BannedUntil);
if(_user.BannedUntil >= DateTime.Now.Date)
{
_submitMessage = "user banned successfully";
}
else
{
_submitMessage = "user unbanned successfully";
}
_user = UserService.GetLiebUser(_user.Id);
}
}