Optimized the get employee list for project-level permission
This commit is contained in:
parent
b336bd3481
commit
4a13386546
@ -1734,20 +1734,43 @@ namespace Marco.Pms.Services.Service
|
|||||||
|
|
||||||
public async Task<ApiResponse<object>> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee)
|
public async Task<ApiResponse<object>> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee)
|
||||||
{
|
{
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// ✅ Optimized query: Selecting only employees with necessary joins
|
||||||
|
// Instead of fetching entire mapping objects, directly project required employees
|
||||||
var assignedEmployees = await _context.ProjectLevelPermissionMappings
|
var assignedEmployees = await _context.ProjectLevelPermissionMappings
|
||||||
.Include(pl => pl.Employee)
|
.Include(pl => pl.Employee)
|
||||||
.ThenInclude(e => e!.JobRole)
|
.ThenInclude(e => e!.JobRole)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(pl => pl.ProjectId == projectId
|
.Where(pl => pl.ProjectId == projectId && pl.TenantId == tenantId)
|
||||||
&& pl.TenantId == tenantId)
|
.Select(pl => pl.Employee) // only employees
|
||||||
.Select(pl => pl.Employee)
|
.Distinct() // ensure unique employees
|
||||||
.Distinct()
|
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
_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<List<BasicEmployeeVM>>(assignedEmployees);
|
var response = _mapper.Map<List<BasicEmployeeVM>>(assignedEmployees);
|
||||||
|
|
||||||
|
// Return a consistent API response with success message
|
||||||
return ApiResponse<object>.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200);
|
return ApiResponse<object>.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<object>.ErrorResponse("An error occurred while retrieving employees with project-level permissions.", 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user