diff --git a/Marco.Pms.Services/Controllers/TaskController.cs b/Marco.Pms.Services/Controllers/TaskController.cs index 5a35baf..c0ec5ff 100644 --- a/Marco.Pms.Services/Controllers/TaskController.cs +++ b/Marco.Pms.Services/Controllers/TaskController.cs @@ -6,11 +6,13 @@ using Marco.Pms.Model.Mapper; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Services.Hubs; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using Document = Marco.Pms.Model.DocumentManager.Document; @@ -27,16 +29,19 @@ namespace MarcoBMS.Services.Controllers private readonly UserHelper _userHelper; private readonly S3UploadService _s3Service; private readonly ILoggingService _logger; + private readonly IHubContext _signalR; private readonly PermissionServices _permissionServices; private readonly Guid Approve_Task; private readonly Guid Assign_Report_Task; - public TaskController(ApplicationDbContext context, UserHelper userHelper, S3UploadService s3Service, ILoggingService logger, PermissionServices permissionServices) + public TaskController(ApplicationDbContext context, UserHelper userHelper, S3UploadService s3Service, ILoggingService logger, PermissionServices permissionServices, + IHubContext signalR) { _context = context; _userHelper = userHelper; _s3Service = s3Service; _logger = logger; + _signalR = signalR; _permissionServices = permissionServices; Approve_Task = Guid.Parse("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"); Assign_Report_Task = Guid.Parse("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"); @@ -194,17 +199,20 @@ namespace MarcoBMS.Services.Controllers var comment = reportTask.ToCommentFromReportTaskDto(tenantId, loggedInEmployee.Id); _context.TaskComments.Add(comment); + var workAreaId = taskAllocation.WorkItem?.WorkAreaId; + var workArea = await _context.WorkAreas.Include(a => a.Floor) + .FirstOrDefaultAsync(a => a.Id == workAreaId) ?? new WorkArea(); + + var buildingId = workArea.Floor?.BuildingId; + + var building = await _context.Buildings + .FirstOrDefaultAsync(b => b.Id == buildingId); + var batchId = Guid.NewGuid(); + var projectId = building?.ProjectId; + if (reportTask.Images?.Any() == true) { - var workAreaId = taskAllocation.WorkItem?.WorkAreaId; - var workArea = await _context.WorkAreas.Include(a => a.Floor) - .FirstOrDefaultAsync(a => a.Id == workAreaId) ?? new WorkArea(); - var buildingId = workArea.Floor?.BuildingId; - - var building = await _context.Buildings - .FirstOrDefaultAsync(b => b.Id == buildingId); - var batchId = Guid.NewGuid(); foreach (var image in reportTask.Images) { @@ -220,7 +228,7 @@ namespace MarcoBMS.Services.Controllers var fileType = _s3Service.GetContentTypeFromBase64(base64); var fileName = _s3Service.GenerateFileName(fileType, tenantId, "task_report"); - var objectKey = $"tenant-{tenantId}/project-{building?.ProjectId}/Actitvity/{fileName}"; + var objectKey = $"tenant-{tenantId}/project-{projectId}/Actitvity/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); @@ -257,6 +265,9 @@ namespace MarcoBMS.Services.Controllers response.Comments = comments.Select(c => c.ToCommentVMFromTaskComment()).ToList(); response.checkList = checkListVMs; + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Task_Report", ProjectId = projectId }; + await _signalR.Clients.All.SendAsync("NotificationEventHandler", notification); + _logger.LogInfo("Task {TaskId} reported successfully by Employee {EmployeeId}", taskAllocation.Id, loggedInEmployee.Id); return Ok(ApiResponse.SuccessResponse(response, "Task reported successfully", 200)); @@ -288,6 +299,7 @@ namespace MarcoBMS.Services.Controllers var buildingId = workArea.Floor?.BuildingId ?? Guid.Empty; var building = await _context.Buildings.FirstOrDefaultAsync(b => b.Id == buildingId); + var projectId = building?.ProjectId; // Save comment var comment = createComment.ToCommentFromCommentDto(tenantId, loggedInEmployee.Id); @@ -316,7 +328,7 @@ namespace MarcoBMS.Services.Controllers var fileType = _s3Service.GetContentTypeFromBase64(base64); var fileName = _s3Service.GenerateFileName(fileType, tenantId, "task_comment"); - var objectKey = $"tenant-{tenantId}/project-{building?.ProjectId}/Activity/{fileName}"; + var objectKey = $"tenant-{tenantId}/project-{projectId}/Activity/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); _logger.LogInfo("Image uploaded to S3 with key: {ObjectKey}", objectKey); @@ -353,6 +365,9 @@ namespace MarcoBMS.Services.Controllers var response = comment.ToCommentVMFromTaskComment(); _logger.LogInfo("Returning response for commentId: {CommentId}", comment.Id); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Task_Report", ProjectId = projectId }; + await _signalR.Clients.All.SendAsync("NotificationEventHandler", notification); + return Ok(ApiResponse.SuccessResponse(response, "Comment saved successfully", 200)); } @@ -725,18 +740,19 @@ namespace MarcoBMS.Services.Controllers }; _context.TaskComments.Add(comment); + var workAreaId = taskAllocation.WorkItem?.WorkAreaId; + var workArea = await _context.WorkAreas.Include(a => a.Floor) + .FirstOrDefaultAsync(a => a.Id == workAreaId) ?? new WorkArea(); + + var buildingId = workArea.Floor?.BuildingId; + + var building = await _context.Buildings + .FirstOrDefaultAsync(b => b.Id == buildingId); + var projectId = building?.ProjectId; + // Handle image attachments, if any if (approveTask.Images?.Count > 0) { - var workAreaId = taskAllocation.WorkItem?.WorkAreaId; - var workArea = await _context.WorkAreas.Include(a => a.Floor) - .FirstOrDefaultAsync(a => a.Id == workAreaId) ?? new WorkArea(); - - var buildingId = workArea.Floor?.BuildingId; - - var building = await _context.Buildings - .FirstOrDefaultAsync(b => b.Id == buildingId); - var batchId = Guid.NewGuid(); foreach (var image in approveTask.Images) @@ -751,7 +767,7 @@ namespace MarcoBMS.Services.Controllers var fileType = _s3Service.GetContentTypeFromBase64(base64); var fileName = _s3Service.GenerateFileName(fileType, tenantId, "task_comment"); - var objectKey = $"tenant-{tenantId}/project-{building?.ProjectId}/Activity/{fileName}"; + var objectKey = $"tenant-{tenantId}/project-{projectId}/Activity/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); @@ -785,6 +801,9 @@ namespace MarcoBMS.Services.Controllers // Commit all changes to the database await _context.SaveChangesAsync(); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Task_Report", ProjectId = projectId }; + await _signalR.Clients.All.SendAsync("NotificationEventHandler", notification); + _logger.LogInfo("Task {TaskId} successfully approved by Employee {EmployeeId}", approveTask.Id, loggedInEmployee.Id); return Ok(ApiResponse.SuccessResponse("Task has been approved", "Task has been approved", 200));