Merge pull request #1201 from sbwalker/dev

refactor user deletion
This commit is contained in:
Shaun Walker 2021-03-29 12:56:18 -04:00 committed by GitHub
commit 77694da100
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 50 additions and 29 deletions

View File

@ -85,7 +85,7 @@ else
var user = await UserService.GetUserAsync(UserRole.UserId, PageState.Site.SiteId); var user = await UserService.GetUserAsync(UserRole.UserId, PageState.Site.SiteId);
if (user != null) if (user != null)
{ {
await UserService.DeleteUserAsync(user.UserId); await UserService.DeleteUserAsync(user.UserId, PageState.Site.SiteId);
await logger.LogInformation("User Deleted {User}", UserRole.User); await logger.LogInformation("User Deleted {User}", UserRole.User);
StateHasChanged(); StateHasChanged();
} }

View File

@ -1,4 +1,4 @@
using Oqtane.Models; using Oqtane.Models;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Oqtane.Services namespace Oqtane.Services
@ -13,7 +13,7 @@ namespace Oqtane.Services
Task<User> UpdateUserAsync(User user); Task<User> UpdateUserAsync(User user);
Task DeleteUserAsync(int userId); Task DeleteUserAsync(int userId, int siteId);
Task<User> LoginUserAsync(User user, bool setCookie, bool isPersistent); Task<User> LoginUserAsync(User user, bool setCookie, bool isPersistent);

View File

@ -1,4 +1,4 @@
using Oqtane.Shared; using Oqtane.Shared;
using Oqtane.Models; using Oqtane.Models;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -36,9 +36,9 @@ namespace Oqtane.Services
return await PutJsonAsync<User>($"{Apiurl}/{user.UserId}", user); return await PutJsonAsync<User>($"{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<User> LoginUserAsync(User user, bool setCookie, bool isPersistent) public async Task<User> LoginUserAsync(User user, bool setCookie, bool isPersistent)

View File

@ -111,7 +111,6 @@ namespace Oqtane.Controllers
return null; return null;
} }
//TODO shoud be moved to another layer
private async Task<User> CreateUser(User user) private async Task<User> CreateUser(User user)
{ {
User newUser = null; User newUser = null;
@ -261,19 +260,50 @@ namespace Oqtane.Controllers
// DELETE api/<controller>/5?siteid=x // DELETE api/<controller>/5?siteid=x
[HttpDelete("{id}")] [HttpDelete("{id}")]
[Authorize(Roles = RoleNames.Admin)] [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); User user = _users.GetUser(id);
if (user != null)
if (identityuser != null)
{ {
var result = await _identityUserManager.DeleteAsync(identityuser); // remove user roles for site
foreach (UserRole userrole in _userRoles.GetUserRoles(user.UserId, Int32.Parse(siteid)).ToList())
if (result != null)
{ {
_folders.DeleteUserFolder(id); _userRoles.DeleteUserRole(userrole.UserRoleId);
_users.DeleteUser(id); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Role Deleted {UserRole}", userrole);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Deleted {UserId}", id); }
// 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());
}
}
} }
} }
} }

View File

@ -90,15 +90,7 @@ namespace Oqtane.Repository
_db.Folder.Remove(folder); _db.Folder.Remove(folder);
_db.SaveChanges(); _db.SaveChanges();
} }
public void DeleteUserFolder(int userId)
{
string userFolderPath = Utilities.PathCombine("Users", userId.ToString(), System.IO.Path.DirectorySeparatorChar.ToString());
List<int> folderIdsToDelete = new List<int>(_db.Folder.Where(a => a.Path == userFolderPath).Select(a => a.FolderId));
foreach (int folderId in folderIdsToDelete)
{
DeleteFolder(folderId);
}
}
public string GetFolderPath(int folderId) public string GetFolderPath(int folderId)
{ {
Folder folder = _db.Folder.Find(folderId); Folder folder = _db.Folder.Find(folderId);

View File

@ -12,7 +12,6 @@ namespace Oqtane.Repository
Folder GetFolder(int folderId, bool tracking); Folder GetFolder(int folderId, bool tracking);
Folder GetFolder(int siteId, string path); Folder GetFolder(int siteId, string path);
void DeleteFolder(int folderId); void DeleteFolder(int folderId);
void DeleteUserFolder(int userId);
string GetFolderPath(int folderId); string GetFolderPath(int folderId);
string GetFolderPath(Folder folder); string GetFolderPath(Folder folder);
} }

View File

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Oqtane.Models; using Oqtane.Models;
@ -27,7 +27,7 @@ namespace Oqtane.Repository
return _db.UserRole.Where(item => item.UserId == userId) return _db.UserRole.Where(item => item.UserId == userId)
.Include(item => item.Role) // eager load roles .Include(item => item.Role) // eager load roles
.Include(item => item.User) // eager load users .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) public UserRole AddUserRole(UserRole userRole)