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 StoredFileRepository _storedFileRepository;
private readonly StoreRepository _storeRepository;
private readonly UserService _userService;
public UsersController(UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
@@ -52,7 +53,8 @@ namespace BTCPayServer.Controllers.GreenField
CssThemeManager themeManager,
FileService fileService,
StoredFileRepository storedFileRepository,
StoreRepository storeRepository)
StoreRepository storeRepository,
UserService userService)
{
_userManager = userManager;
_roleManager = roleManager;
@@ -66,6 +68,7 @@ namespace BTCPayServer.Controllers.GreenField
_fileService = fileService;
_storedFileRepository = storedFileRepository;
_storeRepository = storeRepository;
_userService = userService;
}
[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
if (!IsAdmin(roles))
{
await DeleteUserAndAssociatedData(userId, user);
await _userService.DeleteUserAndAssociatedData(user);
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
await DeleteUserAndAssociatedData(userId, user);
await _userService.DeleteUserAndAssociatedData(user);
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()
{
var anyAdmin = (await _userManager.GetUsersInRoleAsync(Roles.ServerAdmin)).Any();
var isAuth = User.Identity.AuthenticationType == GreenFieldConstants.AuthenticationType;
var isAdmin = anyAdmin ? (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.CanModifyServerSettings))).Succeeded
&& (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.Unrestricted))).Succeeded
&& isAuth
: true;
// You are an admin if there are no other admins
if (!anyAdmin)
{
return 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)

View File

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

View File

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

View File

@@ -112,6 +112,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<WalletRepository>();
services.TryAddSingleton<EventAggregator>();
services.TryAddSingleton<PaymentRequestService>();
services.TryAddSingleton<UserService>();
services.AddSingleton<ApplicationDbContextFactory>();
services.AddOptions<BTCPayServerOptions>().Configure(
(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();
}
}
}