Added filter in get image list API
This commit is contained in:
parent
1f5a71ef09
commit
62eb914456
14
Marco.Pms.Model/Utilities/ImageFilter.cs
Normal file
14
Marco.Pms.Model/Utilities/ImageFilter.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace Marco.Pms.Model.Utilities
|
||||||
|
{
|
||||||
|
public class ImageFilter
|
||||||
|
{
|
||||||
|
public List<Guid>? BuildingIds { get; set; }
|
||||||
|
public List<Guid>? FloorIds { get; set; }
|
||||||
|
public List<Guid>? WorkAreaIds { get; set; }
|
||||||
|
public List<Guid>? WorkCategoryIds { get; set; }
|
||||||
|
public List<Guid>? ActivityIds { get; set; }
|
||||||
|
public List<Guid>? UploadedByIds { get; set; }
|
||||||
|
public DateTime? StartDate { get; set; }
|
||||||
|
public DateTime? EndDate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
using Marco.Pms.DataAccess.Data;
|
using System.Text.Json;
|
||||||
|
using Marco.Pms.DataAccess.Data;
|
||||||
using Marco.Pms.Model.Activities;
|
using Marco.Pms.Model.Activities;
|
||||||
using Marco.Pms.Model.Employees;
|
using Marco.Pms.Model.Employees;
|
||||||
using Marco.Pms.Model.Mapper;
|
using Marco.Pms.Model.Mapper;
|
||||||
@ -35,9 +36,10 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("images/{projectId}")]
|
[HttpGet("images/{projectId}")]
|
||||||
public async Task<IActionResult> GetImageList(Guid projectId)
|
|
||||||
|
public async Task<IActionResult> GetImageList(Guid projectId, [FromQuery] string? filter)
|
||||||
{
|
{
|
||||||
_logger.LogInfo("GetImageList called for ProjectId: {ProjectId}", projectId);
|
_logger.LogInfo("[GetImageList] Called by Employee for ProjectId: {ProjectId}", projectId);
|
||||||
|
|
||||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
|
||||||
@ -45,103 +47,142 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
var isProjectExist = await _context.Projects.AnyAsync(p => p.Id == projectId && p.TenantId == tenantId);
|
var isProjectExist = await _context.Projects.AnyAsync(p => p.Id == projectId && p.TenantId == tenantId);
|
||||||
if (!isProjectExist)
|
if (!isProjectExist)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Project not found for ProjectId: {ProjectId}", projectId);
|
_logger.LogWarning("[GetImageList] ProjectId: {ProjectId} not found", projectId);
|
||||||
return BadRequest(ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 400));
|
return BadRequest(ApiResponse<object>.ErrorResponse("Project not found", "Project not found in database", 400));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Check permission
|
// Step 2: Check project access permission
|
||||||
var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.ToString());
|
var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.ToString());
|
||||||
if (!hasPermission)
|
if (!hasPermission)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("No access to ProjectId: {ProjectId} for EmployeeId: {EmployeeId}", projectId, loggedInEmployee.Id);
|
_logger.LogWarning("[GetImageList] Access denied for EmployeeId: {EmployeeId} on ProjectId: {ProjectId}", loggedInEmployee.Id, projectId);
|
||||||
return StatusCode(403, ApiResponse<object>.ErrorResponse("You don't have access", "You don't have access", 403));
|
return StatusCode(403, ApiResponse<object>.ErrorResponse("You don't have access", "You don't have access", 403));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Step 3: Deserialize filter
|
||||||
|
ImageFilter? imageFilter = null;
|
||||||
|
if (!string.IsNullOrWhiteSpace(filter))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
||||||
|
string unescapedJsonString = JsonSerializer.Deserialize<string>(filter, options) ?? "";
|
||||||
|
imageFilter = JsonSerializer.Deserialize<ImageFilter>(unescapedJsonString, options);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("[GetImageList] Failed to parse filter: {Message}", ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4: Extract filter values
|
||||||
|
var buildingIds = imageFilter?.BuildingIds;
|
||||||
|
var floorIds = imageFilter?.FloorIds;
|
||||||
|
var workAreaIds = imageFilter?.WorkAreaIds;
|
||||||
|
var activityIds = imageFilter?.ActivityIds;
|
||||||
|
var workCategoryIds = imageFilter?.WorkCategoryIds;
|
||||||
|
var startDate = imageFilter?.StartDate;
|
||||||
|
var endDate = imageFilter?.EndDate;
|
||||||
|
var uploadedByIds = imageFilter?.UploadedByIds;
|
||||||
|
|
||||||
|
// Step 5: Fetch building > floor > area > work item hierarchy
|
||||||
// Step 3: Fetch building > floor > work area > work item hierarchy
|
// Step 3: Fetch building > floor > work area > work item hierarchy
|
||||||
var buildings = await _context.Buildings
|
List<Building>? buildings = null;
|
||||||
|
List<Floor>? floors = null;
|
||||||
|
List<WorkArea>? workAreas = null;
|
||||||
|
//List<WorkItem>? workItems = null;
|
||||||
|
//List<Document>? documents = null;
|
||||||
|
|
||||||
|
if (buildingIds != null && buildingIds.Count > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
buildings = await _context.Buildings
|
||||||
|
.Where(b => b.ProjectId == projectId && buildingIds.Contains(b.Id))
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buildings = await _context.Buildings
|
||||||
.Where(b => b.ProjectId == projectId)
|
.Where(b => b.ProjectId == projectId)
|
||||||
.Select(b => new { b.Id, b.Name })
|
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var buildingIds = buildings.Select(b => b.Id).ToList();
|
buildingIds = buildings.Select(b => b.Id).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
var floors = await _context.Floor
|
if (floorIds != null && floorIds.Count > 0)
|
||||||
|
{
|
||||||
|
floors = await _context.Floor
|
||||||
|
.Where(f => buildingIds.Contains(f.BuildingId) && floorIds.Contains(f.Id))
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
floors = await _context.Floor
|
||||||
.Where(f => buildingIds.Contains(f.BuildingId))
|
.Where(f => buildingIds.Contains(f.BuildingId))
|
||||||
.Select(f => new { f.Id, f.BuildingId, f.FloorName })
|
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var floorIds = floors.Select(f => f.Id).ToList();
|
floorIds = floors.Select(f => f.Id).ToList();
|
||||||
|
}
|
||||||
var workAreas = await _context.WorkAreas
|
if (workAreaIds != null && workAreaIds.Count > 0)
|
||||||
|
{
|
||||||
|
workAreas = await _context.WorkAreas
|
||||||
|
.Where(wa => floorIds.Contains(wa.FloorId) && workAreaIds.Contains(wa.Id))
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
workAreas = await _context.WorkAreas
|
||||||
.Where(wa => floorIds.Contains(wa.FloorId))
|
.Where(wa => floorIds.Contains(wa.FloorId))
|
||||||
.Select(wa => new { wa.Id, wa.FloorId, wa.AreaName })
|
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var workAreaIds = workAreas.Select(wa => wa.Id).ToList();
|
workAreaIds = workAreas.Select(wa => wa.Id).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
var workItems = await _context.WorkItems
|
var workItemsQuery = _context.WorkItems.Include(w => w.ActivityMaster).Include(w => w.WorkCategoryMaster)
|
||||||
.Include(wi => wi.ActivityMaster)
|
.Where(wi => workAreaIds.Contains(wi.WorkAreaId));
|
||||||
.Include(wi => wi.WorkCategoryMaster)
|
if (activityIds?.Any() == true) workItemsQuery = workItemsQuery.Where(wi => activityIds.Contains(wi.ActivityId));
|
||||||
.Where(wi => workAreaIds.Contains(wi.WorkAreaId))
|
|
||||||
.Select(wi => new { wi.Id, wi.WorkAreaId, wi.ActivityMaster, wi.WorkCategoryMaster })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
|
if (workCategoryIds?.Any() == true)
|
||||||
|
{
|
||||||
|
workItemsQuery = workItemsQuery.Where(wi => wi.WorkCategoryMaster != null && workCategoryIds.Contains(wi.WorkCategoryMaster.Id));
|
||||||
|
}
|
||||||
|
var workItems = await workItemsQuery.ToListAsync();
|
||||||
var workItemIds = workItems.Select(wi => wi.Id).ToList();
|
var workItemIds = workItems.Select(wi => wi.Id).ToList();
|
||||||
|
|
||||||
// Step 4: Fetch task and comment data
|
// Step 6: Fetch task allocations and comments
|
||||||
var tasks = await _context.TaskAllocations
|
var tasks = await _context.TaskAllocations.Include(t => t.ReportedBy)
|
||||||
.Include(t => t.ReportedBy)
|
.Where(t => workItemIds.Contains(t.WorkItemId)).ToListAsync();
|
||||||
.Where(t => workItemIds.Contains(t.WorkItemId))
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var taskIds = tasks.Select(t => t.Id).ToList();
|
var taskIds = tasks.Select(t => t.Id).ToList();
|
||||||
|
|
||||||
var comments = await _context.TaskComments
|
var comments = await _context.TaskComments.Include(c => c.Employee)
|
||||||
.Include(c => c.Employee)
|
.Where(c => taskIds.Contains(c.TaskAllocationId)).ToListAsync();
|
||||||
.Where(c => taskIds.Contains(c.TaskAllocationId))
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var commentIds = comments.Select(c => c.Id).ToList();
|
var commentIds = comments.Select(c => c.Id).ToList();
|
||||||
|
|
||||||
// Step 5: Fetch attachments and related documents
|
|
||||||
var attachments = await _context.TaskAttachments
|
var attachments = await _context.TaskAttachments
|
||||||
.Where(ta => taskIds.Contains(ta.ReferenceId) || commentIds.Contains(ta.ReferenceId))
|
.Where(ta => taskIds.Contains(ta.ReferenceId) || commentIds.Contains(ta.ReferenceId)).ToListAsync();
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var documentIds = attachments.Select(ta => ta.DocumentId).ToList();
|
var documentIds = attachments.Select(ta => ta.DocumentId).ToList();
|
||||||
|
|
||||||
var documents = await _context.Documents
|
// Step 7: Fetch and filter documents
|
||||||
.Include(d => d.UploadedBy)
|
var docQuery = _context.Documents.Include(d => d.UploadedBy)
|
||||||
.Where(d => documentIds.Contains(d.Id))
|
.Where(d => documentIds.Contains(d.Id) && d.TenantId == tenantId);
|
||||||
.ToListAsync();
|
if (startDate != null && endDate != null)
|
||||||
|
|
||||||
// Step 6: Prepare view models
|
|
||||||
var documentVM = documents
|
|
||||||
.Select(d =>
|
|
||||||
{
|
{
|
||||||
var referenceId = attachments
|
docQuery = docQuery.Where(d => d.UploadedAt.Date >= startDate.Value.Date && d.UploadedAt.Date <= endDate.Value.Date);
|
||||||
.Where(ta => ta.DocumentId == d.Id)
|
|
||||||
.Select(ta => ta.ReferenceId)
|
|
||||||
.FirstOrDefault();
|
|
||||||
|
|
||||||
var task = tasks.FirstOrDefault(t => t.Id == referenceId);
|
|
||||||
var comment = comments.FirstOrDefault(c => c.Id == referenceId);
|
|
||||||
|
|
||||||
string source = "";
|
|
||||||
Employee? uploadedBy = null;
|
|
||||||
if (task != null)
|
|
||||||
{
|
|
||||||
uploadedBy = task.ReportedBy;
|
|
||||||
source = "Report";
|
|
||||||
}
|
|
||||||
else if (comment != null)
|
|
||||||
{
|
|
||||||
task = tasks.FirstOrDefault(t => t.Id == comment.TaskAllocationId);
|
|
||||||
uploadedBy = comment.Employee;
|
|
||||||
source = "Comment";
|
|
||||||
}
|
}
|
||||||
|
var documents = await docQuery.ToListAsync();
|
||||||
|
|
||||||
var workItem = workItems.FirstOrDefault(wi => wi.Id == task?.WorkItemId);
|
// Step 8: Build response
|
||||||
|
var documentVM = documents.Select(d =>
|
||||||
|
{
|
||||||
|
var refId = attachments.FirstOrDefault(ta => ta.DocumentId == d.Id)?.ReferenceId;
|
||||||
|
var task = tasks.FirstOrDefault(t => t.Id == refId);
|
||||||
|
var comment = comments.FirstOrDefault(c => c.Id == refId);
|
||||||
|
|
||||||
|
var source = task != null ? "Report" : comment != null ? "Comment" : "";
|
||||||
|
var uploadedBy = task?.ReportedBy ?? comment?.Employee;
|
||||||
|
|
||||||
|
var workItem = workItems.FirstOrDefault(w => w.Id == task?.WorkItemId);
|
||||||
var workArea = workAreas.FirstOrDefault(wa => wa.Id == workItem?.WorkAreaId);
|
var workArea = workAreas.FirstOrDefault(wa => wa.Id == workItem?.WorkAreaId);
|
||||||
var floor = floors.FirstOrDefault(f => f.Id == workArea?.FloorId);
|
var floor = floors.FirstOrDefault(f => f.Id == workArea?.FloorId);
|
||||||
var building = buildings.FirstOrDefault(b => b.Id == floor?.BuildingId);
|
var building = buildings.FirstOrDefault(b => b.Id == floor?.BuildingId);
|
||||||
@ -163,6 +204,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
WorkAreaId = workArea?.Id,
|
WorkAreaId = workArea?.Id,
|
||||||
WorkAreaName = workArea?.AreaName,
|
WorkAreaName = workArea?.AreaName,
|
||||||
TaskId = task?.Id,
|
TaskId = task?.Id,
|
||||||
|
ActivityId = workItem?.ActivityMaster?.Id,
|
||||||
ActivityName = workItem?.ActivityMaster?.ActivityName,
|
ActivityName = workItem?.ActivityMaster?.ActivityName,
|
||||||
WorkCategoryId = workItem?.WorkCategoryMaster?.Id,
|
WorkCategoryId = workItem?.WorkCategoryMaster?.Id,
|
||||||
WorkCategoryName = workItem?.WorkCategoryMaster?.Name,
|
WorkCategoryName = workItem?.WorkCategoryMaster?.Name,
|
||||||
@ -171,7 +213,12 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
};
|
};
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
_logger.LogInfo("Image list fetched for ProjectId: {ProjectId}. Total documents: {Count}", projectId, documentVM.Count);
|
if (uploadedByIds?.Any() == true)
|
||||||
|
{
|
||||||
|
documentVM = documentVM.Where(d => uploadedByIds.Contains(d.UploadedBy?.Id ?? Guid.Empty)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInfo("[GetImageList] Fetched {Count} documents for ProjectId: {ProjectId}", documentVM.Count, projectId);
|
||||||
return Ok(ApiResponse<object>.SuccessResponse(documentVM, $"{documentVM.Count} image records fetched successfully", 200));
|
return Ok(ApiResponse<object>.SuccessResponse(documentVM, $"{documentVM.Count} image records fetched successfully", 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,6 +316,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
WorkAreaId = workArea?.Id,
|
WorkAreaId = workArea?.Id,
|
||||||
WorkAreaName = workArea?.AreaName,
|
WorkAreaName = workArea?.AreaName,
|
||||||
TaskId = task?.Id,
|
TaskId = task?.Id,
|
||||||
|
ActivityId = workItem?.ActivityMaster?.Id,
|
||||||
ActivityName = workItem?.ActivityMaster?.ActivityName,
|
ActivityName = workItem?.ActivityMaster?.ActivityName,
|
||||||
WorkCategoryId = workItem?.WorkCategoryMaster?.Id,
|
WorkCategoryId = workItem?.WorkCategoryMaster?.Id,
|
||||||
WorkCategoryName = workItem?.WorkCategoryMaster?.Name,
|
WorkCategoryName = workItem?.WorkCategoryMaster?.Name,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user