diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index f1706be..05ded40 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -33,40 +33,6 @@ namespace MarcoBMS.Services.Controllers tenantId = userHelper.GetTenantId(); } - private ICollection GetFeaturePermissionVM(Feature model) - { - if (model.FeaturePermissions == null) - { - return []; - } - - ICollection features = model.FeaturePermissions.Select(p => _mapper.Map(p)).OrderBy(f => f.Name).ToList(); - return features; - } - - [HttpGet("features")] - public async Task GetAllFeatures() - { - List featureIds = await _generalHelper.GetFeatureIdsByTenentId(tenantId); - var roles = await _context.Features - .Include(f => f.FeaturePermissions) - .Include(f => f.Module) - .Where(f => featureIds.Contains(f.Id)) - .ToListAsync(); - - var rolesVM = roles.Select(c => new FeatureVM() - { - Id = c.Id, - Name = c.Name, - Description = c.Description, - FeaturePermissions = GetFeaturePermissionVM(c), - ModuleId = c.ModuleId, - ModuleName = c.Module != null ? c.Module.Name : string.Empty, - IsActive = c.IsActive - }).OrderBy(f => f.Name).ToList(); - return Ok(ApiResponse.SuccessResponse(rolesVM, "Success.", 200)); - } - /// /// Converts FeaturePermissions from Feature entity into FeaturePermissionVM collection. /// @@ -100,24 +66,27 @@ namespace MarcoBMS.Services.Controllers { _logger.LogInfo("Fetching all features for tenant: {TenantId}", tenantId); - // Step 1: Get tenant-specific FeatureIds - List featureIds = await _generalHelper.GetFeatureIdsByTenentIdAsync(tenantId); - if (featureIds == null || !featureIds.Any()) + var featureQuery = _context.Features + .AsNoTracking(); // Optimization: Read-only query + if (tenantId != Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")) { - _logger.LogWarning("No features found for tenant: {TenantId}", tenantId); - return Ok(ApiResponse.SuccessResponse(new List(), "No features found.", 200)); + + // Step 1: Get tenant-specific FeatureIds + List featureIds = await _generalHelper.GetFeatureIdsByTenentIdAsync(tenantId); + if (featureIds == null || !featureIds.Any()) + { + _logger.LogWarning("No features found for tenant: {TenantId}", tenantId); + return Ok(ApiResponse.SuccessResponse(new List(), "No features found.", 200)); + } + _logger.LogDebug("Retrieved {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); + + // Step 2: Query Features with related FeaturePermissions & Module + featureQuery = featureQuery.Where(f => featureIds.Contains(f.Id)); } - _logger.LogDebug("Retrieved {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); - - // Step 2: Query Features with related FeaturePermissions & Module - var features = await _context.Features - .AsNoTracking() // Optimization: Read-only query - .Include(f => f.FeaturePermissions) - .Include(f => f.Module) - .Where(f => featureIds.Contains(f.Id)) - .ToListAsync(); - + var features = await featureQuery + .Include(f => f.FeaturePermissions) + .Include(f => f.Module).ToListAsync(); _logger.LogDebug("Fetched {Count} features from DB for tenant: {TenantId}", features.Count, tenantId); // Step 3: Map features to ViewModels diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index 7284490..93f256f 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -216,43 +216,6 @@ namespace Marco.Pms.Services.Helpers } } - public async Task> GetFeatureIdsByTenentId(Guid tenantId) - { - var tenantSubscription = await _context.TenantSubscriptions.Include(ts => ts.Plan) - .FirstOrDefaultAsync(ts => ts.TenantId == tenantId && ts.Plan != null && !ts.IsCancelled && ts.EndDate.Date < DateTime.UtcNow.Date); - - if (tenantSubscription == null) - { - _logger.LogWarning("Cannot found the tenant subscription for tenant {TenantId}", tenantId); - return new List(); - } - var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); - if (featureDetails == null) - { - _logger.LogWarning("Cannot found the feature details for tenant {TenantId}", tenantId); - return new List(); - } - var featureIds = new List(); - if (featureDetails.Modules!.Attendance!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Attendance.FeatureId); - } - if (featureDetails.Modules.ProjectManagement!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.ProjectManagement.FeatureId); - } - if (featureDetails.Modules.Directory!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Directory.FeatureId); - } - if (featureDetails.Modules.Expense!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Expense.FeatureId); - } - - return featureIds; - } - /// /// Retrieves all enabled feature IDs for a given tenant based on their active subscription. /// @@ -283,6 +246,8 @@ namespace Marco.Pms.Services.Helpers _logger.LogDebug("Active subscription found for tenant: {TenantId}, PlanId: {PlanId}", tenantId, tenantSubscription.Plan!.Id); + var featureIds = new List { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be") }; + // Step 2: Get feature details from Plan var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); @@ -294,7 +259,6 @@ namespace Marco.Pms.Services.Helpers } // Step 3: Collect all enabled feature IDs from modules - var featureIds = new List { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be") }; if (featureDetails.Modules?.Attendance?.Enabled == true) {