diff --git a/BTCPayServer.Data/ApplicationDbContext.cs b/BTCPayServer.Data/ApplicationDbContext.cs index aebcee3f9..0ade8d393 100644 --- a/BTCPayServer.Data/ApplicationDbContext.cs +++ b/BTCPayServer.Data/ApplicationDbContext.cs @@ -75,6 +75,7 @@ namespace BTCPayServer.Data // some of the data models don't have OnModelCreating for now, commenting them + ApplicationUser.OnModelCreating(builder); AddressInvoiceData.OnModelCreating(builder); APIKeyData.OnModelCreating(builder); AppData.OnModelCreating(builder); diff --git a/BTCPayServer.Data/Data/ApplicationUser.cs b/BTCPayServer.Data/Data/ApplicationUser.cs index 0764d722b..07342221b 100644 --- a/BTCPayServer.Data/Data/ApplicationUser.cs +++ b/BTCPayServer.Data/Data/ApplicationUser.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; namespace BTCPayServer.Data { @@ -18,5 +19,14 @@ namespace BTCPayServer.Data public List Notifications { get; set; } public List UserStores { get; set; } public List Fido2Credentials { get; set; } + + public List> UserRoles { get; set; } + + public static void OnModelCreating(ModelBuilder builder) + { + builder.Entity() + .HasMany>(user => user.UserRoles) + .WithOne().HasForeignKey(role => role.UserId); + } } } diff --git a/BTCPayServer/Controllers/ServerController.Users.cs b/BTCPayServer/Controllers/ServerController.Users.cs index d28444916..17d9a03b9 100644 --- a/BTCPayServer/Controllers/ServerController.Users.cs +++ b/BTCPayServer/Controllers/ServerController.Users.cs @@ -20,7 +20,8 @@ namespace BTCPayServer.Controllers { [Route("server/users")] public async Task ListUsers( - UsersViewModel model, + [FromServices] RoleManager roleManager, + UsersViewModel model, string sortOrder = null ) { @@ -50,7 +51,9 @@ namespace BTCPayServer.Controllers } } + model.Roles = roleManager.Roles.ToDictionary(role => role.Id, role => role.Name); model.Users = await usersQuery + .Include(user => user.UserRoles) .Skip(model.Skip) .Take(model.Count) .Select(u => new UsersViewModel.UserViewModel @@ -59,16 +62,11 @@ namespace BTCPayServer.Controllers Email = u.Email, Id = u.Id, Verified = u.EmailConfirmed || !u.RequiresEmailConfirmation, - Created = u.Created + Created = u.Created, + Roles = u.UserRoles.Select(role => role.RoleId) }) .ToListAsync(); model.Total = await usersQuery.CountAsync(); - - foreach (UsersViewModel.UserViewModel uvm in model.Users) - { - var userId = await _UserManager.FindByIdAsync(uvm.Id); - uvm.IsAdmin = await _userService.IsAdminUser(userId);; - } return View(model); } diff --git a/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs b/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs index ff779883b..77c923439 100644 --- a/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs +++ b/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs @@ -13,8 +13,10 @@ namespace BTCPayServer.Models.ServerViewModels public bool Verified { get; set; } public bool IsAdmin { get; set; } public DateTimeOffset? Created { get; set; } + public IEnumerable Roles { get; set; } } public List Users { get; set; } = new List(); + public Dictionary Roles { get; set; } } } diff --git a/BTCPayServer/Views/Server/ListUsers.cshtml b/BTCPayServer/Views/Server/ListUsers.cshtml index 795fdacd3..7b4eb1e18 100644 --- a/BTCPayServer/Views/Server/ListUsers.cshtml +++ b/BTCPayServer/Views/Server/ListUsers.cshtml @@ -64,9 +64,9 @@ @user.Email - @if (user.IsAdmin) + @foreach (var role in user.Roles) { - Admin + @Model.Roles[role] } @user.Created?.ToBrowserDate()