Merge pull request 'Added SignalR Integration for Reporting, Commenting, and Approving Tasks' (#100) from Ashutosh_Task#663 into Image_Gallery

Reviewed-on: #100
This commit is contained in:
ashutosh.nehete 2025-07-05 11:44:00 +00:00
commit e4cc6c1578

View File

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