From 830a9526dd0ecfbc76fbdb0c41fe0fcdf8661dea Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 15:29:48 +0530 Subject: [PATCH] Added the total page and count in list APis for documnets --- .../Dtos/Util/ProjctLevelPermissionDto.cs | 11 ++++++ .../ProjectLevelPermissionMapping.cs | 28 +++++++++++++++ .../Controllers/DocumentController.cs | 35 ++++++++++++++++--- Marco.Pms.Services/Service/ProjectServices.cs | 32 +++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs create mode 100644 Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs diff --git a/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs new file mode 100644 index 0000000..06a7710 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs @@ -0,0 +1,11 @@ +using Marco.Pms.Model.Dtos.Roles; + +namespace Marco.Pms.Model.Dtos.Util +{ + public class ProjctLevelPermissionDto + { + public Guid EmployeeId { get; set; } + public Guid ProjectId { get; set; } + public FeaturesPermissionDto? Permission { get; set; } + } +} diff --git a/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs b/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs new file mode 100644 index 0000000..e33a740 --- /dev/null +++ b/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs @@ -0,0 +1,28 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Projects; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Entitlements +{ + public class ProjectLevelPermissionMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid EmployeeId { get; set; } + + [ValidateNever] + [ForeignKey("EmployeeId")] + public Employee? Employee { get; set; } + public Guid ProjectId { get; set; } + + [ValidateNever] + [ForeignKey("ProjectId")] + public Project? Project { get; set; } + public Guid PermissionId { get; set; } + + [ValidateNever] + [ForeignKey("PermissionId")] + public FeaturePermission? Permission { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 415cec5..c06e923 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -186,6 +186,9 @@ namespace Marco.Pms.Services.Controllers ); } + var totalCount = await documentQuery.CountAsync(); + var totalPages = totalCount / pageSize; + // Apply pagination & ordering var documents = await documentQuery .OrderByDescending(t => t.UploadedAt) @@ -202,7 +205,7 @@ namespace Marco.Pms.Services.Controllers .ToListAsync(); // Map to ViewModel - var response = documents.Select(doc => + var documentListVMs = documents.Select(doc => { var version = versions.FirstOrDefault(v => v.ChildAttachmentId == doc.Id); var vm = _mapper.Map(doc); @@ -211,7 +214,16 @@ namespace Marco.Pms.Services.Controllers return vm; }).ToList(); - _logger.LogInfo("Fetched {Count} documents for EntityId {EntityId}", response.Count, entityId); + _logger.LogInfo("Fetched {Count} documents for EntityId {EntityId}", documentListVMs.Count, entityId); + + var response = new + { + CurrentFilter = documentFilter, + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalCount, + Data = documentListVMs, + }; return Ok(ApiResponse.SuccessResponse(response, "Document list fetched successfully", 200)); } @@ -404,12 +416,17 @@ namespace Marco.Pms.Services.Controllers } // Retrieve all version mappings linked to the parent attachment and tenant - var versionMappings = await _context.AttachmentVersionMappings + var versionMappingsQuery = _context.AttachmentVersionMappings .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UploadedBy) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UpdatedBy) - .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId) + .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); + + var totalPages = await versionMappingsQuery.CountAsync(); + var totalCount = totalPages / pageSize; + + var versionMappings = await versionMappingsQuery .OrderByDescending(da => da.ChildAttachment!.UploadedAt) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) @@ -428,13 +445,21 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Found {Count} versions for ParentAttachmentId: {ParentAttachmentId}", versionMappings.Count, parentAttachmentId); // Map the retrieved child attachments to view models with version info - var response = versionMappings.Select(versionMapping => + var attachmentVersionVMs = versionMappings.Select(versionMapping => { var documentVM = _mapper.Map(versionMapping.ChildAttachment); documentVM.Version = versionMapping.Version; return documentVM; }).ToList(); + var response = new + { + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalCount, + Data = attachmentVersionVMs, + }; + _logger.LogInfo("Successfully mapped version data for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); return Ok(ApiResponse.SuccessResponse(response, "Document versions fetched successfully", 200)); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 627905c..3f278a0 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -3,6 +3,7 @@ using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Project; +using Marco.Pms.Model.Dtos.Util; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.MongoDBModels.Project; @@ -46,6 +47,7 @@ namespace Marco.Pms.Services.Service _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); _generalHelper = generalHelper ?? throw new ArgumentNullException(nameof(generalHelper)); } + #region =================================================================== Project Get APIs =================================================================== public async Task> GetAllProjectsBasicAsync(Guid tenantId, Employee loggedInEmployee) @@ -1462,6 +1464,36 @@ namespace Marco.Pms.Services.Service Response = ApiResponse.SuccessResponse(new { id = task.Id }, "Task deleted successfully.", 200) }; } + + #endregion + + #region =================================================================== Project-Level Permission APIs =================================================================== + public async Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee) + { + var employeeTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ProjectAllocations.FirstOrDefaultAsync(e => e.Id == model.EmployeeId && e.TenantId == tenantId && e.IsActive); + }); + var projectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); + }); + var featurePermissionsTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + }); + return ApiResponse.SuccessResponse(""); + } + public async Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee) + { + return ApiResponse.SuccessResponse(""); + } + public async Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee) + { + return ApiResponse.SuccessResponse(""); + } #endregion #region =================================================================== Helper Functions ===================================================================