From 0a5950cfa2e1dacc0e3656782eaf06d2ff610c05 Mon Sep 17 00:00:00 2001 From: max Date: Mon, 7 Apr 2025 14:59:37 +0200 Subject: [PATCH] [CHANGE] Reworking Result monads --- DotBased.ASP.Auth/AuthDataCache.cs | 10 +-- DotBased.ASP.Auth/IAuthDataRepository.cs | 28 +++---- DotBased.ASP.Auth/ISessionStateProvider.cs | 4 +- DotBased.ASP.Auth/MemoryAuthDataRepository.cs | 48 +++++------ DotBased.ASP.Auth/SecurityService.cs | 48 +++++------ .../Repositories/AttributeRepository.cs | 28 +++---- .../Repositories/GroupRepository.cs | 34 ++++---- .../Repositories/RepositoryBase.cs | 10 +-- .../Repositories/RoleRepository.cs | 64 ++++++++------- .../Repositories/UserRepository.cs | 58 ++++++------- .../Managers/AuthorityGroupManager.cs | 2 +- .../Managers/AuthorityRoleManager.cs | 81 +++++++++++-------- .../Managers/AuthorityUserManager.cs | 20 ++--- .../Models/AuthorityResult.cs | 41 ---------- .../Models/AuthorityResultOldOld.cs | 41 ++++++++++ .../Models/QueryItems.cs | 21 +++++ .../Monads/ValidationResult.cs | 29 ++++++- .../Repositories/IAttributeRepository.cs | 10 +-- .../Repositories/IGroupRepository.cs | 12 +-- .../Repositories/IRoleRepository.cs | 10 ++- .../Repositories/IUserRepository.cs | 20 ++--- DotBased/Monads/Result.cs | 55 +++++++------ DotBased/{Result.cs => ResultOld.cs} | 32 ++++---- DotBased/Utilities/Cryptography.cs | 6 +- 24 files changed, 390 insertions(+), 322 deletions(-) delete mode 100755 DotBased.AspNet.Authority/Models/AuthorityResult.cs create mode 100755 DotBased.AspNet.Authority/Models/AuthorityResultOldOld.cs create mode 100644 DotBased.AspNet.Authority/Models/QueryItems.cs rename DotBased/{Result.cs => ResultOld.cs} (55%) diff --git a/DotBased.ASP.Auth/AuthDataCache.cs b/DotBased.ASP.Auth/AuthDataCache.cs index 76287e4..e8a1c18 100755 --- a/DotBased.ASP.Auth/AuthDataCache.cs +++ b/DotBased.ASP.Auth/AuthDataCache.cs @@ -15,26 +15,26 @@ public class AuthDataCache private readonly AuthStateCacheCollection _authenticationStateCollection = []; - public Result PurgeSessionState(string id) => _authenticationStateCollection.Remove(id) ? Result.Ok() : Result.Failed("Failed to purge session state from cache! Or the session was not cached..."); + public ResultOld PurgeSessionState(string id) => _authenticationStateCollection.Remove(id) ? ResultOld.Ok() : ResultOld.Failed("Failed to purge session state from cache! Or the session was not cached..."); public void CacheSessionState(AuthenticationStateModel stateModel, AuthenticationState? state = null) => _authenticationStateCollection[stateModel.Id] = new AuthStateCacheNode(stateModel, state); - public Result> RequestSessionState(string id) + public ResultOld> RequestSessionState(string id) { if (!_authenticationStateCollection.TryGetValue(id, out var node)) - return Result>.Failed("No cached object found!"); + return ResultOld>.Failed("No cached object found!"); string failedMsg; if (node.StateModel != null) { if (node.IsValidLifespan(_configuration.CachedAuthSessionLifespan)) - return Result>.Ok(new Tuple(node.StateModel, node.State)); + return ResultOld>.Ok(new Tuple(node.StateModel, node.State)); failedMsg = $"Session has invalid lifespan, removing entry: [{id}] from cache!"; } else failedMsg = $"Returned object is null, removing entry: [{id}] from cache!"; _authenticationStateCollection.Remove(id); - return Result>.Failed(failedMsg); + return ResultOld>.Failed(failedMsg); } } diff --git a/DotBased.ASP.Auth/IAuthDataRepository.cs b/DotBased.ASP.Auth/IAuthDataRepository.cs index f1ed79c..4435324 100755 --- a/DotBased.ASP.Auth/IAuthDataRepository.cs +++ b/DotBased.ASP.Auth/IAuthDataRepository.cs @@ -5,18 +5,18 @@ namespace DotBased.ASP.Auth; public interface IAuthDataRepository { - public Task CreateUserAsync(UserModel user); - public Task UpdateUserAsync(UserModel user); - public Task DeleteUserAsync(UserModel user); - public Task> GetUserAsync(string id, string email, string username); - public Task> GetUsersAsync(int start = 0, int amount = 30, string search = ""); - public Task CreateGroupAsync(GroupModel group); - public Task UpdateGroupAsync(GroupModel group); - public Task DeleteGroupAsync(GroupModel group); - public Task> GetGroupAsync(string id); - public Task> GetGroupsAsync(int start = 0, int amount = 30, string search = ""); - public Task CreateAuthenticationStateAsync(AuthenticationStateModel authenticationState); - public Task UpdateAuthenticationStateAsync(AuthenticationStateModel authenticationState); - public Task DeleteAuthenticationStateAsync(AuthenticationStateModel authenticationState); - public Task> GetAuthenticationStateAsync(string id); + public Task CreateUserAsync(UserModel user); + public Task UpdateUserAsync(UserModel user); + public Task DeleteUserAsync(UserModel user); + public Task> GetUserAsync(string id, string email, string username); + public Task> GetUsersAsync(int start = 0, int amount = 30, string search = ""); + public Task CreateGroupAsync(GroupModel group); + public Task UpdateGroupAsync(GroupModel group); + public Task DeleteGroupAsync(GroupModel group); + public Task> GetGroupAsync(string id); + public Task> GetGroupsAsync(int start = 0, int amount = 30, string search = ""); + public Task CreateAuthenticationStateAsync(AuthenticationStateModel authenticationState); + public Task UpdateAuthenticationStateAsync(AuthenticationStateModel authenticationState); + public Task DeleteAuthenticationStateAsync(AuthenticationStateModel authenticationState); + public Task> GetAuthenticationStateAsync(string id); } \ No newline at end of file diff --git a/DotBased.ASP.Auth/ISessionStateProvider.cs b/DotBased.ASP.Auth/ISessionStateProvider.cs index ee8850a..794429c 100755 --- a/DotBased.ASP.Auth/ISessionStateProvider.cs +++ b/DotBased.ASP.Auth/ISessionStateProvider.cs @@ -3,6 +3,6 @@ namespace DotBased.ASP.Auth; public interface ISessionStateProvider { public const string SessionStateName = "BasedServerSession"; - public Task> GetSessionStateAsync(); - public Task SetSessionStateAsync(string state); + public Task> GetSessionStateAsync(); + public Task SetSessionStateAsync(string state); } \ No newline at end of file diff --git a/DotBased.ASP.Auth/MemoryAuthDataRepository.cs b/DotBased.ASP.Auth/MemoryAuthDataRepository.cs index 708db7a..a2914a7 100755 --- a/DotBased.ASP.Auth/MemoryAuthDataRepository.cs +++ b/DotBased.ASP.Auth/MemoryAuthDataRepository.cs @@ -10,28 +10,28 @@ namespace DotBased.ASP.Auth; [SuppressMessage("ReSharper", "CollectionNeverUpdated.Local")] public class MemoryAuthDataRepository : IAuthDataRepository { - public async Task CreateUserAsync(UserModel user) + public async Task CreateUserAsync(UserModel user) { if (MemoryData.users.Any(x => x.Id == user.Id || x.Email == user.Email)) - return Result.Failed("User already exists."); + return ResultOld.Failed("User already exists."); MemoryData.users.Add(user); - return Result.Ok(); + return ResultOld.Ok(); } - public async Task UpdateUserAsync(UserModel user) + public async Task UpdateUserAsync(UserModel user) { if (MemoryData.users.All(x => x.Id != user.Id)) - return Result.Failed("User does not exist!"); + return ResultOld.Failed("User does not exist!"); - return Result.Ok(); + return ResultOld.Ok(); } - public Task DeleteUserAsync(UserModel user) + public Task DeleteUserAsync(UserModel user) { throw new NotImplementedException(); } - public async Task> GetUserAsync(string id, string email, string username) + public async Task> GetUserAsync(string id, string email, string username) { UserModel? userModel = null; if (!id.IsNullOrEmpty()) @@ -40,62 +40,62 @@ public class MemoryAuthDataRepository : IAuthDataRepository userModel = MemoryData.users.FirstOrDefault(u => u.Email.Equals(email, StringComparison.OrdinalIgnoreCase)); if (!username.IsNullOrEmpty()) userModel = MemoryData.users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.OrdinalIgnoreCase)); - return userModel != null ? Result.Ok(userModel) : Result.Failed("No user found!"); + return userModel != null ? ResultOld.Ok(userModel) : ResultOld.Failed("No user found!"); } - public Task> GetUsersAsync(int start = 0, int amount = 30, string search = "") + public Task> GetUsersAsync(int start = 0, int amount = 30, string search = "") { throw new NotImplementedException(); } - public Task CreateGroupAsync(GroupModel group) + public Task CreateGroupAsync(GroupModel group) { throw new NotImplementedException(); } - public Task UpdateGroupAsync(GroupModel group) + public Task UpdateGroupAsync(GroupModel group) { throw new NotImplementedException(); } - public Task DeleteGroupAsync(GroupModel group) + public Task DeleteGroupAsync(GroupModel group) { throw new NotImplementedException(); } - public Task> GetGroupAsync(string id) + public Task> GetGroupAsync(string id) { throw new NotImplementedException(); } - public Task> GetGroupsAsync(int start = 0, int amount = 30, string search = "") + public Task> GetGroupsAsync(int start = 0, int amount = 30, string search = "") { throw new NotImplementedException(); } - public async Task CreateAuthenticationStateAsync(AuthenticationStateModel authenticationState) + public async Task CreateAuthenticationStateAsync(AuthenticationStateModel authenticationState) { - if (MemoryData.AuthenticationStates.Contains(authenticationState)) return Result.Failed("Item already exists!"); + if (MemoryData.AuthenticationStates.Contains(authenticationState)) return ResultOld.Failed("Item already exists!"); MemoryData.AuthenticationStates.Add(authenticationState); - return Result.Ok(); + return ResultOld.Ok(); } - public Task UpdateAuthenticationStateAsync(AuthenticationStateModel authenticationState) + public Task UpdateAuthenticationStateAsync(AuthenticationStateModel authenticationState) { throw new NotImplementedException(); } - public async Task DeleteAuthenticationStateAsync(AuthenticationStateModel authenticationState) + public async Task DeleteAuthenticationStateAsync(AuthenticationStateModel authenticationState) { MemoryData.AuthenticationStates.Remove(authenticationState); - return Result.Ok(); + return ResultOld.Ok(); } - public async Task> GetAuthenticationStateAsync(string id) + public async Task> GetAuthenticationStateAsync(string id) { var item = MemoryData.AuthenticationStates.FirstOrDefault(x => x.Id == id); - if (item == null) return Result.Failed("Could not get the session state!"); - return Result.Ok(item); + if (item == null) return ResultOld.Failed("Could not get the session state!"); + return ResultOld.Ok(item); } } diff --git a/DotBased.ASP.Auth/SecurityService.cs b/DotBased.ASP.Auth/SecurityService.cs index 748e0a7..48e1c80 100755 --- a/DotBased.ASP.Auth/SecurityService.cs +++ b/DotBased.ASP.Auth/SecurityService.cs @@ -24,10 +24,10 @@ public class SecurityService private readonly ProtectedLocalStorage _localStorage; private readonly ILogger _logger; - public async Task> GetAuthenticationStateFromSessionAsync(string id) + public async Task> GetAuthenticationStateFromSessionAsync(string id) { if (id.IsNullOrEmpty()) - return Result.Failed("No valid id!"); + return ResultOld.Failed("No valid id!"); AuthenticationStateModel? authStateModel = null; var stateCache = _dataCache.RequestSessionState(id); if (!stateCache.Success || stateCache.Value == null) @@ -42,16 +42,16 @@ public class SecurityService else { if (stateCache.Value.Item2 != null) - return Result.Ok(stateCache.Value.Item2); + return ResultOld.Ok(stateCache.Value.Item2); authStateModel = stateCache.Value.Item1; } if (authStateModel == null) - return Result.Failed("Failed to get auth state!"); + return ResultOld.Failed("Failed to get auth state!"); var userResult = await _authDataRepository.GetUserAsync(authStateModel.UserId, string.Empty, string.Empty); if (userResult is not { Success: true, Value: not null }) - return Result.Failed("Failed to get user from state!"); + return ResultOld.Failed("Failed to get user from state!"); var claims = new List() { new(ClaimTypes.Sid, userResult.Value.Id), @@ -66,56 +66,56 @@ public class SecurityService var claimsIdentity = new ClaimsIdentity(claims, BasedAuthDefaults.AuthenticationScheme); var authState = new AuthenticationState(new ClaimsPrincipal(claimsIdentity)); _dataCache.CacheSessionState(authStateModel, authState); - return Result.Ok(authState); + return ResultOld.Ok(authState); } - public async Task> LoginAsync(LoginModel login) + public async Task> LoginAsync(LoginModel login) { try { UserModel? user = null; - Result usrResult; + ResultOld usrResultOld; if (!login.UserName.IsNullOrEmpty()) { - usrResult = await _authDataRepository.GetUserAsync(string.Empty, string.Empty, login.UserName); - if (usrResult is { Success: true, Value: not null }) - user = usrResult.Value; + usrResultOld = await _authDataRepository.GetUserAsync(string.Empty, string.Empty, login.UserName); + if (usrResultOld is { Success: true, Value: not null }) + user = usrResultOld.Value; } else if (!login.Email.IsNullOrEmpty()) { - usrResult = await _authDataRepository.GetUserAsync(string.Empty, login.Email, string.Empty); - if (usrResult is { Success: true, Value: not null }) - user = usrResult.Value; + usrResultOld = await _authDataRepository.GetUserAsync(string.Empty, login.Email, string.Empty); + if (usrResultOld is { Success: true, Value: not null }) + user = usrResultOld.Value; } else - return Result.Failed("Username & Email is empty, cannot login!"); + return ResultOld.Failed("Username & Email is empty, cannot login!"); - if (user == null || !usrResult.Success) - return Result.Failed("No user found!"); + if (user == null || !usrResultOld.Success) + return ResultOld.Failed("No user found!"); if (user.PasswordHash != login.Password) //TODO: Hash password and compare - return Result.Failed("Login failed, invalid password."); + return ResultOld.Failed("Login failed, invalid password."); var state = new AuthenticationStateModel(user); var authResult = await _authDataRepository.CreateAuthenticationStateAsync(state); if (!authResult.Success) - return Result.Failed("Failed to store session to database!"); + return ResultOld.Failed("Failed to store session to database!"); _dataCache.CacheSessionState(state); await _localStorage.SetAsync(BasedAuthDefaults.StorageKey, state.Id); - return Result.Ok(state); + return ResultOld.Ok(state); } catch (Exception e) { _logger.Error(e, "Failed to login!"); - return Result.Failed("Login failed, exception thrown!"); + return ResultOld.Failed("Login failed, exception thrown!"); } } - public async Task LogoutAsync(string state) + public async Task LogoutAsync(string state) { try { if (state.IsNullOrEmpty()) - return Result.Failed($"Argument {nameof(state)} is empty!"); + return ResultOld.Failed($"Argument {nameof(state)} is empty!"); var stateResult = await _authDataRepository.GetAuthenticationStateAsync(state); if (!stateResult.Success || stateResult.Value == null) @@ -131,7 +131,7 @@ public class SecurityService catch (Exception e) { _logger.Error(e, "Failed to logout!"); - return Result.Failed("Failed to logout, exception thrown!"); + return ResultOld.Failed("Failed to logout, exception thrown!"); } } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/AttributeRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/AttributeRepository.cs index 959d10f..dd25a1f 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/AttributeRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/AttributeRepository.cs @@ -6,7 +6,7 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public class AttributeRepository(IDbContextFactory contextFactory) : RepositoryBase, IAttributeRepository { - public async Task> GetAttributesAsync(int limit = 20, int offset = 0, string search = "", + public async Task> GetAttributesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { try @@ -25,7 +25,7 @@ public class AttributeRepository(IDbContextFactory contextFact AttributeKey = a.AttributeKey, AttributeValue = a.AttributeValue }).ToListAsync(cancellationToken); - return ListResult.Ok(select, total, limit, offset); + return ListResultOld.Ok(select, total, limit, offset); } catch (Exception e) { @@ -33,13 +33,13 @@ public class AttributeRepository(IDbContextFactory contextFact } } - public async Task> GetAttributeByKeyAsync(string key, CancellationToken cancellationToken = default) + public async Task> GetAttributeByKeyAsync(string key, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var attribute = await context.Attributes.FirstOrDefaultAsync(a => a.AttributeKey == key, cancellationToken); - return attribute == null ? Result.Failed("Attribute not found") : Result.Ok(attribute); + return attribute == null ? ResultOld.Failed("Attribute not found") : ResultOld.Ok(attribute); } catch (Exception e) { @@ -47,18 +47,18 @@ public class AttributeRepository(IDbContextFactory contextFact } } - public async Task> CreateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) + public async Task> CreateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (string.IsNullOrWhiteSpace(attribute.AttributeKey) || attribute.ForeignKey == Guid.Empty) { - return Result.Failed("Attribute key and/or bound id is empty"); + return ResultOld.Failed("Attribute key and/or bound id is empty"); } var entry = context.Attributes.Add(attribute); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to create attribute") : Result.Ok(entry.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to create attribute") : ResultOld.Ok(entry.Entity); } catch (Exception e) { @@ -66,7 +66,7 @@ public class AttributeRepository(IDbContextFactory contextFact } } - public async Task> UpdateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) + public async Task> UpdateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) { try { @@ -74,17 +74,17 @@ public class AttributeRepository(IDbContextFactory contextFact var currentAttribute = await context.Attributes.FirstOrDefaultAsync(a => a.AttributeKey == attribute.AttributeKey, cancellationToken); if (currentAttribute == null) { - return Result.Failed("Attribute not found"); + return ResultOld.Failed("Attribute not found"); } if (currentAttribute.Version != attribute.Version) { - return Result.Failed("Attribute version doesn't match"); + return ResultOld.Failed("Attribute version doesn't match"); } var entry = context.Attributes.Update(currentAttribute); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to update attribute") : Result.Ok(entry.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to update attribute") : ResultOld.Ok(entry.Entity); } catch (Exception e) { @@ -92,7 +92,7 @@ public class AttributeRepository(IDbContextFactory contextFact } } - public async Task DeleteAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) + public async Task DeleteAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default) { try { @@ -100,11 +100,11 @@ public class AttributeRepository(IDbContextFactory contextFact var currentAttribute = await context.Attributes.FirstOrDefaultAsync(a => a.AttributeKey == attribute.AttributeKey, cancellationToken); if (currentAttribute == null) { - return Result.Failed("Attribute not found"); + return ResultOld.Failed("Attribute not found"); } context.Attributes.Remove(currentAttribute); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to delete attribute") : Result.Ok(); + return saveResult <= 0 ? ResultOld.Failed("Failed to delete attribute") : ResultOld.Ok(); } catch (Exception e) { diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/GroupRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/GroupRepository.cs index 3dce771..74e3a0c 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/GroupRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/GroupRepository.cs @@ -6,7 +6,7 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public class GroupRepository(IDbContextFactory contextFactory) : RepositoryBase, IGroupRepository { - public async Task> GetGroupsAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) + public async Task> GetGroupsAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { try { @@ -22,7 +22,7 @@ public class GroupRepository(IDbContextFactory contextFactory) Id = g.Id, Name = g.Name }).ToListAsync(cancellationToken); - return ListResult.Ok(select, total, limit, offset); + return ListResultOld.Ok(select, total, limit, offset); } catch (Exception e) { @@ -30,17 +30,17 @@ public class GroupRepository(IDbContextFactory contextFactory) } } - public async Task> GetGroupByIdAsync(string id, CancellationToken cancellationToken = default) + public async Task> GetGroupByIdAsync(string id, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (!Guid.TryParse(id, out var groupId)) { - return Result.Failed("Invalid group id"); + return ResultOld.Failed("Invalid group id"); } var group = await context.Groups.Where(g => g.Id == groupId).Include(g => g.Attributes).FirstOrDefaultAsync(cancellationToken: cancellationToken); - return Result.HandleResult(group, "Group not found"); + return ResultOld.HandleResult(group, "Group not found"); } catch (Exception e) { @@ -48,14 +48,14 @@ public class GroupRepository(IDbContextFactory contextFactory) } } - public async Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var userJoinGroups = context.UserGroups.Where(ug => ug.UserId == user.Id).Select(ug => ug.GroupId); var userGroups = context.Groups.Where(g => userJoinGroups.Contains(g.Id)); - return ListResult.Ok(userGroups, userGroups.Count()); + return ListResultOld.Ok(userGroups, userGroups.Count()); } catch (Exception e) { @@ -63,18 +63,18 @@ public class GroupRepository(IDbContextFactory contextFactory) } } - public async Task> CreateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) + public async Task> CreateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (group.Id == Guid.Empty) { - return Result.Failed("Id cannot be empty."); + return ResultOld.Failed("Id cannot be empty."); } var entry = context.Groups.Add(group); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to create group.") : Result.Ok(entry.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to create group.") : ResultOld.Ok(entry.Entity); } catch (Exception e) { @@ -82,7 +82,7 @@ public class GroupRepository(IDbContextFactory contextFactory) } } - public async Task> UpdateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) + public async Task> UpdateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) { try { @@ -90,17 +90,17 @@ public class GroupRepository(IDbContextFactory contextFactory) var currentGroup = await context.Groups.FirstOrDefaultAsync(g => g.Id == group.Id ,cancellationToken); if (currentGroup == null) { - return Result.Failed("Group not found."); + return ResultOld.Failed("Group not found."); } if (currentGroup.Version != group.Version) { - return Result.Failed("Group version does not match, version validation failed!"); + return ResultOld.Failed("Group version does not match, version validation failed!"); } var entry = context.Groups.Update(group); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to update group.") : Result.Ok(entry.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to update group.") : ResultOld.Ok(entry.Entity); } catch (Exception e) { @@ -108,7 +108,7 @@ public class GroupRepository(IDbContextFactory contextFactory) } } - public async Task DeleteGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) + public async Task DeleteGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default) { try { @@ -116,11 +116,11 @@ public class GroupRepository(IDbContextFactory contextFactory) var currentGroup = await context.Groups.FirstOrDefaultAsync(g => g.Id == group.Id, cancellationToken); if (currentGroup == null) { - return Result.Failed("Group not found, cannot delete group!"); + return ResultOld.Failed("Group not found, cannot delete group!"); } context.Groups.Remove(currentGroup); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to delete group.") : Result.Ok(); + return saveResult <= 0 ? ResultOld.Failed("Failed to delete group.") : ResultOld.Ok(); } catch (Exception e) { diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/RepositoryBase.cs b/DotBased.AspNet.Authority.EFCore/Repositories/RepositoryBase.cs index 1be6d12..89fbf20 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/RepositoryBase.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/RepositoryBase.cs @@ -2,18 +2,18 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public abstract class RepositoryBase { - protected Result HandleExceptionResult(string message, Exception ex) => new(HandleException(message, ex)); + protected ResultOld HandleExceptionResult(string message, Exception ex) => new(HandleException(message, ex)); - protected ListResult HandleExceptionListResult(string message, Exception ex) => + protected ListResultOld HandleExceptionListResult(string message, Exception ex) => new(HandleException(message, ex)); - protected Result HandleException(string message, Exception ex) + protected ResultOld HandleException(string message, Exception ex) { if (ex is OperationCanceledException oce) { - return Result.Failed("Operation cancelled.", oce); + return ResultOld.Failed("Operation cancelled.", oce); } - return Result.Failed(message, ex); + return ResultOld.Failed(message, ex); } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/RoleRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/RoleRepository.cs index e6f4d92..4d2a459 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/RoleRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/RoleRepository.cs @@ -1,6 +1,8 @@ using DotBased.AspNet.Authority.EFCore.Models; +using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Repositories; +using DotBased.Monads; using Microsoft.EntityFrameworkCore; namespace DotBased.AspNet.Authority.EFCore.Repositories; @@ -8,7 +10,7 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public class RoleRepository(IDbContextFactory contextFactory) : RepositoryBase, IRoleRepository { - public async Task> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) + public async Task>> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { try { @@ -26,29 +28,29 @@ public class RoleRepository(IDbContextFactory contextFactory) Id = r.Id, Name = r.Name }).ToListAsync(cancellationToken: cancellationToken); - return ListResult.Ok(select, total, limit, offset); + return QueryItems.Create(select, total, limit, offset); } catch (Exception e) { - return HandleExceptionListResult("Failed to get roles.", e); + return e; } } - public async Task> GetRoleByIdAsync(string id, CancellationToken cancellationToken = default) + public async Task> GetRoleByIdAsync(Guid id, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); - if (!Guid.TryParse(id, out var guid)) + var role = await context.Roles.Where(r => r.Id == id).Include(r => r.Attributes).FirstOrDefaultAsync(cancellationToken: cancellationToken); + if (role != null) { - return Result.Failed("Invalid id!"); + return role; } - var role = await context.Roles.Where(r => r.Id == guid).Include(r => r.Attributes).FirstOrDefaultAsync(cancellationToken: cancellationToken); - return Result.HandleResult(role, "Role not found!"); + return ResultError.Fail("Role not found!"); } catch (Exception e) { - return HandleExceptionResult("Failed to get role!", e); + return e; } } @@ -59,15 +61,15 @@ public class RoleRepository(IDbContextFactory contextFactory) await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (role.Id == Guid.Empty) { - return Result.Failed("Id cannot be empty!"); + return ResultError.Fail("Id cannot be empty!"); } var entity = context.Roles.Add(role); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to create role!") : Result.Ok(entity.Entity); + return saveResult <= 0 ? ResultError.Fail("Failed to create role!") : entity.Entity; } catch (Exception e) { - return HandleExceptionResult("Failed to create role!", e); + return e; } } @@ -79,21 +81,21 @@ public class RoleRepository(IDbContextFactory contextFactory) var currentRole = await context.Roles.FirstOrDefaultAsync(r => r.Id == role.Id, cancellationToken: cancellationToken); if (currentRole == null) { - return Result.Failed("Role not found!"); + return ResultError.Fail("Role not found!"); } if (role.Version != currentRole.Version) { - return Result.Failed("Role version does not match, version validation failed!"); + return ResultError.Fail("Role version does not match, version validation failed!"); } var entity = context.Roles.Update(role); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to update role!") : Result.Ok(entity.Entity); + return saveResult <= 0 ? ResultError.Fail("Failed to update role!") : entity.Entity; } catch (Exception e) { - return HandleExceptionResult("Failed to update role!", e); + return e; } } @@ -107,16 +109,16 @@ public class RoleRepository(IDbContextFactory contextFactory) context.Roles.RemoveRange(roles); context.RoleLinks.RemoveRange(context.RoleLinks.Where(rg => roleIds.Contains(rg.RoleId))); - var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to delete roles!") : Result.Ok(); + var removeResult = await context.SaveChangesAsync(cancellationToken); + return removeResult == roles.Count? Result.Success() : ResultError.Fail($"Not all roles have been removed! {removeResult} of {roles.Count} roles removed!"); } catch (Exception e) { - return HandleException("Failed to delete role!", e); + return e; } } - public async Task> GetUserRolesAsync(AuthorityUser user, int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) + public async Task> GetUserRolesAsync(AuthorityUser user, int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { try { @@ -133,7 +135,7 @@ public class RoleRepository(IDbContextFactory contextFactory) Id = r.Id, Name = r.Name }); - return ListResult.Ok(roles, limit, offset); + return ListResultOld.Ok(roles, limit, offset); } catch (Exception e) { @@ -151,26 +153,26 @@ public class RoleRepository(IDbContextFactory contextFactory) context.RoleLinks.Add(new RoleLink() { LinkId = linkId, RoleId = role.Id }); } var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to ad role link!") : Result.Ok(); + return saveResult == roles.Count ? Result.Success() : ResultError.Fail($"Not all roles have been linked! {saveResult} of {roles.Count} roles linked!"); } catch (Exception e) { - return HandleException("Failed to add role link!", e); + return e; } } - public async Task> GetLinkedRolesAsync(List linkIds, CancellationToken cancellationToken = default) + public async Task>> GetLinkedRolesAsync(List linkIds, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var linkedRoles = context.RoleLinks.Where(r => linkIds.Contains(r.LinkId)).Select(r => r.RoleId); var roleList = await context.Roles.Where(r => linkedRoles.Contains(r.Id)).ToListAsync(cancellationToken); - return ListResult.Ok(roleList.DistinctBy(r => r.Id)); + return roleList.DistinctBy(r => r.Id).ToList(); } catch (Exception e) { - return HandleExceptionListResult("Failed to get linked roles!", e); + return e; } } @@ -182,25 +184,25 @@ public class RoleRepository(IDbContextFactory contextFactory) var roleIds = roles.Select(r => r.Id).ToList(); context.RoleLinks.RemoveRange(context.RoleLinks.Where(rg => rg.LinkId == linkId && roleIds.Contains(rg.RoleId))); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to delete role links!") : Result.Ok(); + return saveResult == roles.Count ? Result.Success() : ResultError.Fail($"Not all roles have been unlinked! {saveResult} of {roles.Count} roles unlinked!"); } catch (Exception e) { - return HandleException("Failed to delete role link!", e); + return e; } } - public async Task> HasRolesAsync(Guid linkId, List roles, CancellationToken cancellationToken = default) + public async Task>> HasRolesAsync(Guid linkId, List roles, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var hasRoles = await context.RoleLinks.Where(r => r.LinkId == linkId && roles.Any(ar => ar.Id == r.RoleId)).Select(r => r.RoleId).ToListAsync(cancellationToken); - return ListResult.Ok(hasRoles); + return hasRoles; } catch (Exception e) { - return HandleExceptionListResult("Failed to determine role for user!", e); + return e; } } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs index efcc004..aefcd2b 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs @@ -6,7 +6,7 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public class UserRepository(IDbContextFactory contextFactory) : RepositoryBase, IUserRepository { - public async Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) + public async Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { try { @@ -26,7 +26,7 @@ public class UserRepository(IDbContextFactory contextFactory) EmailAddress = u.EmailAddress, PhoneNumber = u.PhoneNumber }).ToListAsync(cancellationToken: cancellationToken); - return ListResult.Ok(selected, totalCount, limit, offset); + return ListResultOld.Ok(selected, totalCount, limit, offset); } catch (Exception e) { @@ -34,18 +34,18 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default) + public async Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (!Guid.TryParse(id, out var guid)) { - return Result.Failed("Invalid id!"); + return ResultOld.Failed("Invalid id!"); } var user = await context.Users.Where(u => u.Id == guid).Include(u => u.Attributes).FirstOrDefaultAsync(cancellationToken: cancellationToken); - return Result.HandleResult(user, "User not found."); + return ResultOld.HandleResult(user, "User not found."); } catch (Exception e) { @@ -53,18 +53,18 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); if (user.Id == Guid.Empty) { - return Result.Failed("Id cannot be empty!"); + return ResultOld.Failed("Id cannot be empty!"); } var entity = context.Users.Add(user); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to create user!") : Result.Ok(entity.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to create user!") : ResultOld.Ok(entity.Entity); } catch (Exception e) { @@ -72,7 +72,7 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { @@ -80,17 +80,17 @@ public class UserRepository(IDbContextFactory contextFactory) var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken: cancellationToken); if (usr == null) { - return Result.Failed("User not found!"); + return ResultOld.Failed("User not found!"); } if (usr.Version != user.Version || usr.SecurityVersion != user.SecurityVersion) { - return Result.Failed("Version validation failed!"); + return ResultOld.Failed("Version validation failed!"); } var entity = context.Users.Update(user); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to save updated user!") : Result.Ok(entity.Entity); + return saveResult <= 0 ? ResultOld.Failed("Failed to save updated user!") : ResultOld.Ok(entity.Entity); } catch (Exception e) { @@ -98,7 +98,7 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { @@ -106,11 +106,11 @@ public class UserRepository(IDbContextFactory contextFactory) var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken: cancellationToken); if (usr == null) { - return Result.Failed("User not found!"); + return ResultOld.Failed("User not found!"); } context.Users.Remove(usr); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to delete user!") : Result.Ok(); + return saveResult <= 0 ? ResultOld.Failed("Failed to delete user!") : ResultOld.Ok(); } catch (Exception e) { @@ -118,13 +118,13 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) + public async Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var usr = await context.Users.Where(u => u.EmailAddress == email).Include(u => u.Attributes).FirstOrDefaultAsync(cancellationToken: cancellationToken); - return Result.HandleResult(usr, "User not found by given email address."); + return ResultOld.HandleResult(usr, "User not found by given email address."); } catch (Exception e) { @@ -132,7 +132,7 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) + public async Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) { try { @@ -140,18 +140,18 @@ public class UserRepository(IDbContextFactory contextFactory) var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken); if (usr == null) { - return Result.Failed("Failed to find user with given id!"); + return ResultOld.Failed("Failed to find user with given id!"); } if (usr.Version != user.Version) { - return Result.Failed("Stored user version doesn't match current user version!"); + return ResultOld.Failed("Stored user version doesn't match current user version!"); } usr.Version = version; context.Users.Update(usr); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to update user!") : Result.Ok(); + return saveResult <= 0 ? ResultOld.Failed("Failed to update user!") : ResultOld.Ok(); } catch (Exception e) { @@ -159,13 +159,13 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var usrVersion = await context.Users.Where(u => u.Id == user.Id).Select(u => u.Version).FirstOrDefaultAsync(cancellationToken); - return Result.HandleResult(usrVersion, "Failed to get user version!"); + return ResultOld.HandleResult(usrVersion, "Failed to get user version!"); } catch (Exception e) { @@ -173,7 +173,7 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default) + public async Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default) { try { @@ -181,18 +181,18 @@ public class UserRepository(IDbContextFactory contextFactory) var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken); if (usr == null) { - return Result.Failed("Failed to find user with given id!"); + return ResultOld.Failed("Failed to find user with given id!"); } if (usr.SecurityVersion != user.SecurityVersion) { - return Result.Failed("Stored user version doesn't match current user version!"); + return ResultOld.Failed("Stored user version doesn't match current user version!"); } usr.SecurityVersion = securityVersion; context.Users.Update(usr); var saveResult = await context.SaveChangesAsync(cancellationToken); - return saveResult <= 0 ? Result.Failed("Failed to update user!") : Result.Ok(); + return saveResult <= 0 ? ResultOld.Failed("Failed to update user!") : ResultOld.Ok(); } catch (Exception e) { @@ -200,13 +200,13 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public async Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var usrVersion = await context.Users.Where(u => u.Id == user.Id).Select(u => u.SecurityVersion).FirstOrDefaultAsync(cancellationToken); - return Result.HandleResult(usrVersion, "Failed to get user security version!"); + return ResultOld.HandleResult(usrVersion, "Failed to get user security version!"); } catch (Exception e) { diff --git a/DotBased.AspNet.Authority/Managers/AuthorityGroupManager.cs b/DotBased.AspNet.Authority/Managers/AuthorityGroupManager.cs index 0dc7bf4..aafc5c9 100755 --- a/DotBased.AspNet.Authority/Managers/AuthorityGroupManager.cs +++ b/DotBased.AspNet.Authority/Managers/AuthorityGroupManager.cs @@ -4,7 +4,7 @@ namespace DotBased.AspNet.Authority.Managers; public partial class AuthorityManager { - public async Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default) { return await GroupRepository.GetUserGroupsAsync(user, cancellationToken); } diff --git a/DotBased.AspNet.Authority/Managers/AuthorityRoleManager.cs b/DotBased.AspNet.Authority/Managers/AuthorityRoleManager.cs index 60332c2..beda419 100755 --- a/DotBased.AspNet.Authority/Managers/AuthorityRoleManager.cs +++ b/DotBased.AspNet.Authority/Managers/AuthorityRoleManager.cs @@ -1,15 +1,16 @@ using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models.Authority; +using DotBased.Monads; namespace DotBased.AspNet.Authority.Managers; public partial class AuthorityManager { - public async Task> CreateRoleAsync(AuthorityRole role, CancellationToken cancellationToken = default) + public async Task> CreateRoleAsync(AuthorityRole role, CancellationToken cancellationToken = default) { role.Version = GenerateVersion(); var createResult = await RoleRepository.CreateRoleAsync(role, cancellationToken); - return AuthorityResult.FromResult(createResult); + return createResult; } public async Task DeleteRolesAsync(List roles, CancellationToken cancellationToken = default) @@ -24,7 +25,7 @@ public partial class AuthorityManager return result; } - public async Task> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) + public async Task>> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { var searchResult = await RoleRepository.GetRolesAsync(limit, offset, search, cancellationToken); return searchResult; @@ -40,22 +41,22 @@ public partial class AuthorityManager } var checkResult = await RoleRepository.HasRolesAsync(user.Id, roles, cancellationToken); - if (!checkResult.Success) - { - return; - } + var hasRolesList = checkResult.Match>(success: v => v, (_) => []); var rolesToAdd = roles; - if (checkResult.Count != 0) + if (hasRolesList.Count != 0) { - rolesToAdd = roles.Where(r => !checkResult.Items.Contains(r.Id)).ToList(); + rolesToAdd = roles.Where(r => !hasRolesList.Contains(r.Id)).ToList(); } var addResult = await RoleRepository.AddRolesLinkAsync(rolesToAdd, user.Id, cancellationToken); - if (!addResult.Success) + addResult.Match(() => { - _logger.Error(addResult.Exception ?? new Exception("Adding role to user failed!, No further information available!"),"Failed to add role to user!"); - } + _logger.Debug("Role links successfully added!"); + }, e => + { + _logger.Error(e.Exception ?? new Exception("Match failed!"), e.Description); + }); } public async Task RemoveRolesFromUserAsync(List roles, AuthorityUser user, CancellationToken cancellationToken = default) @@ -68,43 +69,43 @@ public partial class AuthorityManager } var checkResult = await RoleRepository.HasRolesAsync(user.Id, roles, cancellationToken); - if (!checkResult.Success) - { - return; - } + var hasRolesList = checkResult.Match>(success: v => v, (_) => []); var rolesToRemove = roles; - if (checkResult.Count != 0) + if (hasRolesList.Count != 0) { - rolesToRemove = roles.Where(r => !checkResult.Items.Contains(r.Id)).ToList(); + rolesToRemove = roles.Where(r => !hasRolesList.Contains(r.Id)).ToList(); } var removeResult = await RoleRepository.DeleteRolesLinkAsync(rolesToRemove, user.Id, cancellationToken); - if (!removeResult.Success) + removeResult.Match(() => { - _logger.Error(removeResult.Exception ?? new Exception("Removing roles from user failed!"), "Failed to remove roles from user!"); - } + _logger.Debug("Removed roles from user!"); + }, e => + { + _logger.Error(e.Exception ?? new Exception("Removing roles from user failed!"), e.Description); + }); } public async Task AddRolesToGroupAsync(List roles, AuthorityGroup group, CancellationToken cancellationToken = default) { var checkResult = await RoleRepository.HasRolesAsync(group.Id, roles, cancellationToken); - if (!checkResult.Success) - { - return; - } + var hasRolesList = checkResult.Match>(success: v => v, (_) => []); var rolesToAdd = roles; - if (checkResult.Count != 0) + if (hasRolesList.Count != 0) { - rolesToAdd = roles.Where(r => !checkResult.Items.Contains(r.Id)).ToList(); + rolesToAdd = roles.Where(r => !hasRolesList.Contains(r.Id)).ToList(); } var addResult = await RoleRepository.AddRolesLinkAsync(rolesToAdd, group.Id, cancellationToken); - if (!addResult.Success) + addResult.Match(() => { - _logger.Error(addResult.Exception ?? new Exception("Adding roles to group failed!"), "Failed to add roles to group!"); - } + _logger.Debug("Added roles to group."); + }, e => + { + _logger.Error(e.Exception ?? new Exception("Adding roles to group failed!"), e.Description); + }); } /// @@ -112,12 +113,12 @@ public partial class AuthorityManager /// /// The user to get the roles from /// - public async Task> GetUserRolesAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task>> GetUserRolesAsync(AuthorityUser user, CancellationToken cancellationToken = default) { var usrValidation = await IsValidUserAsync(user, cancellationToken); if (!usrValidation.Success) { - return ListResult.Failed("Invalid user"); + return ResultError.Fail("Invalid user"); } var searchIds = new List { user.Id }; @@ -128,11 +129,21 @@ public partial class AuthorityManager searchIds.AddRange(usrGroups.Items.Select(g => g.Id).ToList()); } - return await RoleRepository.GetLinkedRolesAsync(searchIds, cancellationToken); + var linkedRolesResult = await RoleRepository.GetLinkedRolesAsync(searchIds, cancellationToken); + return linkedRolesResult.Match>(roles => roles, e => + { + _logger.Error(e.Exception ?? new Exception("Failed to get user roles!"), e.Description); + return []; + }); } - public async Task> GetGroupRolesAsync(List groupIds, CancellationToken cancellationToken = default) + public async Task>> GetGroupRolesAsync(List groupIds, CancellationToken cancellationToken = default) { - return await RoleRepository.GetLinkedRolesAsync(groupIds, cancellationToken); + var linkedRolesResult = await RoleRepository.GetLinkedRolesAsync(groupIds, cancellationToken); + return linkedRolesResult.Match>(roles => roles, e => + { + _logger.Error(e.Exception ?? new Exception("Failed to get group roles!"), e.Description); + return []; + }); } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs index 88462fa..940c100 100755 --- a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs +++ b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs @@ -34,28 +34,28 @@ public partial class AuthorityManager return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); } - public async Task> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default) + public async Task> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default) { var result = await UserRepository.GetAuthorityUsersAsync(maxResults, offset, query, cancellationToken); return result; } - public async Task> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default) + public async Task> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default) { var passwordValidation = await ValidatePasswordAsync(user, password); if (!passwordValidation.Success) { - return AuthorityResult.Failed(passwordValidation.Errors, ResultFailReason.Validation); + return AuthorityResultOldOld.Failed(passwordValidation.Errors, ResultFailReason.Validation); } user.PasswordHash = await PasswordHasher.HashPasswordAsync(password); user.SecurityVersion = GenerateVersion(); var updateResult = await UserRepository.UpdateUserAsync(user, cancellationToken); - return AuthorityResult.FromResult(updateResult); + return AuthorityResultOldOld.FromResult(updateResult); } - public async Task> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken cancellationToken = default) + public async Task> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken cancellationToken = default) { var userValidation = await ValidateUserAsync(userModel); var passwordValidation = await ValidatePasswordAsync(userModel, password); @@ -64,7 +64,7 @@ public partial class AuthorityManager List errors = []; errors.AddRange(userValidation.Errors); errors.AddRange(passwordValidation.Errors); - return AuthorityResult.Failed(errors, ResultFailReason.Validation); + return AuthorityResultOldOld.Failed(errors, ResultFailReason.Validation); } userModel.Version = GenerateVersion(); @@ -74,22 +74,22 @@ public partial class AuthorityManager var userCreationResult = await UserRepository.CreateUserAsync(userModel, cancellationToken); - return AuthorityResult.FromResult(userCreationResult); + return AuthorityResultOldOld.FromResult(userCreationResult); } - public async Task> UpdateUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) + public async Task> UpdateUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var updateResult = await UserRepository.UpdateUserAsync(model, cancellationToken); return updateResult; } - public async Task DeleteUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) + public async Task DeleteUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var deleteResult = await UserRepository.DeleteUserAsync(model, cancellationToken); return deleteResult; } - public async Task IsValidUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task IsValidUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) { var usrResult = await UserRepository.GetVersionAsync(user, cancellationToken); return usrResult; diff --git a/DotBased.AspNet.Authority/Models/AuthorityResult.cs b/DotBased.AspNet.Authority/Models/AuthorityResult.cs deleted file mode 100755 index 108c6b1..0000000 --- a/DotBased.AspNet.Authority/Models/AuthorityResult.cs +++ /dev/null @@ -1,41 +0,0 @@ -using DotBased.AspNet.Authority.Models.Validation; - -namespace DotBased.AspNet.Authority.Models; - -public class AuthorityResult : Result -{ - public static AuthorityResult FromResult(Result result) => new AuthorityResult(result); - - public AuthorityResult(Result result) : base(result) - { - Reason = ResultFailReason.Unknown; - } - - public AuthorityResult(bool success, string errorMessage = "", TResultValue? value = default, ResultFailReason reason = ResultFailReason.None, IReadOnlyList? errors = null) : base(success, errorMessage, value, null) - { - Success = success; - Message = errorMessage; - Value = value; - Reason = reason; - ValidationErrors = errors; - } - public ResultFailReason Reason { get; } - public IReadOnlyList? ValidationErrors { get; } - - - public new static AuthorityResult Ok(TResultValue? value) => new AuthorityResult(true, value:value); - - public static AuthorityResult Error(string errorMessage, ResultFailReason reason = ResultFailReason.Error) => - new AuthorityResult(false, errorMessage, reason:reason); - - public static AuthorityResult Failed(IReadOnlyList errors, ResultFailReason reason = ResultFailReason.None) - => new AuthorityResult(false, errors:errors, reason:reason); -} - -public enum ResultFailReason -{ - None, - Unknown, - Validation, - Error -} \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Models/AuthorityResultOldOld.cs b/DotBased.AspNet.Authority/Models/AuthorityResultOldOld.cs new file mode 100755 index 0000000..b12a05d --- /dev/null +++ b/DotBased.AspNet.Authority/Models/AuthorityResultOldOld.cs @@ -0,0 +1,41 @@ +using DotBased.AspNet.Authority.Models.Validation; + +namespace DotBased.AspNet.Authority.Models; + +public class AuthorityResultOldOld : ResultOld +{ + public static AuthorityResultOldOld FromResult(ResultOld resultOld) => new AuthorityResultOldOld(resultOld); + + public AuthorityResultOldOld(ResultOld resultOld) : base(resultOld) + { + Reason = ResultFailReason.Unknown; + } + + public AuthorityResultOldOld(bool success, string errorMessage = "", TResultValue? value = default, ResultFailReason reason = ResultFailReason.None, IReadOnlyList? errors = null) : base(success, errorMessage, value, null) + { + Success = success; + Message = errorMessage; + Value = value; + Reason = reason; + ValidationErrors = errors; + } + public ResultFailReason Reason { get; } + public IReadOnlyList? ValidationErrors { get; } + + + public new static AuthorityResultOldOld Ok(TResultValue? value) => new AuthorityResultOldOld(true, value:value); + + public static AuthorityResultOldOld Error(string errorMessage, ResultFailReason reason = ResultFailReason.Error) => + new AuthorityResultOldOld(false, errorMessage, reason:reason); + + public static AuthorityResultOldOld Failed(IReadOnlyList errors, ResultFailReason reason = ResultFailReason.None) + => new AuthorityResultOldOld(false, errors:errors, reason:reason); +} + +public enum ResultFailReason +{ + None, + Unknown, + Validation, + Error +} \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Models/QueryItems.cs b/DotBased.AspNet.Authority/Models/QueryItems.cs new file mode 100644 index 0000000..d59cf75 --- /dev/null +++ b/DotBased.AspNet.Authority/Models/QueryItems.cs @@ -0,0 +1,21 @@ +namespace DotBased.AspNet.Authority.Models; + +public class QueryItems +{ + private QueryItems(IEnumerable items, int totalCount, int limit, int offset) + { + Items = items.ToList(); + TotalCount = totalCount; + Limit = limit; + Offset = offset; + } + + public readonly IReadOnlyCollection Items; + + public int Count => Items.Count; + public int TotalCount { get; } + public int Limit { get; } + public int Offset { get; } + + public static QueryItems Create(IEnumerable items, int totalCount, int limit, int offset) => new(items, totalCount, limit, offset); +} \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Monads/ValidationResult.cs b/DotBased.AspNet.Authority/Monads/ValidationResult.cs index 6d4dfc7..ed5edc5 100644 --- a/DotBased.AspNet.Authority/Monads/ValidationResult.cs +++ b/DotBased.AspNet.Authority/Monads/ValidationResult.cs @@ -1,8 +1,9 @@ +using DotBased.AspNet.Authority.Models.Validation; using DotBased.Monads; namespace DotBased.AspNet.Authority.Monads; -public class ValidationResult : DotBased.Monads.Result +public class ValidationResult : Result { private ValidationResult(T result) : base(result) { @@ -12,9 +13,31 @@ public class ValidationResult : DotBased.Monads.Result { } - private ValidationResult(ResultInformation information) : base(information) + private ValidationResult(ResultError error) : base(error) { } + + private ValidationResult(List validationErrors) : base(ResultError.Fail("Validation failed!")) + { + _validationErrors = validationErrors; + } + + private readonly List _validationErrors = []; + public IReadOnlyList ValidationErrors => _validationErrors; - + public static implicit operator ValidationResult(T result) => new(result); + public static implicit operator ValidationResult(Exception exception) => new(exception); + public static implicit operator ValidationResult(ResultError error) => new(error); + public static implicit operator ValidationResult(List validationErrors) => new(validationErrors); + + public static ValidationResult FromResult(Result result) + { + var authorityResult = result.Match>( + r => new ValidationResult(r), + error => new ValidationResult(error)); + return authorityResult; + } + + public TMatch Match(Func success, Func, TMatch> failure) => + IsSuccess && Value != null ? success(Value) : failure(Error ?? ResultError.Fail("No error and value is null!"), ValidationErrors); } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Repositories/IAttributeRepository.cs b/DotBased.AspNet.Authority/Repositories/IAttributeRepository.cs index bf045f6..2a5fd6e 100755 --- a/DotBased.AspNet.Authority/Repositories/IAttributeRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IAttributeRepository.cs @@ -4,9 +4,9 @@ namespace DotBased.AspNet.Authority.Repositories; public interface IAttributeRepository { - public Task> GetAttributesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); - public Task> GetAttributeByKeyAsync(string id, CancellationToken cancellationToken = default); - public Task> CreateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); - public Task> UpdateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); - public Task DeleteAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); + public Task> GetAttributesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); + public Task> GetAttributeByKeyAsync(string id, CancellationToken cancellationToken = default); + public Task> CreateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); + public Task> UpdateAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); + public Task DeleteAttributeAsync(AuthorityAttribute attribute, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Repositories/IGroupRepository.cs b/DotBased.AspNet.Authority/Repositories/IGroupRepository.cs index c7f8ae5..7cc8d59 100755 --- a/DotBased.AspNet.Authority/Repositories/IGroupRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IGroupRepository.cs @@ -4,10 +4,10 @@ namespace DotBased.AspNet.Authority.Repositories; public interface IGroupRepository { - public Task> GetGroupsAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); - public Task> GetGroupByIdAsync(string id, CancellationToken cancellationToken = default); - public Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task> CreateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); - public Task> UpdateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); - public Task DeleteGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); + public Task> GetGroupsAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); + public Task> GetGroupByIdAsync(string id, CancellationToken cancellationToken = default); + public Task> GetUserGroupsAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> CreateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); + public Task> UpdateGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); + public Task DeleteGroupAsync(AuthorityGroup group, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Repositories/IRoleRepository.cs b/DotBased.AspNet.Authority/Repositories/IRoleRepository.cs index 3bbb5cb..ba68d4a 100755 --- a/DotBased.AspNet.Authority/Repositories/IRoleRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IRoleRepository.cs @@ -1,16 +1,18 @@ +using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models.Authority; +using DotBased.Monads; namespace DotBased.AspNet.Authority.Repositories; public interface IRoleRepository { - public Task> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); - public Task> GetRoleByIdAsync(string id, CancellationToken cancellationToken = default); + public Task>> GetRolesAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); + public Task> GetRoleByIdAsync(Guid id, CancellationToken cancellationToken = default); public Task> CreateRoleAsync(AuthorityRole role, CancellationToken cancellationToken = default); public Task> UpdateRoleAsync(AuthorityRole role, CancellationToken cancellationToken = default); public Task DeleteRolesAsync(List roles, CancellationToken cancellationToken = default); public Task AddRolesLinkAsync(List roles, Guid linkId, CancellationToken cancellationToken = default); - public Task> GetLinkedRolesAsync(List linkIds, CancellationToken cancellationToken = default); + public Task>> GetLinkedRolesAsync(List linkIds, CancellationToken cancellationToken = default); public Task DeleteRolesLinkAsync(List roles, Guid linkId, CancellationToken cancellationToken = default); /// @@ -20,5 +22,5 @@ public interface IRoleRepository /// /// /// - public Task> HasRolesAsync(Guid linkId, List roles, CancellationToken cancellationToken = default); + public Task>> HasRolesAsync(Guid linkId, List roles, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs index 0107a76..97cc30c 100755 --- a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs @@ -4,14 +4,14 @@ namespace DotBased.AspNet.Authority.Repositories; public interface IUserRepository { - public Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); - public Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default); - public Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default); - public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); - public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default); - public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); + public Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default); + public Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default); + public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); + public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default); + public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/DotBased/Monads/Result.cs b/DotBased/Monads/Result.cs index c94724b..c36423d 100644 --- a/DotBased/Monads/Result.cs +++ b/DotBased/Monads/Result.cs @@ -10,27 +10,39 @@ public class Result protected Result(Exception exception) { IsSuccess = false; - Information = ResultInformation.Error(exception); + Error = ResultError.Error(exception); } - protected Result(ResultInformation information) + protected Result(ResultError error) { IsSuccess = false; - Information = information; + Error = error; } public bool IsSuccess { get; } - public ResultInformation? Information { get; set; } + public ResultError? Error { get; set; } public static implicit operator Result(Exception exception) => new(exception); - public static implicit operator Result(ResultInformation information) => new(information); + public static implicit operator Result(ResultError error) => new(error); public static Result Success() => new(); - public static Result Error(ResultInformation information) => new(information); - public static Result Fail(Exception exception) => new(exception); + public static Result Fail(ResultError error) => new(error); + public static Result Exception(Exception exception) => new(exception); - public TMatch Match(Func success, Func failure) => IsSuccess ? success() : failure(Information!); + public TMatch Match(Func success, Func failure) => IsSuccess ? success() : failure(Error!); + + public void Match(Action success, Action failure) + { + if (IsSuccess) + { + success(); + } + else + { + failure(Error!); + } + } } public class Result : Result @@ -45,7 +57,7 @@ public class Result : Result _result = default; } - protected Result(ResultInformation information) : base(information) + protected Result(ResultError error) : base(error) { _result = default; } @@ -55,30 +67,27 @@ public class Result : Result public static implicit operator Result(TResult result) => new(result); public static implicit operator Result(Exception exception) => new(exception); - public static implicit operator Result(ResultInformation information) => new(information); + public static implicit operator Result(ResultError error) => new(error); public static Result Success(TResult result) => new(result); - public new static Result Error(ResultInformation information) => new(information); - public new static Result Fail(Exception exception) => new(exception); + public new static Result Fail(ResultError error) => new(error); + public new static Result Exception(Exception exception) => new(exception); - public TMatch Match(Func success, Func failure) - { - return IsSuccess && _result != null ? success(_result) : failure(Information ?? ResultInformation.Fail("No error and value is null!")); - } + public TMatch Match(Func success, Func failure) => + IsSuccess && Value != null ? success(Value) : failure(Error ?? ResultError.Fail("No error and value is null!")); } -public class ResultInformation +public class ResultError { - private ResultInformation(string message, Exception? exception) + private ResultError(string description, Exception? exception) { - Message = message; + Description = description; Exception = exception; } - public string Message { get; } + public string Description { get; } public Exception? Exception { get; } - public static ResultInformation Info(string message) => new(message, null); - public static ResultInformation Fail(string message) => new(message, null); - public static ResultInformation Error(Exception exception, string message = "") => new(message, exception); + public static ResultError Fail(string description) => new(description, null); + public static ResultError Error(Exception exception, string description = "") => new(description, exception); } \ No newline at end of file diff --git a/DotBased/Result.cs b/DotBased/ResultOld.cs similarity index 55% rename from DotBased/Result.cs rename to DotBased/ResultOld.cs index 60a61fa..5805d6c 100755 --- a/DotBased/Result.cs +++ b/DotBased/ResultOld.cs @@ -3,16 +3,16 @@ namespace DotBased; /// /// Simple result class for returning a result state or a message and an exception. /// -public class Result +public class ResultOld { - public Result(bool success, string message, Exception? exception) + public ResultOld(bool success, string message, Exception? exception) { Success = success; Message = message; Exception = exception; } - public Result(Result bObj) + public ResultOld(ResultOld bObj) { Success = bObj.Success; Message = bObj.Message; @@ -23,36 +23,36 @@ public class Result public string Message { get; set; } public Exception? Exception { get; set; } - public static Result Ok() => new(true, string.Empty, null); - public static Result Failed(string message, Exception? exception = null) => new(false, message, exception); + public static ResultOld Ok() => new(true, string.Empty, null); + public static ResultOld Failed(string message, Exception? exception = null) => new(false, message, exception); } -public class Result : Result +public class ResultOld : ResultOld { - public Result(bool success, string message, TValue? value, Exception? exception) : base(success, message, exception) + public ResultOld(bool success, string message, TValue? value, Exception? exception) : base(success, message, exception) { Value = value; } - public Result(Result bObj) : base(bObj) + public ResultOld(ResultOld bObj) : base(bObj) { } public TValue? Value { get; set; } - public static Result Ok(TValue value) => new(true, string.Empty, value, null); + public static ResultOld Ok(TValue value) => new(true, string.Empty, value, null); - public new static Result Failed(string message, Exception? exception = null) => + public new static ResultOld Failed(string message, Exception? exception = null) => new(false, message, default, exception); - public static Result HandleResult(TValue? value, string failedMessage, Exception? exception = null) + public static ResultOld HandleResult(TValue? value, string failedMessage, Exception? exception = null) { return value == null ? Failed(failedMessage, exception) : Ok(value); } } -public class ListResult : Result +public class ListResultOld : ResultOld { - public ListResult(bool success, string message, int totalCount, IEnumerable? items, int limit = -1, int offset = -1, Exception? exception = null) : base(success, message, exception) + public ListResultOld(bool success, string message, int totalCount, IEnumerable? items, int limit = -1, int offset = -1, Exception? exception = null) : base(success, message, exception) { Items = items != null ? new List(items) : new List(); TotalCount = totalCount; @@ -60,7 +60,7 @@ public class ListResult : Result Offset = offset; } - public ListResult(Result bObj) : base(bObj) + public ListResultOld(ResultOld bObj) : base(bObj) { Items = new List(); } @@ -86,9 +86,9 @@ public class ListResult : Result /// public int Offset { get; } - public static ListResult Ok(IEnumerable items, int totalCount = -1, int limit = -1, int offset = -1) => + public static ListResultOld Ok(IEnumerable items, int totalCount = -1, int limit = -1, int offset = -1) => new(true, string.Empty, totalCount, items, limit, offset); - public new static ListResult Failed(string message, Exception? exception = null) => + public new static ListResultOld Failed(string message, Exception? exception = null) => new(false, message, -1, null, exception: exception); } \ No newline at end of file diff --git a/DotBased/Utilities/Cryptography.cs b/DotBased/Utilities/Cryptography.cs index f0e6192..c0fd022 100755 --- a/DotBased/Utilities/Cryptography.cs +++ b/DotBased/Utilities/Cryptography.cs @@ -7,12 +7,12 @@ public static class Cryptography /* * https://gist.github.com/therightstuff/aa65356e95f8d0aae888e9f61aa29414 */ - public static Result ExportPublicKeyToPem(RSACryptoServiceProvider csp) + public static ResultOld ExportPublicKeyToPem(RSACryptoServiceProvider csp) { var outputStream = new StringWriter(); var parameters = csp.ExportParameters(false); if (parameters.Exponent == null || parameters.Modulus == null) - return Result.Failed("RSAParameters are empty!"); + return ResultOld.Failed("RSAParameters are empty!"); using (var stream = new MemoryStream()) { var writer = new BinaryWriter(stream); @@ -66,7 +66,7 @@ public static class Cryptography outputStream.Write("-----END PUBLIC KEY-----"); } - return Result.Ok(outputStream.ToString()); + return ResultOld.Ok(outputStream.ToString()); } private static void EncodeLength(BinaryWriter stream, int length)