Intregating the project-level permissions in document controller
This commit is contained in:
parent
28caee40e3
commit
d507b9ede2
@ -68,7 +68,16 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
|
||||||
// Check global permission
|
// Check global permission
|
||||||
var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
var hasViewPermission = false;
|
||||||
|
if (ProjectEntity == entityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, entityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == entityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
|
||||||
if (!hasViewPermission && loggedInEmployee.Id != entityId)
|
if (!hasViewPermission && loggedInEmployee.Id != entityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId);
|
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId);
|
||||||
@ -280,7 +289,16 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if the logged in employee has permission to view the document OR is the owner of the attachment entity
|
// Check if the logged in employee has permission to view the document OR is the owner of the attachment entity
|
||||||
var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
var hasViewPermission = false;
|
||||||
|
if (ProjectEntity == versionMapping.ChildAttachment.DocumentType!.DocumentCategory!.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == versionMapping.ChildAttachment.DocumentType!.DocumentCategory!.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
|
||||||
if (!hasViewPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId)
|
if (!hasViewPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}",
|
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}",
|
||||||
@ -422,6 +440,9 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
|
|
||||||
// Retrieve all version mappings linked to the parent attachment and tenant
|
// Retrieve all version mappings linked to the parent attachment and tenant
|
||||||
var versionMappingsQuery = _context.AttachmentVersionMappings
|
var versionMappingsQuery = _context.AttachmentVersionMappings
|
||||||
|
.Include(av => av.ChildAttachment)
|
||||||
|
.ThenInclude(da => da!.DocumentType)
|
||||||
|
.ThenInclude(dt => dt!.DocumentCategory)
|
||||||
.Include(av => av.ChildAttachment)
|
.Include(av => av.ChildAttachment)
|
||||||
.ThenInclude(da => da!.UploadedBy)
|
.ThenInclude(da => da!.UploadedBy)
|
||||||
.ThenInclude(e => e!.JobRole)
|
.ThenInclude(e => e!.JobRole)
|
||||||
@ -445,9 +466,18 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var entityId = versionMappings.Select(av => av.ChildAttachment?.EntityId).FirstOrDefault();
|
var entityId = versionMappings.Select(av => av.ChildAttachment?.EntityId).FirstOrDefault();
|
||||||
|
var entityTypeId = versionMappings.Select(av => av.ChildAttachment?.DocumentType?.DocumentCategory?.EntityTypeId).FirstOrDefault();
|
||||||
|
|
||||||
// Check global permission
|
// Check global permission
|
||||||
var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
var hasViewPermission = false;
|
||||||
|
if (ProjectEntity == entityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, entityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == entityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
if (!hasViewPermission && loggedInEmployee.Id != entityId)
|
if (!hasViewPermission && loggedInEmployee.Id != entityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId ?? Guid.Empty);
|
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId ?? Guid.Empty);
|
||||||
@ -507,6 +537,9 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
// Retrieve version mapping including the child attachment and its document
|
// Retrieve version mapping including the child attachment and its document
|
||||||
.Include(av => av.ChildAttachment)
|
.Include(av => av.ChildAttachment)
|
||||||
.ThenInclude(da => da!.Document)
|
.ThenInclude(da => da!.Document)
|
||||||
|
.Include(av => av.ChildAttachment)
|
||||||
|
.ThenInclude(da => da!.DocumentType)
|
||||||
|
.ThenInclude(dt => dt!.DocumentCategory)
|
||||||
.FirstOrDefaultAsync(av => av.ChildAttachmentId == id);
|
.FirstOrDefaultAsync(av => av.ChildAttachmentId == id);
|
||||||
|
|
||||||
if (versionMapping == null || versionMapping.ChildAttachment == null || versionMapping.ChildAttachment.Document == null)
|
if (versionMapping == null || versionMapping.ChildAttachment == null || versionMapping.ChildAttachment.Document == null)
|
||||||
@ -516,7 +549,16 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
return NotFound(ApiResponse<object>.ErrorResponse("Version not found", "Version not found in database", 404));
|
return NotFound(ApiResponse<object>.ErrorResponse("Version not found", "Version not found in database", 404));
|
||||||
}
|
}
|
||||||
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||||
var hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id);
|
var hasDownloadPermission = false;
|
||||||
|
if (ProjectEntity == versionMapping.ChildAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == versionMapping.ChildAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
|
||||||
if (!hasDownloadPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId)
|
if (!hasDownloadPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId} for downloading",
|
_logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId} for downloading",
|
||||||
@ -597,16 +639,6 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
// Get logged in user
|
// Get logged in user
|
||||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
|
||||||
// Permission check
|
|
||||||
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
|
||||||
var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id);
|
|
||||||
|
|
||||||
if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId);
|
|
||||||
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate Document Type
|
// Validate Document Type
|
||||||
var documentType = await _context.DocumentTypeMasters
|
var documentType = await _context.DocumentTypeMasters
|
||||||
.Include(dt => dt.DocumentCategory)
|
.Include(dt => dt.DocumentCategory)
|
||||||
@ -618,6 +650,24 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
return NotFound(ApiResponse<object>.ErrorResponse("Document Type not found", "Document Type not found in database", 404));
|
return NotFound(ApiResponse<object>.ErrorResponse("Document Type not found", "Document Type not found in database", 404));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Permission check
|
||||||
|
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||||
|
var hasUploadPermission = false;
|
||||||
|
if (ProjectEntity == documentType.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id, model.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == documentType.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId);
|
||||||
|
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403));
|
||||||
|
}
|
||||||
|
|
||||||
// Document ID validation
|
// Document ID validation
|
||||||
if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId))
|
if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId))
|
||||||
{
|
{
|
||||||
@ -817,6 +867,8 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
|
|
||||||
// Fetch active/current document by Id, TenantId, and relevant conditions
|
// Fetch active/current document by Id, TenantId, and relevant conditions
|
||||||
var documentAttachment = await _context.DocumentAttachments
|
var documentAttachment = await _context.DocumentAttachments
|
||||||
|
.Include(da => da.DocumentType)
|
||||||
|
.ThenInclude(dt => dt!.DocumentCategory)
|
||||||
.FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId);
|
.FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId);
|
||||||
|
|
||||||
if (documentAttachment == null)
|
if (documentAttachment == null)
|
||||||
@ -826,9 +878,16 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Permission service: check if employee is authorized to verify documents
|
// Permission service: check if employee is authorized to verify documents
|
||||||
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||||
var hasVerifyPermission = await permissionService.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id);
|
var hasVerifyPermission = false;
|
||||||
|
if (ProjectEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasVerifyPermission = await _permission.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id, documentAttachment.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasVerifyPermission = await _permission.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
if (!hasVerifyPermission)
|
if (!hasVerifyPermission)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access denied for document verification. EmployeeId: {EmployeeId}, DocumentId: {DocumentId}", loggedInEmployee.Id, id);
|
_logger.LogWarning("Access denied for document verification. EmployeeId: {EmployeeId}, DocumentId: {DocumentId}", loggedInEmployee.Id, id);
|
||||||
@ -891,9 +950,6 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
// Get logged-in employee details
|
// Get logged-in employee details
|
||||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
|
||||||
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
|
||||||
var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id);
|
|
||||||
|
|
||||||
// Fetch the existing attachment
|
// Fetch the existing attachment
|
||||||
var oldAttachment = await _context.DocumentAttachments
|
var oldAttachment = await _context.DocumentAttachments
|
||||||
.Include(da => da.DocumentType)
|
.Include(da => da.DocumentType)
|
||||||
@ -906,8 +962,19 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
return NotFound(ApiResponse<object>.ErrorResponse("Attachment not found", "Attachment not found in database", 404));
|
return NotFound(ApiResponse<object>.ErrorResponse("Attachment not found", "Attachment not found in database", 404));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||||
|
var hasUpdatePermission = false;
|
||||||
|
if (ProjectEntity == oldAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasUpdatePermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id, oldAttachment.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == oldAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasUpdatePermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
|
|
||||||
// Permission check: ensure uploader is authorized
|
// Permission check: ensure uploader is authorized
|
||||||
if (!hasUploadPermission && loggedInEmployee.Id != oldAttachment.EntityId)
|
if (!hasUpdatePermission && loggedInEmployee.Id != oldAttachment.EntityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access denied for EmployeeId: {EmployeeId}", loggedInEmployee.Id);
|
_logger.LogWarning("Access denied for EmployeeId: {EmployeeId}", loggedInEmployee.Id);
|
||||||
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403));
|
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403));
|
||||||
@ -950,7 +1017,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
entityExists = await _context.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId);
|
entityExists = await _context.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId);
|
||||||
if (entityExists)
|
if (entityExists)
|
||||||
{
|
{
|
||||||
entityExists = await permissionService.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId);
|
entityExists = await _permission.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1238,6 +1305,8 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
|
|
||||||
// Retrieve the document attachment matching the criteria from the database
|
// Retrieve the document attachment matching the criteria from the database
|
||||||
var documentAttachment = await _context.DocumentAttachments
|
var documentAttachment = await _context.DocumentAttachments
|
||||||
|
.Include(da => da.DocumentType)
|
||||||
|
.ThenInclude(dt => dt!.DocumentCategory)
|
||||||
.FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId && da.IsActive != isActive);
|
.FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId && da.IsActive != isActive);
|
||||||
|
|
||||||
// If the document attachment is not found, log a warning and return 404 Not Found
|
// If the document attachment is not found, log a warning and return 404 Not Found
|
||||||
@ -1249,6 +1318,15 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
|
|
||||||
// Check if the logged in employee has permission to delete OR is the owner of the document attachment
|
// Check if the logged in employee has permission to delete OR is the owner of the document attachment
|
||||||
var hasDeletePermission = await _permission.HasPermission(PermissionsMaster.DeleteDocument, loggedInEmployee.Id);
|
var hasDeletePermission = await _permission.HasPermission(PermissionsMaster.DeleteDocument, loggedInEmployee.Id);
|
||||||
|
var hasViewPermission = false;
|
||||||
|
if (ProjectEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, documentAttachment.EntityId);
|
||||||
|
}
|
||||||
|
else if (EmployeeEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId)
|
||||||
|
{
|
||||||
|
hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id);
|
||||||
|
}
|
||||||
if (!hasDeletePermission && loggedInEmployee.Id != documentAttachment.EntityId)
|
if (!hasDeletePermission && loggedInEmployee.Id != documentAttachment.EntityId)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Access denied for employee ID: {EmployeeId} when attempting to delete document ID: {DocumentId}", loggedInEmployee.Id, id);
|
_logger.LogWarning("Access denied for employee ID: {EmployeeId} when attempting to delete document ID: {DocumentId}", loggedInEmployee.Id, id);
|
||||||
|
@ -1169,7 +1169,6 @@ namespace Marco.Pms.Services.Service
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region =================================================================== Project Infrastructre Manage APIs ===================================================================
|
#region =================================================================== Project Infrastructre Manage APIs ===================================================================
|
||||||
|
Loading…
x
Reference in New Issue
Block a user