Add user service

This commit is contained in:
Umar Bolatov
2021-03-14 12:24:32 -07:00
parent 907ae760e0
commit e5a196918f
5 changed files with 67 additions and 30 deletions

View File

@@ -40,6 +40,7 @@ namespace BTCPayServer.Controllers.GreenField
private readonly FileService _fileService; private readonly FileService _fileService;
private readonly StoredFileRepository _storedFileRepository; private readonly StoredFileRepository _storedFileRepository;
private readonly StoreRepository _storeRepository; private readonly StoreRepository _storeRepository;
private readonly UserService _userService;
public UsersController(UserManager<ApplicationUser> userManager, public UsersController(UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager, RoleManager<IdentityRole> roleManager,
@@ -52,7 +53,8 @@ namespace BTCPayServer.Controllers.GreenField
CssThemeManager themeManager, CssThemeManager themeManager,
FileService fileService, FileService fileService,
StoredFileRepository storedFileRepository, StoredFileRepository storedFileRepository,
StoreRepository storeRepository) StoreRepository storeRepository,
UserService userService)
{ {
_userManager = userManager; _userManager = userManager;
_roleManager = roleManager; _roleManager = roleManager;
@@ -66,6 +68,7 @@ namespace BTCPayServer.Controllers.GreenField
_fileService = fileService; _fileService = fileService;
_storedFileRepository = storedFileRepository; _storedFileRepository = storedFileRepository;
_storeRepository = storeRepository; _storeRepository = storeRepository;
_userService = userService;
} }
[Authorize(Policy = Policies.CanViewProfile, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanViewProfile, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@@ -197,7 +200,7 @@ namespace BTCPayServer.Controllers.GreenField
// We can safely delete the user if it's not an admin user // We can safely delete the user if it's not an admin user
if (!IsAdmin(roles)) if (!IsAdmin(roles))
{ {
await DeleteUserAndAssociatedData(userId, user); await _userService.DeleteUserAndAssociatedData(user);
return Ok(); return Ok();
} }
@@ -210,34 +213,26 @@ namespace BTCPayServer.Controllers.GreenField
} }
// Ok, this user is an admin but there are other admins as well so safe to delete // Ok, this user is an admin but there are other admins as well so safe to delete
await DeleteUserAndAssociatedData(userId, user); await _userService.DeleteUserAndAssociatedData(user);
return Ok(); return Ok();
} }
private async Task DeleteUserAndAssociatedData(string userId, ApplicationUser user)
{
var files = await _storedFileRepository.GetFiles(new StoredFileRepository.FilesQuery()
{
UserIds = new[] { userId },
});
await Task.WhenAll(files.Select(file => _fileService.RemoveFile(file.Id, userId)));
await _userManager.DeleteAsync(user);
await _storeRepository.CleanUnreachableStores();
}
private async Task<Boolean> IsAdmin() private async Task<Boolean> IsAdmin()
{ {
var anyAdmin = (await _userManager.GetUsersInRoleAsync(Roles.ServerAdmin)).Any(); var anyAdmin = (await _userManager.GetUsersInRoleAsync(Roles.ServerAdmin)).Any();
var isAuth = User.Identity.AuthenticationType == GreenFieldConstants.AuthenticationType; // You are an admin if there are no other admins
var isAdmin = anyAdmin ? (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.CanModifyServerSettings))).Succeeded if (!anyAdmin)
&& (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.Unrestricted))).Succeeded {
&& isAuth return true;
: true; }
return isAdmin; var isAuth = User.Identity.AuthenticationType == GreenFieldConstants.AuthenticationType;
return (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.CanModifyServerSettings))).Succeeded
&& (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.Unrestricted))).Succeeded
&& isAuth;
} }
private static bool IsAdmin(IList<string> roles) private static bool IsAdmin(IList<string> roles)

View File

