Added an API to get list of job tags

This commit is contained in:
ashutosh.nehete 2025-11-13 15:04:21 +05:30
parent a9f1a99e6f
commit 883a65d124
3 changed files with 52 additions and 1 deletions

View File

@ -121,6 +121,15 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(response.StatusCode, response);
}
[HttpGet("job/tag/list")]
public async Task<IActionResult> GetJobTagList()
{
Employee loggedInEmploee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _serviceProject.GetJobTagListAsync(loggedInEmploee, tenantId);
return StatusCode(response.StatusCode, response);
}
[HttpPost("job/create")]
public async Task<IActionResult> CreateJobTicket(CreateJobTicketDto model)
{

View File

@ -18,8 +18,9 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
#region =================================================================== Job Tickets Functions ===================================================================
Task<ApiResponse<object>> GetJobTicketsListAsync(Guid? projectId, int pageNumber, int pageSize, bool isActive, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> GetJobTicketDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> CreateJobTicketAsync(CreateJobTicketDto model, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> GetCommentListByJobTicketAsync(Guid? jobTicketId, int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> GetJobTagListAsync(Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> CreateJobTicketAsync(CreateJobTicketDto model, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> AddCommentToJobTicketAsync(JobCommentDto model, Employee loggedInEmployee, Guid tenantId);
#endregion
}

View File

@ -622,6 +622,7 @@ namespace Marco.Pms.Services.Service
return ApiResponse<object>.ErrorResponse("Internal Server Error", "Failed to retrieve job details. Please try again later.", 500);
}
}
/// <summary>
/// Retrieves a paginated list of comments for a specified job ticket within a tenant context.
/// </summary>
@ -707,6 +708,46 @@ namespace Marco.Pms.Services.Service
}
}
/// <summary>
/// Retrieves all job tags associated with the tenant, ordered alphabetically by name.
/// </summary>
/// <param name="loggedInEmployee">Employee making the request (for audit/logging).</param>
/// <param name="tenantId">Tenant identifier for multi-tenant data scoping.</param>
/// <returns>ApiResponse containing the list of job tag view models or error details.</returns>
public async Task<ApiResponse<object>> GetJobTagListAsync(Employee loggedInEmployee, Guid tenantId)
{
if (tenantId == Guid.Empty)
{
_logger.LogWarning("Attempt to fetch job tags with missing tenant context by employee {EmployeeId}", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Access Denied", "Invalid tenant context.", 403);
}
try
{
_logger.LogInfo("Fetching job tags for tenant {TenantId} requested by employee {EmployeeId}", tenantId, loggedInEmployee.Id);
// Query job tags via JobTagMappings ensuring tenant isolation
var tags = await _context.JobTagMappings
.AsNoTracking()
.Include(jtm => jtm.JobTag)
.Where(jtm => jtm.JobTag != null && jtm.TenantId == tenantId)
.Select(jtm => jtm.JobTag!)
.Distinct() // Avoid duplicates if any tag maps multiple times
.OrderBy(jt => jt.Name)
.ToListAsync();
var response = _mapper.Map<List<TagVM>>(tags);
_logger.LogInfo("{Count} job tags fetched successfully for tenant {TenantId}", response.Count, tenantId);
return ApiResponse<object>.SuccessResponse(response, $"{response.Count} job tag record(s) fetched successfully.", 200);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to fetch job tags for tenant {TenantId} requested by employee {EmployeeId}", tenantId, loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("Internal Server Error", "Failed to retrieve job tags. Please try again later.", 500);
}
}
/// <summary>
/// Creates a new job ticket with optional assignees and tags within a transactional scope.