Added SignalR Integration for Reporting, Commenting, and Approving Tasks #100
@ -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<MarcoHub> _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<MarcoHub> 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<object>.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<object>.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<object>.SuccessResponse("Task has been approved", "Task has been approved", 200));
|
||||
|
Loading…
x
Reference in New Issue
Block a user