diff --git a/LANCommander/Controllers/SettingsController.cs b/LANCommander/Controllers/SettingsController.cs deleted file mode 100644 index 61296b0..0000000 --- a/LANCommander/Controllers/SettingsController.cs +++ /dev/null @@ -1,149 +0,0 @@ -using LANCommander.Data.Models; -using LANCommander.Models; -using LANCommander.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; - -namespace LANCommander.Controllers -{ - [Authorize(Roles = "Administrator")] - public class SettingsController : BaseController - { - private readonly SettingService SettingService; - private readonly UserManager UserManager; - - public SettingsController(SettingService settingService, UserManager userManager) - { - SettingService = settingService; - UserManager = userManager; - } - - public IActionResult Index() - { - return RedirectToAction(nameof(General)); - } - - public IActionResult General() - { - var settings = SettingService.GetSettings(); - - return View(settings); - } - - [HttpPost] - public IActionResult General(LANCommanderSettings settings) - { - SettingService.SaveSettings(settings); - - return RedirectToAction(nameof(General)); - } - - public async Task Users() - { - var users = new List(); - - foreach (var user in UserManager.Users) - { - var savePath = Path.Combine("Save", user.Id.ToString()); - long saveSize = 0; - - if (Directory.Exists(savePath)) - saveSize = new DirectoryInfo(savePath).EnumerateFiles().Sum(f => f.Length); - - users.Add(new UserViewModel() - { - Id = user.Id, - UserName = user.UserName, - Roles = await UserManager.GetRolesAsync(user), - SavesSize = saveSize - }); - } - - return View(users); - } - - public async Task DeleteUser(Guid id) - { - var user = await UserManager.FindByIdAsync(id.ToString()); - var admins = await UserManager.GetUsersInRoleAsync("Administrator"); - - if (user.UserName == HttpContext.User.Identity.Name) - { - Alert("You cannot delete yourself!", "danger"); - - return RedirectToAction(nameof(Users)); - } - - if (admins.Count == 1 && admins.First().Id == id) - { - Alert("You cannot delete the only admin user!", "danger"); - - return RedirectToAction(nameof(Users)); - } - - try - { - await UserManager.DeleteAsync(user); - - Alert("User successfully deleted!", "success"); - - return RedirectToAction(nameof(Users)); - } - catch - { - Alert("User could not be deleted!", "danger"); - - return RedirectToAction(nameof(Users)); - } - } - - public async Task PromoteUser(Guid id) - { - var user = await UserManager.FindByIdAsync(id.ToString()); - - try - { - await UserManager.AddToRoleAsync(user, "Administrator"); - - Alert("User promoted to administrator!", "success"); - - return RedirectToAction(nameof(Users)); - } - catch (Exception ex) - { - Alert("User could not be promoted!", "danger"); - - return RedirectToAction(nameof(Users)); - } - } - - public async Task DemoteUser(Guid id) - { - var user = await UserManager.FindByIdAsync(id.ToString()); - var admins = await UserManager.GetUsersInRoleAsync("Administrator"); - - if (user.UserName == HttpContext.User.Identity.Name) - { - Alert("You cannot demote yourself!", "danger"); - - return RedirectToAction(nameof(Users)); - } - - try - { - await UserManager.RemoveFromRoleAsync(user, "Administrator"); - - Alert("User successfully demoted!", "success"); - - return RedirectToAction(nameof(Users)); - } - catch - { - Alert("User could not be demoted!", "danger"); - - return RedirectToAction(nameof(Users)); - } - } - } -} diff --git a/LANCommander/Pages/Settings/General.razor b/LANCommander/Pages/Settings/General.razor new file mode 100644 index 0000000..3e30182 --- /dev/null +++ b/LANCommander/Pages/Settings/General.razor @@ -0,0 +1,67 @@ +@page "/Settings/General" +@using LANCommander.Models; +@layout SettingsLayout +@inject SettingService SettingService +@inject ISnackbar Snackbar + + + + + General + + + + + IGDB Credentials + + + + In order to use IGDB metadata, you need a Twitch developer account. Click here for more details. + + + + + Save + + + +@code { + private MudForm Form; + private LANCommanderSettings Settings; + + private bool ShowIGDBClientSecret = false; + private InputType IGDBClientSecretInputType = InputType.Password; + private string IGDBClientSecretInputIcon = Icons.Material.Filled.Visibility; + + protected override async Task OnInitializedAsync() + { + Settings = SettingService.GetSettings(); + } + + private void ToggleClientSecretInput() + { + ShowIGDBClientSecret = !ShowIGDBClientSecret; + IGDBClientSecretInputIcon = ShowIGDBClientSecret ? Icons.Material.Filled.VisibilityOff : Icons.Material.Filled.Visibility; + IGDBClientSecretInputType = ShowIGDBClientSecret ? InputType.Text : InputType.Password; + } + + private void Save() + { + try + { + SettingService.SaveSettings(Settings); + Snackbar.Add("Settings saved!", Severity.Success); + } + catch + { + Snackbar.Add("An unknown error occurred", Severity.Error); + } + } +} diff --git a/LANCommander/Pages/Settings/SettingsLayout.razor b/LANCommander/Pages/Settings/SettingsLayout.razor new file mode 100644 index 0000000..3aee8af --- /dev/null +++ b/LANCommander/Pages/Settings/SettingsLayout.razor @@ -0,0 +1,19 @@ +@inherits LayoutComponentBase +@layout MainLayout + + + + + + Settings + + General + Users + + + + + @Body + + + \ No newline at end of file diff --git a/LANCommander/Pages/Settings/Users.razor b/LANCommander/Pages/Settings/Users.razor new file mode 100644 index 0000000..a380be9 --- /dev/null +++ b/LANCommander/Pages/Settings/Users.razor @@ -0,0 +1,91 @@ +@page "/Settings/Users" +@using LANCommander.Models; +@layout SettingsLayout +@inject UserManager UserManager +@inject RoleManager RoleManager +@inject ISnackbar Snackbar + + + + Users + + + + + + Username + Roles + Saves + + + + + @context.UserName + @String.Join(", ", context.Roles) + @ByteSizeLib.ByteSize.FromBytes(context.SavesSize) + + @if (!context.Roles.Any(r => r == "Administrator")) + { + Promote + } + else + { + Demote + } + + + + +@code { + private ICollection UserList { get; set; } + private string Search { get; set; } + + protected override async Task OnInitializedAsync() + { + await RefreshUserList(); + } + + private async Task RefreshUserList() + { + UserList = new List(); + + foreach (var user in UserManager.Users) + { + var savePath = Path.Combine("Save", user.Id.ToString()); + + long saveSize = 0; + + if (Directory.Exists(savePath)) + saveSize = new DirectoryInfo(savePath).EnumerateFiles().Sum(f => f.Length); + + UserList.Add(new UserViewModel() + { + Id = user.Id, + UserName = user.UserName, + Roles = await UserManager.GetRolesAsync(user), + SavesSize = saveSize + }); + } + } + + private async Task PromoteUser(UserViewModel user) + { + await UserManager.AddToRoleAsync(UserManager.Users.First(u => u.UserName == user.UserName), "Administrator"); + await RefreshUserList(); + + Snackbar.Add($"Promoted {user.UserName}!", Severity.Success); + } + + private async Task DemoteUser(UserViewModel user) + { + if (UserList.SelectMany(u => u.Roles).Count(r => r == "Administrator") == 1) + { + Snackbar.Add("Cannot demote the only administrator!", Severity.Error); + } + else + { + await UserManager.RemoveFromRoleAsync(UserManager.Users.First(u => u.UserName == user.UserName), "Administrator"); + await RefreshUserList(); + } + } +} diff --git a/LANCommander/Views/Settings/General.cshtml b/LANCommander/Views/Settings/General.cshtml deleted file mode 100644 index 19588bd..0000000 --- a/LANCommander/Views/Settings/General.cshtml +++ /dev/null @@ -1,61 +0,0 @@ -@model LANCommander.Models.LANCommanderSettings - -@{ - ViewData["Title"] = "Settings | Users"; -} - -
- - -
- -
-
-
-
- @{ - await Html.RenderPartialAsync("_SidebarPartial"); - } - -
-
-

