From 03f7a5ba14de767c0262848e81ab81d96fef47fa Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 26 Aug 2025 15:17:00 +0530 Subject: [PATCH] Added new get menu list for mobile --- .../ViewModels/DocumentManager/MenuItemVM.cs | 13 ++ .../MenuSectionApplicationVM.cs | 9 ++ .../DocumentManager/MenuSectionVM.cs | 11 ++ .../DocumentManager/SubMenuItemVM.cs | 12 ++ .../Controllers/AppMenuController.cs | 119 +++++++++++++++++- .../MappingProfiles/MappingProfile.cs | 12 ++ 6 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionApplicationVM.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs new file mode 100644 index 0000000..5925fe0 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs @@ -0,0 +1,13 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class MenuItemVM + { + public Guid Id { get; set; } + + public string? Name { get; set; } + public string? Icon { get; set; } + public bool Available { get; set; } + public string? Link { get; set; } + public List Submenu { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionApplicationVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionApplicationVM.cs new file mode 100644 index 0000000..3132e19 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionApplicationVM.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class MenuSectionApplicationVM + { + public Guid Id { get; set; } + public string? Name { get; set; } + public bool Available { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs new file mode 100644 index 0000000..cae8e50 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class MenuSectionVM + { + public Guid Id { get; set; } + + public string? Header { get; set; } + public string? Name { get; set; } + public List Items { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs new file mode 100644 index 0000000..ef14686 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class SubMenuItemVM + { + public Guid Id { get; set; } + + public string? Name { get; set; } + public bool Available { get; set; } + + public string? Link { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 569a87d..6681eeb 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -4,6 +4,7 @@ using Marco.Pms.Model.AppMenu; using Marco.Pms.Model.Dtos.AppMenu; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.AppMenu; +using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; @@ -518,7 +519,8 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Fetched sidebar menu successfully. Tenant: {TenantId}, EmployeeId: {EmployeeId}, SectionsReturned: {Count}", tenantId, employeeId, menus.Count); - return Ok(ApiResponse.SuccessResponse(menus, "Sidebar menu fetched successfully")); + var response = _mapper.Map>(menus); + return Ok(ApiResponse.SuccessResponse(response, "Sidebar menu fetched successfully")); } catch (Exception ex) { @@ -612,6 +614,121 @@ namespace Marco.Pms.Services.Controllers } } + [HttpGet("get/menu-mobile")] + public async Task GetAppSideBarMenuForobile() + { + // Step 1: Get logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var employeeId = loggedInEmployee.Id; + + using var scope = _serviceScopeFactory.CreateScope(); + var _permissions = scope.ServiceProvider.GetRequiredService(); + + try + { + // Step 2: Fetch all menu sections for the tenant + var menus = await _sideBarMenuHelper.GetAllMenuSectionsAsync(tenantId); + List response = new List(); + + foreach (var menu in menus) + { + var allowedItems = new List(); + + foreach (var item in menu.Items) + { + // --- Item permission check --- + if (!item.PermissionIds.Any()) + { + MenuSectionApplicationVM menuVM = new MenuSectionApplicationVM + { + Id = item.Id, + Name = item.Text, + Available = true + }; + response.Add(menuVM); + } + else + { + // Convert permission string IDs to GUIDs + var menuPermissionIds = item.PermissionIds + .Select(Guid.Parse) + .ToList(); + + bool isAllowed = await _permissions.HasPermissionAny(menuPermissionIds, employeeId); + + // If allowed, filter its submenus as well + if (isAllowed) + { + if (item.Submenu?.Any() == true) + { + var allowedSubmenus = new List(); + + foreach (var subItem in item.Submenu) + { + if (!subItem.PermissionIds.Any()) + { + MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM + { + Id = item.Id, + Name = item.Text, + Available = true + }; + response.Add(subMenuVM); + continue; + } + + var subMenuPermissionIds = subItem.PermissionIds + .Select(Guid.Parse) + .ToList(); + + bool isSubItemAllowed = await _permissions.HasPermissionAny(subMenuPermissionIds, employeeId); + + if (isSubItemAllowed) + { + MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM + { + Id = item.Id, + Name = item.Text, + Available = true + }; + response.Add(subMenuVM); + } + } + + // Replace with filtered submenus + item.Submenu = allowedSubmenus; + } + + MenuSectionApplicationVM menuVM = new MenuSectionApplicationVM + { + Id = item.Id, + Name = item.Text, + Available = true + }; + response.Add(menuVM); + } + } + } + + // Replace with filtered items + menu.Items = allowedItems; + } + + // Step 3: Log success + _logger.LogInfo("Fetched sidebar menu successfully. Tenant: {TenantId}, EmployeeId: {EmployeeId}, SectionsReturned: {Count}", + tenantId, employeeId, menus.Count); + + return Ok(ApiResponse.SuccessResponse(response, "Sidebar menu fetched successfully", 200)); + } + catch (Exception ex) + { + // Step 4: Handle unexpected errors + _logger.LogError(ex, "Error occurred while fetching sidebar menu. Tenant: {TenantId}, EmployeeId: {EmployeeId}", + tenantId, employeeId); + + return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while fetching the sidebar menu.", 500)); + } + } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 76abb2f..1c516e1 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -311,12 +311,24 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= AppMenu ======================================================= CreateMap(); CreateMap(); + CreateMap() + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.Title)); CreateMap(); CreateMap(); + CreateMap() + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.Text)); CreateMap(); CreateMap(); + CreateMap() + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.Text)); #endregion } }