using System.Collections; using BasicDotnetTemplate.MainProject.Core.Database; using BasicDotnetTemplate.MainProject.Models.Api.Common.Exceptions; using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; using Microsoft.EntityFrameworkCore; using BasicDotnetTemplate.MainProject.Models.Common; using BasicDotnetTemplate.MainProject.Utils; 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); List CreatePermissionsOnStartupAsync(); } public class PermissionService : BaseService, IPermissionService { private readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); private readonly CommonDbMethodsUtils _commonDbMethodsUtils; public PermissionService( IHttpContextAccessor httpContextAccessor, IConfiguration configuration, SqlServerContext sqlServerContext ) : base(httpContextAccessor, configuration, sqlServerContext) { _commonDbMethodsUtils = new CommonDbMethodsUtils(sqlServerContext); } private IQueryable GetRoleByNameQueryable(string name) { return _commonDbMethodsUtils.GetRoleByNameQueryable(name); } 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 #region "CreatePermissionOnStartup" private static List? GetSystemNamesFromFile(PermissionsFile permissionsFile) { return permissionsFile?.PermissionInfos?.Select(x => x.System).ToList(); } private static List? GetModulesNamesFromFile(PermissionsFile permissionsFile) { return permissionsFile?.PermissionInfos? .Where(x => x.RolePermissionModuleOperations != null) .SelectMany(x => x.RolePermissionModuleOperations!) .Select(y => y.Module) .Distinct() .ToList(); } private static List? GetModulesNamesFromPermissionInfo(PermissionInfo permissionInfo) { return permissionInfo.RolePermissionModuleOperations? .Select(y => y.Module) .Distinct() .ToList(); } private (List, List) HandlePermissionSystemOnStartup(PermissionsFile permissionsFile) { List newPermissions = []; List systemNames = []; List permissionSystemList = []; List? systems = GetSystemNamesFromFile(permissionsFile); if (systems != null && systems.Count > 0) { foreach (var system in systems) { if (!String.IsNullOrEmpty(system)) { systemNames.Add(system); } } } foreach (var system in systemNames) { PermissionSystem? permissionSystem = this.GetPermissionSystemByNameAsync(system).Result; if (permissionSystem == null) { permissionSystem = this.CreatePermissionSystemAsync(system, true).Result; newPermissions.Add($"Added new PermissionSystem => {permissionSystem?.Name}"); } if (permissionSystem != null) { permissionSystemList.Add(permissionSystem); } } return (permissionSystemList, newPermissions); } private (List, List) HandlePermissionModuleOnStartup(PermissionsFile permissionsFile) { List newPermissions = []; List moduleNames = []; List permissionModuleList = []; List? modules = GetModulesNamesFromFile(permissionsFile); if (modules != null && modules.Count > 0) { foreach (var module in modules) { if (!String.IsNullOrEmpty(module)) { moduleNames.Add(module); } } } foreach (var module in moduleNames) { PermissionModule? permissionModule = this.GetPermissionModuleByNameAsync(module).Result; if (permissionModule == null) { permissionModule = this.CreatePermissionModuleAsync(module, true).Result; newPermissions.Add($"Added new PermissionModule => {permissionModule?.Name}"); } if (permissionModule != null) { permissionModuleList.Add(permissionModule); } } return (permissionModuleList, newPermissions); } private (List, List) HandlePermissionOperationOnStartup(PermissionsFile permissionsFile) { List newPermissions = []; List operationNames = []; List permissionOperationList = []; List? operations = permissionsFile.PermissionInfos? .Where(x => x.RolePermissionModuleOperations != null) .SelectMany(x => x.RolePermissionModuleOperations!) .Where(x => x.Operations != null) .SelectMany(y => y.Operations!) .Select(z => z.Operation) .Distinct() .ToList(); if (operations != null && operations.Count > 0) { foreach (var operation in operations) { if (!String.IsNullOrEmpty(operation)) { operationNames.Add(operation); } } } foreach (var operation in operationNames) { PermissionOperation? permissionOperation = this.GetPermissionOperationByNameAsync(operation).Result; if (permissionOperation == null) { permissionOperation = this.CreatePermissionOperationAsync(operation).Result; newPermissions.Add($"Added new PermissionOperation => {permissionOperation?.Name}"); } if (permissionOperation != null) { permissionOperationList.Add(permissionOperation); } } return (permissionOperationList, newPermissions); } private async Task> HandleRolesOnStartup(PermissionsFile permissionsFile) { List roleNames = []; List rolesList = []; List? roles = permissionsFile.PermissionInfos? .Where(x => x.RolePermissionModuleOperations != null) .SelectMany(x => x.RolePermissionModuleOperations!) .Where(x => x.Operations != null) .SelectMany(y => y.Operations!) .Where(z => z.Roles != null) .SelectMany(z => z.Roles!) .Where(z => z != null) .Distinct() .ToList(); if (roles != null && roles.Count > 0) { foreach (var role in roles) { if (!String.IsNullOrEmpty(role)) { roleNames.Add(role); } } } foreach (var roleName in roleNames) { Role? role = await this.GetRoleByNameQueryable(roleName).FirstOrDefaultAsync(); if (role == null) { Role tempRole = new() { CreationTime = DateTime.UtcNow, IsDeleted = false, Guid = Guid.NewGuid().ToString(), Name = roleName, IsNotEditable = false }; using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); try { await _sqlServerContext.Roles.AddAsync(tempRole); await _sqlServerContext.SaveChangesAsync(); await transaction.CommitAsync(); role = tempRole; } catch (Exception exception) { await transaction.RollbackAsync(); Logger.Error(exception, $"[RoleService][CreateRoleAsync]"); throw new CreateException($"An error occurred while saving the role for transaction ID {transaction.TransactionId}.", exception); } Logger.Info($"Added new Role => {role.Name}"); } rolesList.Add(role); } return rolesList; } private (List, List) HandlePermissionSystemModulesOnStartup(PermissionSystem permissionSystem, List permissionModules) { List newPermissions = []; List permissionSystemModuleList = []; foreach (var permissionModule in permissionModules) { PermissionSystemModule? permissionSystemModule = this.GetPermissionSystemModulesQueryable()? .FirstOrDefault(x => x.PermissionSystemId == permissionSystem!.Id && x.PermissionModuleId == permissionModule.Id ); if (permissionSystemModule == null) { permissionSystemModule = this.CreatePermissionSystemModuleAsync(permissionSystem!, permissionModule, true).Result; newPermissions.Add($"Added new PermissionSystemModule => {permissionSystem?.Name}.{permissionModule?.Name}"); } if (permissionSystemModule != null) { permissionSystemModuleList.Add(permissionSystemModule); } } return (permissionSystemModuleList, newPermissions); } private (List, List) HandlePermissionSystemModuleOnStartup ( PermissionsFile permissionsFile, List permissionSystems, List allPermissionModules, PermissionInfo permissionInfo ) { List newPermissions = []; List permissionSystemModuleList = []; PermissionSystem? permissionSystem = permissionSystems.FirstOrDefault(x => x.Name == permissionInfo.System); if (permissionSystem != null) { List? modules = GetModulesNamesFromFile(permissionsFile); if (modules != null && modules.Count > 0) { List permissionModules = allPermissionModules.Where(x => modules.Contains(x.Name)).ToList(); if (permissionModules.Count > 0) { (permissionSystemModuleList, newPermissions) = this.HandlePermissionSystemModulesOnStartup(permissionSystem, permissionModules); } } } return (permissionSystemModuleList, newPermissions); } private (List, List) HandlePermissionSystemModuleOnStartup( PermissionsFile permissionsFile, List permissionSystems, List allPermissionModules ) { List newPermissions = []; List permissionSystemModuleList = []; if (permissionsFile?.PermissionInfos != null) { foreach (var permissionInfo in permissionsFile!.PermissionInfos!) { if (!String.IsNullOrEmpty(permissionInfo.System)) { var modulesNames = GetModulesNamesFromPermissionInfo(permissionInfo); if (modulesNames != null && modulesNames.Count > 0) { List permissionModules = allPermissionModules.Where(x => modulesNames.Contains(x.Name)).ToList(); (permissionSystemModuleList, newPermissions) = this.HandlePermissionSystemModuleOnStartup(permissionsFile, permissionSystems, permissionModules, permissionInfo); } } } } return (permissionSystemModuleList, newPermissions); } private (List, List) HandlePermissionSystemModuleOperationOnStartup ( PermissionSystemModule permissionSystemModule, List permissionOperations ) { List newPermissions = []; List permissionSystemModuleOperationList = []; foreach (var permissionOperation in permissionOperations) { PermissionSystemModuleOperation? permissionSystemModuleOperation = this.GetPermissionSystemModuleOperationsQueryable()? .FirstOrDefault(x => x.PermissionSystemModuleId == permissionSystemModule!.Id && x.PermissionOperationId == permissionOperation.Id ); if (permissionSystemModuleOperation == null) { permissionSystemModuleOperation = this.CreatePermissionSystemModuleOperationAsync(permissionSystemModule!, permissionOperation, true).Result; newPermissions.Add($"Added new PermissionSystemModuleOperation => {permissionSystemModuleOperation?.PermissionSystemModule?.PermissionSystem?.Name}.{permissionSystemModuleOperation?.PermissionSystemModule?.PermissionModule?.Name}.{permissionSystemModuleOperation?.PermissionOperation?.Name}"); } if (permissionSystemModuleOperation != null) { permissionSystemModuleOperationList.Add(permissionSystemModuleOperation!); } } return (permissionSystemModuleOperationList, newPermissions); } private (List, List) HandlePermissionSystemModuleOperationOnStartup ( List permissionSystemModulesList, List allPermissionOperations, PermissionInfo permissionInfo ) { List newPermissions = []; List tmpPermissions = []; List permissionSystemModuleOperationList = []; List tmpPermissionSystemModuleOperationList = []; if (permissionInfo != null && permissionInfo.RolePermissionModuleOperations != null) { foreach (var rolePermissionModuleOperation in permissionInfo.RolePermissionModuleOperations) { PermissionSystemModule? permissionSystemModule = permissionSystemModulesList.FirstOrDefault(x => x.PermissionModule.Name == rolePermissionModuleOperation.Module); if (permissionSystemModule != null) { var operationsNames = rolePermissionModuleOperation.Operations?.Select(x => x.Operation).ToList(); if (operationsNames != null && operationsNames.Count > 0) { List permissionOperations = allPermissionOperations.Where(x => operationsNames.Contains(x.Name)).ToList(); (tmpPermissionSystemModuleOperationList, tmpPermissions) = this.HandlePermissionSystemModuleOperationOnStartup(permissionSystemModule, permissionOperations); newPermissions.AddRange(tmpPermissions); permissionSystemModuleOperationList.AddRange(tmpPermissionSystemModuleOperationList); } } } } return (permissionSystemModuleOperationList, newPermissions); } private (List, List) HandlePermissionSystemModuleOperationOnStartup ( PermissionsFile permissionsFile, List permissionSystemModules, List allPermissionOperation ) { List newPermissions = []; List tmpPermissions = []; List permissionSystemModuleOperationList = []; List tmpPermissionSystemModuleOperationList = []; if (permissionsFile.PermissionInfos != null) { foreach (var permissionInfo in permissionsFile.PermissionInfos!) { if (!String.IsNullOrEmpty(permissionInfo.System)) { // Get all PermissionSystemModules by System.Name List permissionSystemModulesList = permissionSystemModules .Where(x => x.PermissionSystem.Name == permissionInfo.System).ToList(); if (permissionSystemModulesList.Count > 0) { (tmpPermissionSystemModuleOperationList, tmpPermissions) = this.HandlePermissionSystemModuleOperationOnStartup ( permissionSystemModulesList, allPermissionOperation, permissionInfo ); newPermissions.AddRange(tmpPermissions); permissionSystemModuleOperationList.AddRange(tmpPermissionSystemModuleOperationList); } } } } return (permissionSystemModuleOperationList, newPermissions); } private (List, List) HandleRolePermissionSystemModuleOperationOnStartup ( List allPermissionSystemModuleOperationsBySystem, List allRoles, PermissionInfo permissionInfo ) { List newPermissions = []; List tmpPermissions = []; List rolePermissionSystemModuleOperationList = []; List tmpRolePermissionSystemModuleOperationList = []; if (permissionInfo != null && permissionInfo.RolePermissionModuleOperations != null) { foreach (var rolePermissionModuleOperation in permissionInfo.RolePermissionModuleOperations) { List? allPermissionSystemModuleOperationsBySystemModule = allPermissionSystemModuleOperationsBySystem .Where(x => x.PermissionSystemModule.PermissionModule.Name == rolePermissionModuleOperation.Module) .ToList(); if (allPermissionSystemModuleOperationsBySystemModule.Count > 0) { var operationsNames = rolePermissionModuleOperation.Operations?.Select(x => x.Operation).ToList(); if (operationsNames != null && operationsNames.Count > 0) { List permissionSystemModuleOperations = allPermissionSystemModuleOperationsBySystemModule .Where(x => operationsNames.Contains(x.PermissionOperation.Name)).ToList(); (tmpRolePermissionSystemModuleOperationList, tmpPermissions) = this.HandleRolePermissionSystemModuleOperationOnStartup( permissionSystemModuleOperations, allRoles, rolePermissionModuleOperation ); newPermissions.AddRange(tmpPermissions); rolePermissionSystemModuleOperationList.AddRange(tmpRolePermissionSystemModuleOperationList); } } } } return (rolePermissionSystemModuleOperationList, newPermissions); } private (List, List) HandleRolePermissionSystemModuleOperationOnStartup ( List permissionSystemModuleOperations, List allRoles, RolePermissionModuleOperation rolePermissionModuleOperation ) { List newPermissions = []; List tmpPermissions = []; List rolePermissionSystemModuleOperationList = []; List tmpRolePermissionSystemModuleOperationList = []; if (permissionSystemModuleOperations != null && permissionSystemModuleOperations.Count > 0 && allRoles != null && allRoles.Count > 0 && rolePermissionModuleOperation?.Operations != null && rolePermissionModuleOperation.Operations.Count > 0 ) { foreach (var operationInfo in rolePermissionModuleOperation.Operations) { PermissionSystemModuleOperation? permissionSystemModuleOperation = permissionSystemModuleOperations .FirstOrDefault(x => x.PermissionOperation.Name == operationInfo.Operation); if (permissionSystemModuleOperation != null && operationInfo.Roles != null && operationInfo.Roles.Count > 0) { var roles = allRoles.Where(x => operationInfo.Roles.Contains(x.Name)).ToList(); if (roles.Count > 0) { foreach (var roleName in operationInfo.Roles) { (tmpRolePermissionSystemModuleOperationList, tmpPermissions) = this.HandleRolePermissionSystemModuleOperationOnStartup ( roles, roleName, permissionSystemModuleOperation ); newPermissions.AddRange(tmpPermissions); rolePermissionSystemModuleOperationList.AddRange(tmpRolePermissionSystemModuleOperationList); } } } } } return (rolePermissionSystemModuleOperationList, newPermissions); } private (List, List) HandleRolePermissionSystemModuleOperationOnStartup ( List roles, string roleName, PermissionSystemModuleOperation permissionSystemModuleOperation ) { List newPermissions = []; List rolePermissionSystemModuleOperationList = []; Role? role = roles.FirstOrDefault(x => x.Name == roleName); if (role != null) { RolePermissionSystemModuleOperation? rolePermissionSystemModuleOperation = this._sqlServerContext.RolePermissionSystemModuleOperations? .FirstOrDefault(x => x.RoleId == role.Id && x.PermissionSystemModuleOperationId == permissionSystemModuleOperation!.Id); if (rolePermissionSystemModuleOperation == null) { rolePermissionSystemModuleOperation = this.CreateRolePermissionSystemModuleOperationAsync(role, permissionSystemModuleOperation!, true).Result; if (rolePermissionSystemModuleOperation != null) { newPermissions.Add($"Added new RolePermissionSystemModuleOperation => " + $"{permissionSystemModuleOperation?.PermissionSystemModule?.PermissionSystem?.Name}." + $"{permissionSystemModuleOperation?.PermissionSystemModule?.PermissionModule?.Name}." + $"{permissionSystemModuleOperation?.PermissionOperation?.Name} for role {role.Name}"); } if (rolePermissionSystemModuleOperation != null) { rolePermissionSystemModuleOperationList.Add(rolePermissionSystemModuleOperation!); } } } return (rolePermissionSystemModuleOperationList, newPermissions); } private (List, List) HandleRolePermissionSystemModuleOperationOnStartup ( PermissionsFile permissionsFile, List allPermissionSystemModuleOperations, List allRoles ) { List newPermissions = []; List tmpPermissions = []; List rolePermissionSystemModuleOperationList = []; List tmpRolePermissionSystemModuleOperationList = []; if (permissionsFile.PermissionInfos != null) { foreach (var permissionInfo in permissionsFile.PermissionInfos!) { if (!String.IsNullOrEmpty(permissionInfo.System)) { // Get all PermissionSystemModuleOperations by System.Name List allPermissionSystemModuleOperationsBySystem = allPermissionSystemModuleOperations .Where(x => x.PermissionSystemModule.PermissionSystem.Name == permissionInfo.System).ToList(); if (allPermissionSystemModuleOperationsBySystem.Count > 0) { (tmpRolePermissionSystemModuleOperationList, tmpPermissions) = this.HandleRolePermissionSystemModuleOperationOnStartup ( allPermissionSystemModuleOperationsBySystem, allRoles, permissionInfo ); newPermissions.AddRange(tmpPermissions); rolePermissionSystemModuleOperationList.AddRange(tmpRolePermissionSystemModuleOperationList); } } } } return (rolePermissionSystemModuleOperationList, newPermissions); } public List CreatePermissionsOnStartupAsync() { try { List tmpPermissions = []; List newPermissions = []; PermissionsFile? permissionsFile = FileUtils.ConvertFileToObject(System.AppDomain.CurrentDomain.BaseDirectory + this._appSettings?.PermissionsSettings?.FilePath); List permissionSystemList = []; List permissionModuleList = []; List permissionOperationList = []; List permissionSystemModuleList = []; List permissionSystemModuleOperationList = []; List rolePermissionSystemModuleOperationList = []; if (permissionsFile != null && permissionsFile.PermissionInfos != null && permissionsFile.PermissionInfos.Count > 0) { (permissionSystemList, tmpPermissions) = this.HandlePermissionSystemOnStartup(permissionsFile); newPermissions.AddRange(tmpPermissions); (permissionModuleList, tmpPermissions) = this.HandlePermissionModuleOnStartup(permissionsFile); newPermissions.AddRange(tmpPermissions); (permissionOperationList, tmpPermissions) = this.HandlePermissionOperationOnStartup(permissionsFile); newPermissions.AddRange(tmpPermissions); (permissionSystemModuleList, tmpPermissions) = this.HandlePermissionSystemModuleOnStartup(permissionsFile, permissionSystemList, permissionModuleList); newPermissions.AddRange(tmpPermissions); (permissionSystemModuleOperationList, tmpPermissions) = this.HandlePermissionSystemModuleOperationOnStartup(permissionsFile, permissionSystemModuleList, permissionOperationList); newPermissions.AddRange(tmpPermissions); List roles = this.HandleRolesOnStartup(permissionsFile).Result; (rolePermissionSystemModuleOperationList, tmpPermissions) = this.HandleRolePermissionSystemModuleOperationOnStartup( permissionsFile, permissionSystemModuleOperationList, roles ); newPermissions.AddRange(tmpPermissions); } return newPermissions; } catch (Exception exception) { Logger.Error(exception, $"[PermissionService][CreatePermissionsOnStartupAsync]"); throw new CreateException($"An error occurred while adding permissions during startup", exception); } } #endregion }