Compare commits

..

No commits in common. "ee4e3f713ede390cd37db575182eba89205e5037" and "cc5badeb0f0813e9c84258bc06eb77e40a117c48" have entirely different histories.

2 changed files with 16 additions and 318 deletions

View File

@ -1,14 +1,14 @@
using Marco.Pms.Model.AppMenu;

using Marco.Pms.Model.AppMenu;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Marco.Pms.CacheHelper
{
public class SideBarMenu
{
private readonly IMongoCollection<MenuSection> _collection;
@ -31,170 +31,15 @@ namespace Marco.Pms.CacheHelper
await _collection.InsertOneAsync(section);
return section;
}
catch (Exception ex)
catch(Exception ex)
{
_logger.LogError(ex, "Error occurred while adding MenuSection.");
return null;
}
}
public async Task<MenuSection?> UpdateMenuSectionAsync(Guid sectionId, MenuSection updatedSection)
{
try
{
var filter = Builders<MenuSection>.Filter.Eq(s => s.Id, sectionId);
var update = Builders<MenuSection>.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<MenuSection?> AddMenuItemAsync(Guid sectionId, MenuItem newItem)
{
try
{
newItem.Id = Guid.NewGuid();
var filter = Builders<MenuSection>.Filter.Eq(s => s.Id, sectionId);
var update = Builders<MenuSection>.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<MenuItem?> UpdateMenuItemAsync(Guid sectionId, Guid itemId, MenuItem updatedItem)
{
try
{
var filter = Builders<MenuSection>.Filter.And(
Builders<MenuSection>.Filter.Eq(s => s.Id, sectionId),
Builders<MenuSection>.Filter.ElemMatch(s => s.Items, i => i.Id == itemId)
);
var update = Builders<MenuSection>.Update
.Set("Items.$.Text", updatedItem.Text)
.Set("Items.$.Icon", updatedItem.Icon)
.Set("Items.$.Available", updatedItem.Available)
.Set("Items.$.Link", updatedItem.Link);
var result = await _collection.UpdateOneAsync(filter, update);
if (result.ModifiedCount > 0)
{
// Re-fetch section and return the updated item
var section = await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync();
return section?.Items.FirstOrDefault(i => i.Id == itemId);
}
return null;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error updating MenuItem.");
return null;
}
}
public async Task<MenuSection?> AddSubMenuItemAsync(Guid sectionId, Guid itemId, SubMenuItem newSubItem)
{
try
{
newSubItem.Id = Guid.NewGuid();
// Match the MenuSection and the specific MenuItem inside it
var filter = Builders<MenuSection>.Filter.And(
Builders<MenuSection>.Filter.Eq(s => s.Id, sectionId),
Builders<MenuSection>.Filter.ElemMatch(s => s.Items, i => i.Id == itemId)
);
// Use positional operator `$` to target matched MenuItem and push into its Submenu
var update = Builders<MenuSection>.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<SubMenuItem?> UpdateSubmenuItemAsync(Guid sectionId, Guid itemId, Guid subItemId, SubMenuItem updatedSub)
{
try
{
var filter = Builders<MenuSection>.Filter.Eq(s => s.Id, sectionId);
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("item._id", itemId.ToString())),
new BsonDocumentArrayFilterDefinition<BsonDocument>(
new BsonDocument("sub._id", subItemId.ToString()))
};
var update = Builders<MenuSection>.Update
.Set("Items.$[item].Submenu.$[sub].Text", updatedSub.Text)
.Set("Items.$[item].Submenu.$[sub].Available", updatedSub.Available)
.Set("Items.$[item].Submenu.$[sub].Link", updatedSub.Link)
.Set("Items.$[item].Submenu.$[sub].PermissionKey", updatedSub.PermissionKey);
var options = new UpdateOptions { ArrayFilters = arrayFilters };
var result = await _collection.UpdateOneAsync(filter, update, options);
if (result.ModifiedCount == 0)
return null;
var updatedSection = await _collection.Find(x => x.Id == sectionId).FirstOrDefaultAsync();
var subItem = updatedSection?.Items
.FirstOrDefault(i => i.Id.ToString() == itemId.ToString())?
.Submenu
.FirstOrDefault(s => s.Id.ToString() == subItemId.ToString());
return subItem;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error updating SubMenuItem.");
_logger.LogError(ex, "Error occured while added in mongo");
return null;
}
}
// You can add Get, Update, Delete later here
}
}

View File

@ -13,7 +13,6 @@ using MarcoBMS.Services.Service;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Driver;
using Org.BouncyCastle.Asn1.Ocsp;
using System.Threading.Tasks;
using static System.Collections.Specialized.BitVector32;
@ -52,8 +51,8 @@ namespace Marco.Pms.Services.Controllers
//}
[HttpPost("sidebar/menu-section")]
public async Task<IActionResult> CreateAppSideBarMenu([FromBody] MenuSectionDto MenuSecetion)
[HttpPost("create/appsidebar")]
public async Task<IActionResult> PostAppSideBarMenu([FromBody] MenuSectionDto sidebarMenu)
{
@ -65,10 +64,10 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(403, ApiResponse<object>.ErrorResponse("access denied", "User haven't permission", 403));
}
var sideMenuSection = _mapper.Map<MenuSection>(MenuSecetion);
var sideMenu = _mapper.Map<MenuSection>(sidebarMenu);
try
{
sideMenuSection = await _sideBarMenuHelper.CreateMenuSectionAsync(sideMenuSection);
sideMenu = await _sideBarMenuHelper.CreateMenuSectionAsync(sideMenu);
}
catch (Exception ex)
{
@ -76,169 +75,23 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server Error", ex, 500));
}
if (sideMenuSection == null) {
if (sideMenu == null) {
_logger.LogWarning("Error Occurred while creating Menu");
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid MenuSection", 400));
return BadRequest(ApiResponse<object>.ErrorResponse("Menu creation failed", 400));
}
_logger.LogInfo("Error Occurred while creating Menu");
return Ok(ApiResponse<object>.SuccessResponse(sideMenuSection, "Sidebar menu created successfully.", 201));
return Ok(ApiResponse<object>.SuccessResponse(sideMenu, "Sidebar menu created successfully.", 201));
}
[HttpPut("sidebar/menu-section/{sectionId}")]
public async Task<IActionResult> UpdateMenuSection(Guid sectionId,[FromBody] MenuSection updatedSection)
{
if (sectionId == Guid.Empty || updatedSection == null)
{
_logger.LogWarning("Error Occurred while Updating Menu Item");
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid section ID, item ID, or menu item payload.", 400));
}
var UpdatedMenuSection = _mapper.Map<MenuSection>(updatedSection);
try
{
UpdatedMenuSection = await _sideBarMenuHelper.UpdateMenuSectionAsync(sectionId, UpdatedMenuSection);
if (UpdatedMenuSection == null)
return NotFound(ApiResponse<object>.ErrorResponse("Menu section not found", 404));
return Ok(ApiResponse<object>.SuccessResponse(UpdatedMenuSection, "Menu section updated successfully"));
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to update menu section");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server error", ex, 500));
}
}
[HttpPost("sidebar/menus/{sectionId}/items")]
public async Task<IActionResult> AddMenuItem(Guid sectionId, [FromBody] MenuItemDto newItemDto)
{
if (sectionId == Guid.Empty || newItemDto == null)
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid input", 400));
try
{
var menuItem = _mapper.Map<MenuItem>(newItemDto);
var result = await _sideBarMenuHelper.AddMenuItemAsync(sectionId, menuItem);
if (result == null)
return NotFound(ApiResponse<object>.ErrorResponse("Menu section not found", 404));
_logger.LogInfo("Added MenuItem in Section: {SectionId}");
return Ok(ApiResponse<object>.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<object>.ErrorResponse("Server error", ex, 500));
}
}
[HttpPut("sidebar/{sectionId}/items/{itemId}")]
public async Task<IActionResult> UpdateMenuItem(Guid sectionId, Guid itemId, [FromBody] MenuItemDto updatedMenuItem)
{
if (sectionId == Guid.Empty || itemId == Guid.Empty || updatedMenuItem == null)
{
_logger.LogWarning("Error Occurred while Updating Menu Item");
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid section ID, item ID, or menu item payload.", 400));
}
var sideMenuItem = _mapper.Map<MenuItem>(updatedMenuItem);
try
{
sideMenuItem = await _sideBarMenuHelper.UpdateMenuItemAsync(sectionId, itemId, sideMenuItem);
if (sideMenuItem == null)
{
_logger.LogWarning("Error Occurred while Updating SidBar Section:{SectionId} MenuItem:{itemId} ");
return BadRequest(ApiResponse<object>.ErrorResponse("Menu creation failed", 400));
}
_logger.LogInfo("SidBar Section{SectionId} MenuItem {itemId} Updated ");
return Ok(ApiResponse<object>.SuccessResponse(sideMenuItem, "Sidebar MenuItem Updated successfully.", 201));
}
catch (Exception ex) {
_logger.LogError(ex, "Error Occurred while creating MenuItem");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server Error", ex, 500));
}
}
[HttpPost("sidebar/menus/{sectionId}/items/{itemId}/subitems")]
public async Task<IActionResult> AddSubMenuItem(Guid sectionId, Guid itemId, [FromBody] SubMenuItemDto newSubItem)
{
if (sectionId == Guid.Empty || itemId == Guid.Empty || newSubItem == null)
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid input", 400));
try
{
var subMenuItem = _mapper.Map<SubMenuItem>(newSubItem);
var result = await _sideBarMenuHelper.AddSubMenuItemAsync(sectionId, itemId, subMenuItem);
if (result == null)
{
return NotFound(ApiResponse<object>.ErrorResponse("Menu item not found", 404));
}
_logger.LogInfo("Added SubMenuItem in Section: {SectionId}, MenuItem: {ItemId}");
return Ok(ApiResponse<object>.SuccessResponse(result, "Submenu item added successfully"));
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to add submenu item");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server error", ex, 500));
}
}
[HttpPut("sidebar/{sectionId}/items/{itemId}/subitems/{subItemId}")]
public async Task<IActionResult> UpdateSubmenuItem(Guid sectionId,Guid itemId,Guid subItemId,[FromBody] SubMenuItemDto updatedSubMenuItem)
{
if (sectionId == Guid.Empty || itemId == Guid.Empty || subItemId == Guid.Empty || updatedSubMenuItem == null)
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid input", 400));
try
{
var SubMenuItem = _mapper.Map<SubMenuItem>(updatedSubMenuItem);
SubMenuItem = await _sideBarMenuHelper.UpdateSubmenuItemAsync(sectionId, itemId, subItemId, SubMenuItem);
if (SubMenuItem == null)
return NotFound(ApiResponse<object>.ErrorResponse("Submenu item not found", 404));
_logger.LogInfo("SidBar Section{SectionId} MenuItem {itemId} SubMenuItem {subItemId} Updated");
return Ok(ApiResponse<object>.SuccessResponse(SubMenuItem, "Submenu item updated successfully"));
}
catch (Exception ex)
{
_logger.LogError(ex, "Error Occurred while Updating Sub-MenuItem");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server Error", ex, 500));
}
}
}
}