Added SignalR Integration for Reporting, Commenting, and Approving Tasks
This commit is contained in:
parent
f9ab7bb3c8
commit
6373da3144
@ -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));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user