@page "/administration/user/{UserId}"
@using CurrieTechnologies.Razor.SweetAlert2
@using HopFrame.Database.Models
@using HopFrame.Security.Services
@using HopFrame.Web.Pages.Administration.Layout
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Forms
@using HopFrame.Web.Components
@using HopFrame.Web.Pages.Administration.Components
@layout AdminLayout
@rendermode InteractiveServer
Edit @User.Username
Edit @User.Username (@User.Id)
@**@
@inject IUserService Users
@inject IPermissionService Permissions
@inject NavigationManager Navigator
@inject SweetAlertService Alerts
@code {
[Parameter] public string UserId { get; set; }
private EditContext _context;
private ValidationMessageStore _messages;
[SupplyParameterFromForm] public User User { get; set; }
private IList _groups = new List();
private IList _allGroups = new List();
private string _selectedGroup;
private string _permissionToAdd;
private string _password;
protected override async Task OnInitializedAsync() {
if (Guid.TryParse(UserId, out var guid)) {
User = await Users.GetUser(guid);
}
if (User is null) {
Navigator.NavigateTo("/administration/users");
}
_groups = await Permissions.GetUserPermissionGroups(User);
_allGroups = await Permissions.GetPermissionGroups();
_context = new EditContext(User);
_context.OnValidationRequested += ValidateForm;
_messages = new ValidationMessageStore(_context);
}
private async Task OnEdit() {
var hasConflict = false;
var userByEmail = await Users.GetUserByEmail(User.Email);
if (userByEmail is not null && userByEmail.Id != User.Id) {
_messages.Add(() => User.Email, "Email is already in use");
hasConflict = true;
}
var userByUsername = await Users.GetUserByUsername(User.Username);
if (userByUsername is not null && userByUsername.Id != User.Id) {
_messages.Add(() => User.Username, "Username is already in use");
hasConflict = true;
}
if (hasConflict) return;
var result = await Alerts.FireAsync(new SweetAlertOptions {
Title = "Are you sure?",
Icon = SweetAlertIcon.Warning,
ConfirmButtonText = "Yes",
ShowCancelButton = true,
ShowConfirmButton = true
});
if (result.IsConfirmed) {
await Users.UpdateUser(User);
if (!string.IsNullOrWhiteSpace(_password)) {
await Users.ChangePassword(User, _password);
}
await Alerts.FireAsync(new SweetAlertOptions {
Title = "User edited!",
Icon = SweetAlertIcon.Success,
Timer = 1500,
ShowConfirmButton = false
});
Back();
}
}
private void Back() {
Navigator.NavigateTo("/administration/users");
}
private async Task RemoveGroup(PermissionGroup group) {
var result = await Alerts.FireAsync(new SweetAlertOptions {
Title = "Are you sure?",
Icon = SweetAlertIcon.Warning,
ConfirmButtonText = "Yes",
ShowCancelButton = true,
ShowConfirmButton = true
});
if (result.IsConfirmed) {
await Permissions.RemoveGroupFromUser(User, group);
_groups.Remove(group);
StateHasChanged();
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Group removed!",
Icon = SweetAlertIcon.Success,
Timer = 1500,
ShowConfirmButton = false
});
}
}
private async Task RemovePermission(Permission perm) {
var result = await Alerts.FireAsync(new SweetAlertOptions {
Title = "Are you sure?",
Icon = SweetAlertIcon.Warning,
ConfirmButtonText = "Yes",
ShowCancelButton = true,
ShowConfirmButton = true
});
if (result.IsConfirmed) {
await Permissions.RemovePermission(perm);
User.Permissions.Remove(perm);
StateHasChanged();
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Permission removed!",
Icon = SweetAlertIcon.Success,
Timer = 1500,
ShowConfirmButton = false
});
}
}
private async Task AddGroup() {
if (string.IsNullOrWhiteSpace(_selectedGroup)) {
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Select a group!",
Icon = SweetAlertIcon.Error,
ShowConfirmButton = true
});
return;
}
var group = _allGroups.SingleOrDefault(group => group.Name == _selectedGroup);
await Permissions.AddPermission(User, group?.Name);
_groups.Add(group);
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Group added!",
Icon = SweetAlertIcon.Success,
Timer = 1500,
ShowConfirmButton = false
});
}
private async Task AddPermission() {
if (string.IsNullOrWhiteSpace(_permissionToAdd)) {
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Enter a permission name!",
Icon = SweetAlertIcon.Error,
ShowConfirmButton = true
});
return;
}
await Permissions.AddPermission(User, _permissionToAdd);
User.Permissions.Add(await Permissions.GetPermission(_permissionToAdd, User));
_permissionToAdd = "";
await Alerts.FireAsync(new SweetAlertOptions {
Title = "Permission added!",
Icon = SweetAlertIcon.Success,
Timer = 1500,
ShowConfirmButton = false
});
}
private void ValidateForm(object sender, ValidationRequestedEventArgs e) {
_messages.Clear();
if (!User.Email.Contains("@") || !User.Email.Contains(".") || User.Email.EndsWith(".")) {
_messages.Add(() => User.Email, "Please enter a valid email address");
}
}
private string ConstructRedirectUrl() {
return "login?redirect=" + Navigator.Uri;
}
}