@@ -236,15 +236,8 @@ namespace BTCPayServer.Controllers
if (user == null) if (user == null)
return NotFound(); return NotFound();
var files = await _StoredFileRepository.GetFiles(new StoredFileRepository.FilesQuery() await _userService.DeleteUserAndAssociatedData(user);
{
UserIds = new[] { userId },
});
await Task.WhenAll(files.Select(file => _FileService.RemoveFile(file.Id, userId)));
await _UserManager.DeleteAsync(user);
await _StoreRepository.CleanUnreachableStores();
TempData[WellKnownTempData.SuccessMessage] = "User deleted"; TempData[WellKnownTempData.SuccessMessage] = "User deleted";
return RedirectToAction(nameof(ListUsers)); return RedirectToAction(nameof(ListUsers));
} }

View File

@@ -46,6 +46,7 @@ namespace BTCPayServer.Controllers
public partial class ServerController : Controller public partial class ServerController : Controller
{ {
private readonly UserManager<ApplicationUser> _UserManager; private readonly UserManager<ApplicationUser> _UserManager;
private readonly UserService _userService;
readonly SettingsRepository _SettingsRepository; readonly SettingsRepository _SettingsRepository;
private readonly NBXplorerDashboard _dashBoard; private readonly NBXplorerDashboard _dashBoard;
private readonly StoreRepository _StoreRepository; private readonly StoreRepository _StoreRepository;
@@ -61,7 +62,9 @@ namespace BTCPayServer.Controllers
private readonly FileService _FileService; private readonly FileService _FileService;
private readonly IEnumerable<IStorageProviderService> _StorageProviderServices; private readonly IEnumerable<IStorageProviderService> _StorageProviderServices;
public ServerController(UserManager<ApplicationUser> userManager, public ServerController(
UserManager<ApplicationUser> userManager,
UserService userService,
StoredFileRepository storedFileRepository, StoredFileRepository storedFileRepository,
FileService fileService, FileService fileService,
IEnumerable<IStorageProviderService> storageProviderServices, IEnumerable<IStorageProviderService> storageProviderServices,
@@ -83,6 +86,7 @@ namespace BTCPayServer.Controllers
_FileService = fileService; _FileService = fileService;
_StorageProviderServices = storageProviderServices; _StorageProviderServices = storageProviderServices;
_UserManager = userManager; _UserManager = userManager;
_userService = userService;
_SettingsRepository = settingsRepository; _SettingsRepository = settingsRepository;
_dashBoard = dashBoard; _dashBoard = dashBoard;
HttpClientFactory = httpClientFactory; HttpClientFactory = httpClientFactory;

View File

@@ -112,6 +112,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<WalletRepository>(); services.TryAddSingleton<WalletRepository>();
services.TryAddSingleton<EventAggregator>(); services.TryAddSingleton<EventAggregator>();
services.TryAddSingleton<PaymentRequestService>(); services.TryAddSingleton<PaymentRequestService>();
services.TryAddSingleton<UserService>();
services.AddSingleton<ApplicationDbContextFactory>(); services.AddSingleton<ApplicationDbContextFactory>();
services.AddOptions<BTCPayServerOptions>().Configure( services.AddOptions<BTCPayServerOptions>().Configure(
(options) => (options) =>

View File

@@ -0,0 +1,44 @@
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Data;
using BTCPayServer.Storage.Services;
using BTCPayServer.Services.Stores;
using Microsoft.AspNetCore.Identity;
namespace BTCPayServer.Services
{
public class UserService
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly StoredFileRepository _storedFileRepository;
private readonly FileService _fileService;
private readonly StoreRepository _storeRepository;
public UserService(
UserManager<ApplicationUser> userManager,
StoredFileRepository storedFileRepository,
FileService fileService,
StoreRepository storeRepository
)
{
_userManager = userManager;
_storedFileRepository = storedFileRepository;
_fileService = fileService;
_storeRepository = storeRepository;
}
public async Task DeleteUserAndAssociatedData(ApplicationUser user)
{
var userId = user.Id;
var files = await _storedFileRepository.GetFiles(new StoredFileRepository.FilesQuery()
{
UserIds = new[] { userId },
});
await Task.WhenAll(files.Select(file => _fileService.RemoveFile(file.Id, userId)));
await _userManager.DeleteAsync(user);
await _storeRepository.CleanUnreachableStores();
}
}
}