From 162d735d16adb769d3f8eb6d1746f8075e85c6c8 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 24 Sep 2025 19:20:21 +0530 Subject: [PATCH] Added new API to get employee list --- .../Controllers/EmployeeController.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index f08c44c..5448e16 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -120,6 +120,46 @@ namespace MarcoBMS.Services.Controllers } } + [HttpGet("list/project/{projectId}")] + public async Task GetEmployeesByProjectAsync(Guid projectId, [FromQuery] string searchString) + { + try + { + // Get the currently logged-in employee information + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Check if the logged-in employee has permission for the requested project + var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + if (!hasProjectPermission) + { + _logger.LogWarning("User {EmployeeId} attempts to get employees for project {ProjectId} without permission", loggedInEmployee.Id, projectId); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have access to view the employees for this project", 403)); + } + + // Fetch employees allocated to the project matching the search criteria + var employees = await _context.ProjectAllocations + .AsNoTracking() // Improves performance by disabling change tracking for read-only query + .Include(pa => pa.Employee) + .ThenInclude(e => e!.JobRole) + .Where(pa => pa.ProjectId == projectId && pa.Employee != null && + (pa.Employee.FirstName + " " + pa.Employee.LastName).Contains(searchString)) + .Select(pa => pa.Employee!) + .ToListAsync(); + + _logger.LogInfo("Employees fetched for project {ProjectId} by user {EmployeeId}. Count: {Count}", projectId, loggedInEmployee.Id, employees.Count); + + // Return the employee list wrapped in a successful API response + return Ok(ApiResponse.SuccessResponse(employees, "Employee list fetched successfully", 200)); + } + catch (Exception ex) + { + // Log the exception and return a 500 status code with error message + _logger.LogError(ex, "Error occurred while fetching employees for project {ProjectId}", projectId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal server error", "An unexpected error occurred", 500)); + } + } + + [HttpGet("list/{projectId?}")] public async Task GetEmployeesByProjectAsync(Guid? projectId, [FromQuery] bool showInactive = false) {