using System.Collections; using BasicDotnetTemplate.MainProject.Core.Database; using BasicDotnetTemplate.MainProject.Models.Api.Common.Exceptions; using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; using Microsoft.EntityFrameworkCore; namespace BasicDotnetTemplate.MainProject.Services; public interface IPermissionService { Task GetPermissionSystemByGuidAsync(string guid); Task GetPermissionSystemByNameAsync(string name); Task HandleEnabledPermissionSystemAsync(PermissionSystem permission, bool enabled); Task CreatePermissionSystemAsync(string name, bool enabled); Task DeletePermissionSystemAsync(PermissionSystem permission); Task GetPermissionModuleByGuidAsync(string guid); Task GetPermissionModuleByNameAsync(string name); Task HandleEnabledPermissionModuleAsync(PermissionModule permission, bool enabled); Task CreatePermissionModuleAsync(string name, bool enabled); Task DeletePermissionModuleAsync(PermissionModule permission); Task GetPermissionOperationByGuidAsync(string guid); Task GetPermissionOperationByNameAsync(string name); Task CreatePermissionOperationAsync(string name); Task DeletePermissionOperationAsync(PermissionOperation permission); Task GetPermissionSystemModuleByGuidAsync(string guid); Task HandleEnabledPermissionSystemModuleAsync(PermissionSystemModule permission, bool enabled); Task CreatePermissionSystemModuleAsync( PermissionSystem permissionSystem, PermissionModule permissionModule, bool enabled ); Task DeletePermissionSystemModuleAsync(PermissionSystemModule permission); Task GetPermissionSystemModuleOperationByGuidAsync(string guid); Task HandleEnabledPermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission, bool enabled); Task CreatePermissionSystemModuleOperationAsync( PermissionSystemModule permissionSystemModule, PermissionOperation permissionOperation, bool enabled ); Task DeletePermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission); Task GetRolePermissionSystemModuleOperationByGuidAsync(string guid); Task HandleEnabledRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission, bool active); Task CreateRolePermissionSystemModuleOperationAsync( Role role, PermissionSystemModuleOperation permissionSystemModuleOperation, bool enabled ); Task DeleteRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission); } public class PermissionService : BaseService, IPermissionService { private readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); public PermissionService( IHttpContextAccessor httpContextAccessor, IConfiguration configuration, SqlServerContext sqlServerContext ) : base(httpContextAccessor, configuration, sqlServerContext) { } private IQueryable GetPermissionSystemsQueryable() { return this._sqlServerContext.PermissionSystems .Where(x => !x.IsDeleted); } private IQueryable GetPermissionModulesQueryable() { return this._sqlServerContext.PermissionModules .Where(x => !x.IsDeleted); } private IQueryable GetPermissionOperationsQueryable() { return this._sqlServerContext.PermissionOperations .Where(x => !x.IsDeleted); } private IQueryable GetPermissionSystemModulesQueryable() { return this._sqlServerContext.PermissionSystemModules .Where(x => !x.IsDeleted); } private IQueryable GetPermissionSystemModuleOperationsQueryable() { return this._sqlServerContext.PermissionSystemModuleOperations .Include(x => x.PermissionOperation) .Include(x => x.PermissionSystemModule) .ThenInclude(x => x.PermissionSystem) .Where(x => !x.IsDeleted); } private IQueryable GetRolePermissionSystemModuleOperationsQueryable() { return this._sqlServerContext.RolePermissionSystemModuleOperations .Include(x => x.Role) .Include(x => x.PermissionSystemModuleOperation) .ThenInclude(x => x.PermissionSystemModule) .ThenInclude(x => x.PermissionSystem) .Include(x => x.PermissionSystemModuleOperation) .ThenInclude(x => x.PermissionSystemModule) .ThenInclude(x => x.PermissionModule) .Include(x => x.PermissionSystemModuleOperation) .ThenInclude(x => x.PermissionOperation) .Where(x => !x.IsDeleted); } private static PermissionOperation CreatePermissionOperationData(string name) { PermissionOperation permission = new() { CreationTime = DateTime.UtcNow, Name = name, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } private static PermissionSystem CreatePermissionSystemData(string name, bool enabled) { PermissionSystem permission = new() { CreationTime = DateTime.UtcNow, Name = name, Enabled = enabled, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } private static PermissionModule CreatePermissionModuleData(string name, bool enabled) { PermissionModule permission = new() { CreationTime = DateTime.UtcNow, Name = name, Enabled = enabled, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } private static PermissionSystemModule CreatePermissionSystemModuleData( PermissionSystem permissionSystem, PermissionModule permissionModule, bool enabled ) { PermissionSystemModule permission = new() { CreationTime = DateTime.UtcNow, PermissionSystemId = permissionSystem.Id, PermissionSystem = permissionSystem, PermissionModuleId = permissionModule.Id, PermissionModule = permissionModule, Enabled = enabled, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } private static PermissionSystemModuleOperation CreatePermissionSystemModuleOperationData( PermissionSystemModule permissionSystemModule, PermissionOperation permissionOperation, bool enabled ) { PermissionSystemModuleOperation permission = new() { CreationTime = DateTime.UtcNow, PermissionOperationId = permissionOperation.Id, PermissionOperation = permissionOperation, PermissionSystemModuleId = permissionSystemModule.Id, PermissionSystemModule = permissionSystemModule, Enabled = enabled, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } private static RolePermissionSystemModuleOperation CreateRolePermissionSystemModuleOperationData( Role role, PermissionSystemModuleOperation permissionModuleOperation, bool active ) { RolePermissionSystemModuleOperation permission = new() { CreationTime = DateTime.UtcNow, PermissionSystemModuleOperationId = permissionModuleOperation.Id, PermissionSystemModuleOperation = permissionModuleOperation, RoleId = role.Id, Role = role, Active = active, IsDeleted = false, Guid = Guid.NewGuid().ToString() }; return permission; } #region "PermissionSystem" public async Task GetPermissionSystemByGuidAsync(string guid) { return await this.GetPermissionSystemsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task GetPermissionSystemByNameAsync(string name) { return await this.GetPermissionSystemsQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); } public async Task CreatePermissionSystemAsync(string name, bool enabled) { PermissionSystem? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreatePermissionSystemData(name, enabled); await _sqlServerContext.PermissionSystems.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][CreatePermissionSystemAsync]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task HandleEnabledPermissionSystemAsync(PermissionSystem permission, bool enabled) { bool? updated = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.Enabled = enabled; permission.UpdateTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); updated = true; } return updated; } public async Task DeletePermissionSystemAsync(PermissionSystem permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion #region "PermissionModule" public async Task GetPermissionModuleByGuidAsync(string guid) { return await this.GetPermissionModulesQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task GetPermissionModuleByNameAsync(string name) { return await this.GetPermissionModulesQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); } public async Task CreatePermissionModuleAsync(string name, bool enabled) { PermissionModule? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreatePermissionModuleData(name, enabled); await _sqlServerContext.PermissionModules.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][CreatePermissionModuleAsync]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task HandleEnabledPermissionModuleAsync(PermissionModule permission, bool enabled) { bool? updated = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.Enabled = enabled; permission.UpdateTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); updated = true; } return updated; } public async Task DeletePermissionModuleAsync(PermissionModule permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion #region "PermissionOperation" public async Task GetPermissionOperationByGuidAsync(string guid) { return await this.GetPermissionOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task GetPermissionOperationByNameAsync(string name) { return await this.GetPermissionOperationsQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); } public async Task CreatePermissionOperationAsync(string name) { PermissionOperation? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreatePermissionOperationData(name); await _sqlServerContext.PermissionOperations.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][CreatePermissionOperationAsync]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task DeletePermissionOperationAsync(PermissionOperation permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion #region "PermissionSystemModule" public async Task GetPermissionSystemModuleByGuidAsync(string guid) { return await this.GetPermissionSystemModulesQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task CreatePermissionSystemModuleAsync( PermissionSystem permissionSystem, PermissionModule permissionModule, bool enabled ) { PermissionSystemModule? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreatePermissionSystemModuleData(permissionSystem, permissionModule, enabled); await _sqlServerContext.PermissionSystemModules.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][CreatePermissionSystemModuleAsync]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task HandleEnabledPermissionSystemModuleAsync(PermissionSystemModule permission, bool enabled) { bool? updated = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.Enabled = enabled; permission.UpdateTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); updated = true; } return updated; } public async Task DeletePermissionSystemModuleAsync(PermissionSystemModule permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion #region "PermissionSystemModuleOperation" public async Task GetPermissionSystemModuleOperationByGuidAsync(string guid) { return await this.GetPermissionSystemModuleOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task CreatePermissionSystemModuleOperationAsync( PermissionSystemModule permissionSystemModule, PermissionOperation permissionOperation, bool enabled ) { PermissionSystemModuleOperation? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreatePermissionSystemModuleOperationData(permissionSystemModule, permissionOperation, enabled); await _sqlServerContext.PermissionSystemModuleOperations.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][CreatePermissionSystemModuleOperationAsync]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task HandleEnabledPermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission, bool enabled) { bool? updated = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.Enabled = enabled; permission.UpdateTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); updated = true; } return updated; } public async Task DeletePermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion #region "RolePermissionSystemModuleOperation" public async Task GetRolePermissionSystemModuleOperationByGuidAsync(string guid) { return await this.GetRolePermissionSystemModuleOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); } public async Task CreateRolePermissionSystemModuleOperationAsync( Role role, PermissionSystemModuleOperation permissionSystemModuleOperation, bool enabled ) { RolePermissionSystemModuleOperation? permission; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { var tempPermission = CreateRolePermissionSystemModuleOperationData(role, permissionSystemModuleOperation, enabled); await _sqlServerContext.RolePermissionSystemModuleOperations.AddAsync(tempPermission); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); permission = tempPermission; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[PermissionService][RolePermissionSystemModuleOperation]"); throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); } return permission; } public async Task HandleEnabledRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission, bool active) { bool? updated = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.Active = active; permission.UpdateTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); updated = true; } return updated; } public async Task DeleteRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission) { bool? deleted = false; using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) { permission.IsDeleted = true; permission.DeletionTime = DateTime.UtcNow; _sqlServerContext.Update(permission); await _sqlServerContext.SaveChangesAsync(); await (await transaction).CommitAsync(); deleted = true; } return deleted; } #endregion }