General

-

IGDB Credentials

-

In order to use IGDB metadata, you need a Twitch developer account. Click here for more details.

-
-
- - -
-
- - -
-
-
- - -
-
-
-
-
- -@section Scripts { - @{ - await Html.RenderPartialAsync("_ValidationScriptsPartial"); - } -} diff --git a/LANCommander/Views/Settings/Users.cshtml b/LANCommander/Views/Settings/Users.cshtml deleted file mode 100644 index e6ca222..0000000 --- a/LANCommander/Views/Settings/Users.cshtml +++ /dev/null @@ -1,86 +0,0 @@ -@model IEnumerable - -@{ - ViewData["Title"] = "Settings | Users"; -} - -
- - -
- -
-
-
-
- @{ - await Html.RenderPartialAsync("_SidebarPartial"); - } - -
-
-

Users

-
- -
- - - - - - - - - - - - @foreach (var item in Model.OrderBy(u => u.UserName)) - { - - - - - - - } - -
UsernameRoleSaves
- @item.UserName - - @String.Join(", ", item.Roles) - - @ByteSizeLib.ByteSize.FromBytes(item.SavesSize) - -
- @if (!item.Roles.Any(r => r == "Administrator")) - { - Promote - } - else - { - Demote - } - Delete -
-
-
-
-
-
-
-
- -@section Scripts { - @{ - await Html.RenderPartialAsync("_ValidationScriptsPartial"); - } -} diff --git a/LANCommander/Views/Settings/_SidebarPartial.cshtml b/LANCommander/Views/Settings/_SidebarPartial.cshtml deleted file mode 100644 index 6e8578a..0000000 --- a/LANCommander/Views/Settings/_SidebarPartial.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
- General - Users -
-
-
\ No newline at end of file