From 4a13386546c64108de869e5c17d268e9ddbcdb59 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 12:27:48 +0530 Subject: [PATCH] Optimized the get employee list for project-level permission --- Marco.Pms.Services/Service/ProjectServices.cs | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index ad7bd1a..958f5d3 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1734,21 +1734,44 @@ namespace Marco.Pms.Services.Service public async Task> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee) { - var assignedEmployees = await _context.ProjectLevelPermissionMappings - .Include(pl => pl.Employee) - .ThenInclude(e => e!.JobRole) - .AsNoTracking() - .Where(pl => pl.ProjectId == projectId - && pl.TenantId == tenantId) - .Select(pl => pl.Employee) - .Distinct() - .ToListAsync(); + // Log method entry and parameters for traceability + _logger.LogInfo("Fetching employees with project-level permissions. ProjectId: {ProjectId}, TenantId: {TenantId}, RequestedBy: {EmployeeId}", + projectId, tenantId, loggedInEmployee.Id); - var response = _mapper.Map>(assignedEmployees); + try + { + // ✅ Optimized query: Selecting only employees with necessary joins + // Instead of fetching entire mapping objects, directly project required employees + var assignedEmployees = await _context.ProjectLevelPermissionMappings + .Include(pl => pl.Employee) + .ThenInclude(e => e!.JobRole) + .AsNoTracking() + .Where(pl => pl.ProjectId == projectId && pl.TenantId == tenantId) + .Select(pl => pl.Employee) // only employees + .Distinct() // ensure unique employees + .ToListAsync(); - return ApiResponse.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200); + _logger.LogInfo("Retrieved {Count} employees with project-level permissions for ProjectId: {ProjectId}, TenantId: {TenantId}", + assignedEmployees.Count, projectId, tenantId); + + // ✅ Use AutoMapper to transform DB entities into VMs + var response = _mapper.Map>(assignedEmployees); + + // Return a consistent API response with success message + return ApiResponse.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200); + } + catch (Exception ex) + { + // Log exception details for debugging + _logger.LogError(ex, "Error occurred while fetching employees for ProjectId: {ProjectId}, TenantId: {TenantId}, RequestedBy: {EmployeeId}", + projectId, tenantId, loggedInEmployee.Id); + + // Return standard error response + return ApiResponse.ErrorResponse("An error occurred while retrieving employees with project-level permissions.", 500); + } } + #endregion #region =================================================================== Helper Functions ===================================================================