From ee4e3f713ede390cd37db575182eba89205e5037 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Sun, 3 Aug 2025 11:33:08 +0530 Subject: [PATCH] added two more end-point for Add Item and SubItem --- Marco.Pms.CacheHelper/SidebarMenu.cs | 82 ++++++++++++++++++ .../Controllers/AppMenuController.cs | 86 ++++++++++++++++++- 2 files changed, 166 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.CacheHelper/SidebarMenu.cs b/Marco.Pms.CacheHelper/SidebarMenu.cs index 8e5403c..c1a3a27 100644 --- a/Marco.Pms.CacheHelper/SidebarMenu.cs +++ b/Marco.Pms.CacheHelper/SidebarMenu.cs @@ -37,6 +37,58 @@ namespace Marco.Pms.CacheHelper return null; } } + + public async Task UpdateMenuSectionAsync(Guid sectionId, MenuSection updatedSection) + { + try + { + var filter = Builders.Filter.Eq(s => s.Id, sectionId); + + var update = Builders.Update + .Set(s => s.Header, updatedSection.Header) + .Set(s => s.Title, updatedSection.Title); + + var result = await _collection.UpdateOneAsync(filter, update); + + if (result.ModifiedCount > 0) + { + return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); + } + + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error updating MenuSection."); + return null; + } + } + + public async Task AddMenuItemAsync(Guid sectionId, MenuItem newItem) + { + try + { + newItem.Id = Guid.NewGuid(); + + var filter = Builders.Filter.Eq(s => s.Id, sectionId); + + var update = Builders.Update.Push(s => s.Items, newItem); + + var result = await _collection.UpdateOneAsync(filter, update); + + if (result.ModifiedCount > 0) + { + return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); + } + + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error adding menu item."); + return null; + } + } public async Task UpdateMenuItemAsync(Guid sectionId, Guid itemId, MenuItem updatedItem) { @@ -70,6 +122,36 @@ namespace Marco.Pms.CacheHelper } } + public async Task AddSubMenuItemAsync(Guid sectionId, Guid itemId, SubMenuItem newSubItem) + { + try + { + newSubItem.Id = Guid.NewGuid(); + + // Match the MenuSection and the specific MenuItem inside it + var filter = Builders.Filter.And( + Builders.Filter.Eq(s => s.Id, sectionId), + Builders.Filter.ElemMatch(s => s.Items, i => i.Id == itemId) + ); + + // Use positional operator `$` to target matched MenuItem and push into its Submenu + var update = Builders.Update.Push("Items.$.Submenu", newSubItem); + + var result = await _collection.UpdateOneAsync(filter, update); + + if (result.ModifiedCount > 0) + { + return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); + } + + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error adding submenu item."); + return null; + } + } public async Task UpdateSubmenuItemAsync(Guid sectionId, Guid itemId, Guid subItemId, SubMenuItem updatedSub) { diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 70591e1..13c5d7d 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -52,7 +52,7 @@ namespace Marco.Pms.Services.Controllers //} - [HttpPost("sidebar/menusection")] + [HttpPost("sidebar/menu-section")] public async Task CreateAppSideBarMenu([FromBody] MenuSectionDto MenuSecetion) { @@ -86,13 +86,66 @@ namespace Marco.Pms.Services.Controllers } + [HttpPut("sidebar/menu-section/{sectionId}")] + public async Task UpdateMenuSection(Guid sectionId,[FromBody] MenuSection updatedSection) + { + if (sectionId == Guid.Empty || updatedSection == null) + { + _logger.LogWarning("Error Occurred while Updating Menu Item"); + return BadRequest(ApiResponse.ErrorResponse("Invalid section ID, item ID, or menu item payload.", 400)); + } + var UpdatedMenuSection = _mapper.Map(updatedSection); + try + { + UpdatedMenuSection = await _sideBarMenuHelper.UpdateMenuSectionAsync(sectionId, UpdatedMenuSection); + + if (UpdatedMenuSection == null) + return NotFound(ApiResponse.ErrorResponse("Menu section not found", 404)); + + return Ok(ApiResponse.SuccessResponse(UpdatedMenuSection, "Menu section updated successfully")); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to update menu section"); + return StatusCode(500, ApiResponse.ErrorResponse("Server error", ex, 500)); + } + } + + [HttpPost("sidebar/menus/{sectionId}/items")] + public async Task AddMenuItem(Guid sectionId, [FromBody] MenuItemDto newItemDto) + { + if (sectionId == Guid.Empty || newItemDto == null) + return BadRequest(ApiResponse.ErrorResponse("Invalid input", 400)); + + try + { + var menuItem = _mapper.Map(newItemDto); + + var result = await _sideBarMenuHelper.AddMenuItemAsync(sectionId, menuItem); + + if (result == null) + return NotFound(ApiResponse.ErrorResponse("Menu section not found", 404)); + + _logger.LogInfo("Added MenuItem in Section: {SectionId}"); + + return Ok(ApiResponse.SuccessResponse(result, "Menu item added successfully")); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while adding MenuItem inside MenuSection: {SectionId}", sectionId); + return StatusCode(500, ApiResponse.ErrorResponse("Server error", ex, 500)); + } + } + + + [HttpPut("sidebar/{sectionId}/items/{itemId}")] public async Task UpdateMenuItem(Guid sectionId, Guid itemId, [FromBody] MenuItemDto updatedMenuItem) { if (sectionId == Guid.Empty || itemId == Guid.Empty || updatedMenuItem == null) { - _logger.LogWarning("Error Occurred while creating Menu"); + _logger.LogWarning("Error Occurred while Updating Menu Item"); return BadRequest(ApiResponse.ErrorResponse("Invalid section ID, item ID, or menu item payload.", 400)); } @@ -122,6 +175,35 @@ namespace Marco.Pms.Services.Controllers } + [HttpPost("sidebar/menus/{sectionId}/items/{itemId}/subitems")] + public async Task AddSubMenuItem(Guid sectionId, Guid itemId, [FromBody] SubMenuItemDto newSubItem) + { + if (sectionId == Guid.Empty || itemId == Guid.Empty || newSubItem == null) + return BadRequest(ApiResponse.ErrorResponse("Invalid input", 400)); + + try + { + var subMenuItem = _mapper.Map(newSubItem); + + var result = await _sideBarMenuHelper.AddSubMenuItemAsync(sectionId, itemId, subMenuItem); + + if (result == null) + { + return NotFound(ApiResponse.ErrorResponse("Menu item not found", 404)); + + } + + _logger.LogInfo("Added SubMenuItem in Section: {SectionId}, MenuItem: {ItemId}"); + return Ok(ApiResponse.SuccessResponse(result, "Submenu item added successfully")); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to add submenu item"); + return StatusCode(500, ApiResponse.ErrorResponse("Server error", ex, 500)); + } + } + + [HttpPut("sidebar/{sectionId}/items/{itemId}/subitems/{subItemId}")] public async Task UpdateSubmenuItem(Guid sectionId,Guid itemId,Guid subItemId,[FromBody] SubMenuItemDto updatedSubMenuItem) {