From 6253ba7de3ac7e824579df83a368e6a38fc5d241 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 25 Aug 2025 15:21:02 +0530 Subject: [PATCH] Chnaged the logic of adding and removing the permissions --- .../CacheHelper/EmployeeCache.cs | 25 +++++++++++++- .../Controllers/TenantController.cs | 33 ++++++++++++++++--- .../Helpers/CacheUpdateHelper.cs | 12 +++++++ 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs index 3e08484..0afbb67 100644 --- a/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs @@ -1,6 +1,7 @@ using Marco.Pms.Model.MongoDBModels.Employees; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using MongoDB.Driver; namespace Marco.Pms.Helpers.CacheHelper @@ -8,8 +9,11 @@ namespace Marco.Pms.Helpers.CacheHelper public class EmployeeCache { private readonly IMongoCollection _collection; - public EmployeeCache(IConfiguration configuration) + private readonly ILogger _logger; + + public EmployeeCache(IConfiguration configuration, ILogger logger) { + _logger = logger; var connectionString = configuration["MongoDB:ConnectionString"]; var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); // Your MongoDB connection string @@ -185,6 +189,25 @@ namespace Marco.Pms.Helpers.CacheHelper return true; } + public async Task ClearAllEmployeesFromCacheByEmployeeIds(List employeeIds) + { + try + { + var filter = Builders.Filter.In(x => x.Id, employeeIds); + + var result = await _collection.DeleteManyAsync(filter); + + if (result.DeletedCount == 0) + return false; + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while deleting employee profile"); + return false; + } + } // A private method to handle the one-time setup of the collection's indexes. private async Task InitializeCollectionAsync() diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 69be1e4..38f72df 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -12,6 +12,7 @@ using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Tenant; +using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; @@ -39,6 +40,8 @@ namespace Marco.Pms.Services.Controllers private readonly UserHelper _userHelper; private readonly FeatureDetailsHelper _featureDetailsHelper; + private readonly Guid tenantId; + private readonly static Guid projectActiveStatus = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); private readonly static Guid projectInProgressStatus = Guid.Parse("cdad86aa-8a56-4ff4-b633-9c629057dfef"); private readonly static Guid projectOnHoldStatus = Guid.Parse("603e994b-a27f-4e5d-a251-f3d69b0498ba"); @@ -64,6 +67,7 @@ namespace Marco.Pms.Services.Controllers _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); + tenantId = userHelper.GetTenantId(); } #region =================================================================== Tenant APIs =================================================================== @@ -953,6 +957,10 @@ namespace Marco.Pms.Services.Controllers try { + _ = Task.Run(async () => + { + await ClearPermissionForTenant(); + }); var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); if (features == null) { @@ -1214,8 +1222,6 @@ namespace Marco.Pms.Services.Controllers UpdatedAt = DateTime.UtcNow }, "SubscriptionPlanModificationLog"); - - return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); } @@ -1263,6 +1269,11 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}", model.TenantId, model.PlanId); + _ = Task.Run(async () => + { + await ClearPermissionForTenant(); + }); + // 8. Update tenant permissions based on subscription features. var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); if (features == null) @@ -1329,11 +1340,12 @@ namespace Marco.Pms.Services.Controllers void ProcessPerms(bool? enabled, List ids) { - var isOldPermissionIdExist = oldPermIds.Any(fp => ids.Contains(fp)); + var isOldPermissionIdExist = oldPermIds.Any(fp => ids.Contains(fp) && !employeePerms.Contains(fp)); if (enabled == true && !isOldPermissionIdExist) newPermissionIds.AddRange(ids); if (enabled == true && !isOldEmployeePermissionIdExist) newPermissionIds.AddRange(ids); - if (enabled == false && isOldPermissionIdExist) revokePermissionIds.AddRange(ids); + if (enabled == false && isOldPermissionIdExist) + revokePermissionIds.AddRange(ids); } ProcessPerms(features.Modules?.ProjectManagement?.Enabled, projectPermTask.Result); ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result); @@ -1755,6 +1767,19 @@ namespace Marco.Pms.Services.Controllers return ApiResponse.SuccessResponse(VM, "Success", 200); } + private async Task ClearPermissionForTenant() + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScopeFactory.CreateScope(); + + var _cache = scope.ServiceProvider.GetRequiredService(); + var _cacheLogger = scope.ServiceProvider.GetRequiredService(); + + var employeeIds = await _context.Employees.Where(e => e.TenantId == tenantId).Select(e => e.Id).ToListAsync(); + await _cache.ClearAllEmployeesFromCacheByEmployeeIds(employeeIds); + _cacheLogger.LogInfo("{EmployeeCount} number of employee deleted", employeeIds.Count); + } + #endregion } } diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index cbd7b6e..60005ab 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -853,6 +853,18 @@ namespace Marco.Pms.Services.Helpers _logger.LogWarning("Error occured while deleting Application role {RoleId} from Cache for employee {EmployeeId}: {Error}", roleId, employeeId, ex.Message); } } + public async Task ClearAllEmployeesFromCacheByEmployeeIds(List employeeIds) + { + try + { + var stringEmployeeIds = employeeIds.Select(e => e.ToString()).ToList(); + var response = await _employeeCache.ClearAllEmployeesFromCacheByEmployeeIds(stringEmployeeIds); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while deleting all employees from Cache"); + } + } public async Task ClearAllEmployees() { try