Chnaged the logic of adding and removing the permissions

This commit is contained in:
ashutosh.nehete 2025-08-25 15:21:02 +05:30
parent fdcbd9af5f
commit 6253ba7de3
3 changed files with 65 additions and 5 deletions

View File

@ -1,6 +1,7 @@
using Marco.Pms.Model.MongoDBModels.Employees; using Marco.Pms.Model.MongoDBModels.Employees;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MongoDB.Driver; using MongoDB.Driver;
namespace Marco.Pms.Helpers.CacheHelper namespace Marco.Pms.Helpers.CacheHelper
@ -8,8 +9,11 @@ namespace Marco.Pms.Helpers.CacheHelper
public class EmployeeCache public class EmployeeCache
{ {
private readonly IMongoCollection<EmployeePermissionMongoDB> _collection; private readonly IMongoCollection<EmployeePermissionMongoDB> _collection;
public EmployeeCache(IConfiguration configuration) private readonly ILogger<EmployeeCache> _logger;
public EmployeeCache(IConfiguration configuration, ILogger<EmployeeCache> logger)
{ {
_logger = logger;
var connectionString = configuration["MongoDB:ConnectionString"]; var connectionString = configuration["MongoDB:ConnectionString"];
var mongoUrl = new MongoUrl(connectionString); var mongoUrl = new MongoUrl(connectionString);
var client = new MongoClient(mongoUrl); // Your MongoDB connection string var client = new MongoClient(mongoUrl); // Your MongoDB connection string
@ -185,6 +189,25 @@ namespace Marco.Pms.Helpers.CacheHelper
return true; return true;
} }
public async Task<bool> ClearAllEmployeesFromCacheByEmployeeIds(List<string> employeeIds)
{
try
{
var filter = Builders<EmployeePermissionMongoDB>.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. // A private method to handle the one-time setup of the collection's indexes.
private async Task InitializeCollectionAsync() private async Task InitializeCollectionAsync()

View File

@ -12,6 +12,7 @@ using Marco.Pms.Model.TenantModels.MongoDBModel;
using Marco.Pms.Model.Utilities; using Marco.Pms.Model.Utilities;
using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Tenant; using Marco.Pms.Model.ViewModels.Tenant;
using Marco.Pms.Services.Helpers;
using Marco.Pms.Services.Service; using Marco.Pms.Services.Service;
using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Helpers;
using MarcoBMS.Services.Service; using MarcoBMS.Services.Service;
@ -39,6 +40,8 @@ namespace Marco.Pms.Services.Controllers
private readonly UserHelper _userHelper; private readonly UserHelper _userHelper;
private readonly FeatureDetailsHelper _featureDetailsHelper; private readonly FeatureDetailsHelper _featureDetailsHelper;
private readonly Guid tenantId;
private readonly static Guid projectActiveStatus = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); 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 projectInProgressStatus = Guid.Parse("cdad86aa-8a56-4ff4-b633-9c629057dfef");
private readonly static Guid projectOnHoldStatus = Guid.Parse("603e994b-a27f-4e5d-a251-f3d69b0498ba"); 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)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
_userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper));
_featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper));
tenantId = userHelper.GetTenantId();
} }
#region =================================================================== Tenant APIs =================================================================== #region =================================================================== Tenant APIs ===================================================================
@ -953,6 +957,10 @@ namespace Marco.Pms.Services.Controllers
try try
{ {
_ = Task.Run(async () =>
{
await ClearPermissionForTenant();
});
var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId);
if (features == null) if (features == null)
{ {
@ -1214,8 +1222,6 @@ namespace Marco.Pms.Services.Controllers
UpdatedAt = DateTime.UtcNow UpdatedAt = DateTime.UtcNow
}, "SubscriptionPlanModificationLog"); }, "SubscriptionPlanModificationLog");
return Ok(ApiResponse<object>.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); return Ok(ApiResponse<object>.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200));
} }
@ -1263,6 +1269,11 @@ namespace Marco.Pms.Services.Controllers
_logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}", _logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}",
model.TenantId, model.PlanId); model.TenantId, model.PlanId);
_ = Task.Run(async () =>
{
await ClearPermissionForTenant();
});
// 8. Update tenant permissions based on subscription features. // 8. Update tenant permissions based on subscription features.
var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId);
if (features == null) if (features == null)
@ -1329,11 +1340,12 @@ namespace Marco.Pms.Services.Controllers
void ProcessPerms(bool? enabled, List<Guid> ids) void ProcessPerms(bool? enabled, List<Guid> 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 && !isOldPermissionIdExist) newPermissionIds.AddRange(ids);
if (enabled == true && !isOldEmployeePermissionIdExist) 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?.ProjectManagement?.Enabled, projectPermTask.Result);
ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result); ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result);
@ -1755,6 +1767,19 @@ namespace Marco.Pms.Services.Controllers
return ApiResponse<SubscriptionPlanVM>.SuccessResponse(VM, "Success", 200); return ApiResponse<SubscriptionPlanVM>.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<CacheUpdateHelper>();
var _cacheLogger = scope.ServiceProvider.GetRequiredService<ILoggingService>();
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 #endregion
} }
} }

View File

@ -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); _logger.LogWarning("Error occured while deleting Application role {RoleId} from Cache for employee {EmployeeId}: {Error}", roleId, employeeId, ex.Message);
} }
} }
public async Task ClearAllEmployeesFromCacheByEmployeeIds(List<Guid> 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() public async Task ClearAllEmployees()
{ {
try try