From d8bcc322399eaef73f09f8be7ba7efdf2ede297c Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Mon, 29 Mar 2021 12:58:40 -0400 Subject: [PATCH] refactor user deletion --- Oqtane.Client/Modules/Admin/Users/Index.razor | 2 +- .../Services/Interfaces/IUserService.cs | 4 +- Oqtane.Client/Services/UserService.cs | 6 +-- Oqtane.Server/Controllers/UserController.cs | 52 +++++++++++++++---- Oqtane.Server/Repository/FolderRepository.cs | 10 +--- .../Interfaces/IFolderRepository.cs | 1 - .../Repository/UserRoleRepository.cs | 4 +- 7 files changed, 50 insertions(+), 29 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 8ac788ee..e648083f 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -85,7 +85,7 @@ else var user = await UserService.GetUserAsync(UserRole.UserId, PageState.Site.SiteId); if (user != null) { - await UserService.DeleteUserAsync(user.UserId); + await UserService.DeleteUserAsync(user.UserId, PageState.Site.SiteId); await logger.LogInformation("User Deleted {User}", UserRole.User); StateHasChanged(); } diff --git a/Oqtane.Client/Services/Interfaces/IUserService.cs b/Oqtane.Client/Services/Interfaces/IUserService.cs index eca072c5..b47b3481 100644 --- a/Oqtane.Client/Services/Interfaces/IUserService.cs +++ b/Oqtane.Client/Services/Interfaces/IUserService.cs @@ -1,4 +1,4 @@ -using Oqtane.Models; +using Oqtane.Models; using System.Threading.Tasks; namespace Oqtane.Services @@ -13,7 +13,7 @@ namespace Oqtane.Services Task UpdateUserAsync(User user); - Task DeleteUserAsync(int userId); + Task DeleteUserAsync(int userId, int siteId); Task LoginUserAsync(User user, bool setCookie, bool isPersistent); diff --git a/Oqtane.Client/Services/UserService.cs b/Oqtane.Client/Services/UserService.cs index 34aaaebb..3538ecb7 100644 --- a/Oqtane.Client/Services/UserService.cs +++ b/Oqtane.Client/Services/UserService.cs @@ -1,4 +1,4 @@ -using Oqtane.Shared; +using Oqtane.Shared; using Oqtane.Models; using System.Net.Http; using System.Threading.Tasks; @@ -36,9 +36,9 @@ namespace Oqtane.Services return await PutJsonAsync($"{Apiurl}/{user.UserId}", user); } - public async Task DeleteUserAsync(int userId) + public async Task DeleteUserAsync(int userId, int siteId) { - await DeleteAsync($"{Apiurl}/{userId}"); + await DeleteAsync($"{Apiurl}/{userId}?siteid={siteId}"); } public async Task LoginUserAsync(User user, bool setCookie, bool isPersistent) diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs index 46189e57..4d3f1abc 100644 --- a/Oqtane.Server/Controllers/UserController.cs +++ b/Oqtane.Server/Controllers/UserController.cs @@ -111,7 +111,6 @@ namespace Oqtane.Controllers return null; } - //TODO shoud be moved to another layer private async Task CreateUser(User user) { User newUser = null; @@ -261,19 +260,50 @@ namespace Oqtane.Controllers // DELETE api//5?siteid=x [HttpDelete("{id}")] [Authorize(Roles = RoleNames.Admin)] - public async Task Delete(int id) + public async Task Delete(int id, string siteid) { - IdentityUser identityuser = await _identityUserManager.FindByNameAsync(_users.GetUser(id).Username); - - if (identityuser != null) + User user = _users.GetUser(id); + if (user != null) { - var result = await _identityUserManager.DeleteAsync(identityuser); - - if (result != null) + // remove user roles for site + foreach (UserRole userrole in _userRoles.GetUserRoles(user.UserId, Int32.Parse(siteid)).ToList()) { - _folders.DeleteUserFolder(id); - _users.DeleteUser(id); - _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Deleted {UserId}", id); + _userRoles.DeleteUserRole(userrole.UserRoleId); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Role Deleted {UserRole}", userrole); + } + + // remove user folder for site + var folder = _folders.GetFolder(Int32.Parse(siteid), Utilities.PathCombine("Users", user.UserId.ToString(), Path.DirectorySeparatorChar.ToString())); + if (folder != null) + { + if (Directory.Exists(_folders.GetFolderPath(folder))) + { + Directory.Delete(_folders.GetFolderPath(folder), true); + } + _folders.DeleteFolder(folder.FolderId); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Folder Deleted {Folder}", folder); + } + + // delete user if they are not a member of any other sites + if (!_userRoles.GetUserRoles(user.UserId, -1).Any()) + { + // get identity user + IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username); + if (identityuser != null) + { + // delete identity user + var result = await _identityUserManager.DeleteAsync(identityuser); + if (result != null) + { + // delete user + _users.DeleteUser(user.UserId); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Deleted {UserId}", user.UserId); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Delete, "Error Deleting User {UserId}", user.UserId, result.ToString()); + } + } } } } diff --git a/Oqtane.Server/Repository/FolderRepository.cs b/Oqtane.Server/Repository/FolderRepository.cs index a7acd0b3..dc7125bb 100644 --- a/Oqtane.Server/Repository/FolderRepository.cs +++ b/Oqtane.Server/Repository/FolderRepository.cs @@ -90,15 +90,7 @@ namespace Oqtane.Repository _db.Folder.Remove(folder); _db.SaveChanges(); } - public void DeleteUserFolder(int userId) - { - string userFolderPath = Utilities.PathCombine("Users", userId.ToString(), System.IO.Path.DirectorySeparatorChar.ToString()); - List folderIdsToDelete = new List(_db.Folder.Where(a => a.Path == userFolderPath).Select(a => a.FolderId)); - foreach (int folderId in folderIdsToDelete) - { - DeleteFolder(folderId); - } - } + public string GetFolderPath(int folderId) { Folder folder = _db.Folder.Find(folderId); diff --git a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs index 977d6a28..dba914a7 100644 --- a/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs +++ b/Oqtane.Server/Repository/Interfaces/IFolderRepository.cs @@ -12,7 +12,6 @@ namespace Oqtane.Repository Folder GetFolder(int folderId, bool tracking); Folder GetFolder(int siteId, string path); void DeleteFolder(int folderId); - void DeleteUserFolder(int userId); string GetFolderPath(int folderId); string GetFolderPath(Folder folder); } diff --git a/Oqtane.Server/Repository/UserRoleRepository.cs b/Oqtane.Server/Repository/UserRoleRepository.cs index 79f8a629..b47bd6f7 100644 --- a/Oqtane.Server/Repository/UserRoleRepository.cs +++ b/Oqtane.Server/Repository/UserRoleRepository.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; using Oqtane.Models; @@ -27,7 +27,7 @@ namespace Oqtane.Repository return _db.UserRole.Where(item => item.UserId == userId) .Include(item => item.Role) // eager load roles .Include(item => item.User) // eager load users - .Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null); + .Where(item => item.Role.SiteId == siteId || item.Role.SiteId == null || siteId == -1); } public UserRole AddUserRole(UserRole userRole)