Added the pagenantion in employee search API
This commit is contained in:
parent
d74e64d1dc
commit
c84ea987c5
@ -191,24 +191,89 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
var response = await employeeQuery.Take(10).Select(e => _mapper.Map<BasicEmployeeVM>(e)).ToListAsync();
|
var response = await employeeQuery.Take(10).Select(e => _mapper.Map<BasicEmployeeVM>(e)).ToListAsync();
|
||||||
return Ok(ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200));
|
return Ok(ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200));
|
||||||
}
|
}
|
||||||
[HttpGet]
|
|
||||||
[Route("search/{name}/{projectid?}")]
|
/// <summary>
|
||||||
public async Task<IActionResult> SearchEmployee(string name, Guid? projectid)
|
/// Retrieves a paginated list of employees assigned to a specified project (if provided),
|
||||||
|
/// with optional search functionality.
|
||||||
|
/// Ensures that the logged-in user has necessary permissions before accessing project employees.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="projectId">Optional project identifier to filter employees by project.</param>
|
||||||
|
/// <param name="searchString">Optional search string to filter employees by name.</param>
|
||||||
|
/// <param name="pageNumber">Page number for pagination (default = 1).</param>
|
||||||
|
/// <returns>Paginated list of employees in BasicEmployeeVM format wrapped in ApiResponse.</returns>
|
||||||
|
|
||||||
|
[HttpGet("search")]
|
||||||
|
public async Task<IActionResult> GetEmployeesByProjectBasic(Guid? projectId, [FromQuery] string? searchString, [FromQuery] int pageNumber = 1)
|
||||||
{
|
{
|
||||||
if (!ModelState.IsValid)
|
const int pageSize = 10; // Fixed page size for pagination
|
||||||
|
|
||||||
|
// Log API entry with context
|
||||||
|
_logger.LogInfo("Fetching employees. ProjectId: {ProjectId}, SearchString: {SearchString}, PageNumber: {PageNumber}",
|
||||||
|
projectId ?? Guid.Empty, searchString ?? "", pageNumber);
|
||||||
|
|
||||||
|
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
_logger.LogDebug("Logged-in EmployeeId: {EmployeeId}", loggedInEmployee.Id);
|
||||||
|
|
||||||
|
// Initialize query scoped by tenant
|
||||||
|
var employeeQuery = _context.Employees.Where(e => e.TenantId == tenantId);
|
||||||
|
|
||||||
|
// Filter by project if projectId is supplied
|
||||||
|
if (projectId.HasValue && projectId.Value != Guid.Empty)
|
||||||
{
|
{
|
||||||
var errors = ModelState.Values
|
_logger.LogDebug("Project filter applied. Checking permission for EmployeeId: {EmployeeId} on ProjectId: {ProjectId}",
|
||||||
.SelectMany(v => v.Errors)
|
loggedInEmployee.Id, projectId);
|
||||||
.Select(e => e.ErrorMessage)
|
|
||||||
.ToList();
|
|
||||||
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid data", errors, 400));
|
|
||||||
|
|
||||||
|
// Validate project access permission
|
||||||
|
var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value);
|
||||||
|
if (!hasProjectPermission)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have permission for ProjectId: {ProjectId}",
|
||||||
|
loggedInEmployee.Id, projectId);
|
||||||
|
|
||||||
|
return StatusCode(403, ApiResponse<object>.ErrorResponse(
|
||||||
|
"Access denied",
|
||||||
|
"User does not have access to view employees for this project",
|
||||||
|
403));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Employees allocated to the project
|
||||||
|
var employeeIds = await _context.ProjectAllocations
|
||||||
|
.Where(pa => pa.ProjectId == projectId && pa.IsActive && pa.TenantId == tenantId)
|
||||||
|
.Select(pa => pa.EmployeeId)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
_logger.LogDebug("Project employees retrieved. Total linked employees found: {Count}", employeeIds.Count);
|
||||||
|
|
||||||
|
// Apply project allocation filter
|
||||||
|
employeeQuery = employeeQuery.Where(e => employeeIds.Contains(e.Id));
|
||||||
}
|
}
|
||||||
var result = await _employeeHelper.SearchEmployeeByProjectId(GetTenantId(), name.ToLower(), projectid);
|
|
||||||
|
|
||||||
return Ok(ApiResponse<object>.SuccessResponse(result, "Filter applied.", 200));
|
// Apply search filter if provided
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchString))
|
||||||
|
{
|
||||||
|
var searchStringLower = searchString.ToLower();
|
||||||
|
_logger.LogDebug("Search filter applied. Search term: {SearchTerm}", searchStringLower);
|
||||||
|
|
||||||
|
employeeQuery = employeeQuery.Where(e =>
|
||||||
|
(e.FirstName + " " + e.LastName).ToLower().Contains(searchStringLower));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pagination and Projection (executed in DB)
|
||||||
|
var employees = await employeeQuery
|
||||||
|
.Skip((pageNumber - 1) * pageSize)
|
||||||
|
.Take(pageSize)
|
||||||
|
.Select(e => _mapper.Map<BasicEmployeeVM>(e))
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
_logger.LogInfo("Employees fetched successfully. Records returned: {Count}", employees.Count);
|
||||||
|
|
||||||
|
return Ok(ApiResponse<object>.SuccessResponse(
|
||||||
|
employees,
|
||||||
|
$"{employees.Count} employee records fetched successfully",
|
||||||
|
200));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("profile/get/{employeeId}")]
|
[Route("profile/get/{employeeId}")]
|
||||||
public async Task<IActionResult> GetEmployeeProfileById(Guid employeeId)
|
public async Task<IActionResult> GetEmployeeProfileById(Guid employeeId)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user