create menu api created

This commit is contained in:
pramod mahajan 2025-08-02 14:45:38 +05:30
parent 56d3b754d9
commit cc5badeb0f
7 changed files with 209 additions and 99 deletions

View File

@ -1,14 +1,45 @@
using Marco.Pms.Model.AppMenu; 
using Marco.Pms.Model.AppMenu;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MongoDB.Driver; using MongoDB.Driver;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Marco.Pms.CacheHelper namespace Marco.Pms.CacheHelper
{ {
private readonly IMongoCollection<MenuSection>? _collection; public class SideBarMenu
{
private readonly IMongoCollection<MenuSection> _collection;
private readonly ILogger<SideBarMenu> _logger;
} public SideBarMenu(IConfiguration configuration, ILogger<SideBarMenu> logger)
{
_logger = logger;
var connectionString = configuration["MongoDB:ConnectionMenu"];
var mongoUrl = new MongoUrl(connectionString);
var client = new MongoClient(mongoUrl);
var database = client.GetDatabase(mongoUrl.DatabaseName);
_collection = database.GetCollection<MenuSection>("Menus");
}
public async Task<MenuSection?> CreateMenuSectionAsync(MenuSection section)
{
try
{
await _collection.InsertOneAsync(section);
return section;
}
catch(Exception ex)
{
_logger.LogError(ex, "Error occured while added in mongo");
return null;
}
}
// You can add Get, Update, Delete later here
}
}

View File

@ -1,11 +1,6 @@
 
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Model.AppMenu namespace Marco.Pms.Model.AppMenu
{ {
@ -14,6 +9,7 @@ namespace Marco.Pms.Model.AppMenu
[BsonId] [BsonId]
[BsonRepresentation(BsonType.String)] [BsonRepresentation(BsonType.String)]
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; } = Guid.NewGuid();
public string? Header { get; set; } public string? Header { get; set; }
public string? Title { get; set; } public string? Title { get; set; }
public List<MenuItem> Items { get; set; } = new List<MenuItem>(); public List<MenuItem> Items { get; set; } = new List<MenuItem>();
@ -24,23 +20,28 @@ namespace Marco.Pms.Model.AppMenu
[BsonId] [BsonId]
[BsonRepresentation(BsonType.String)] [BsonRepresentation(BsonType.String)]
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; } = Guid.NewGuid();
public string? Text { get; set; } public string? Text { get; set; }
public string? Icon { get; set; } public string? Icon { get; set; }
public bool? Available { get; set; } public bool Available { get; set; } = true;
public string? Link { get; set; } public string? Link { get; set; }
public List<SubMenuItem> Submenu { get; set; }
public List<SubMenuItem> Submenu { get; set; } = new List<SubMenuItem> ();
} }
public class SubMenuItem public class SubMenuItem
{ {
[BsonId] [BsonId]
[BsonRepresentation(BsonType.String)] [BsonRepresentation(BsonType.String)]
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; } = Guid.NewGuid();
public string Text { get; set; }
public bool Available { get; set; }
public string Link { get; set; }
public string permissionKey { get; set; }
public string? Text { get; set; }
public bool Available { get; set; } = true;
public string Link { get; set; } = string.Empty;
public string PermissionKey { get; set; } = string.Empty;
} }
} }

View File

@ -0,0 +1,42 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Model.Dtos.AppMenu
{
public class MenuSectionDto
{
public string? Header { get; set; }
public string? Title { get; set; }
public List<MenuItemDto> Items { get; set; } = new List<MenuItemDto>();
}
public class MenuItemDto
{
public string? Text { get; set; }
public string? Icon { get; set; }
public bool Available { get; set; } = true;
public string? Link { get; set; }
public List<SubMenuItemDto> Submenu { get; set; } = new List<SubMenuItemDto>();
}
public class SubMenuItemDto
{
public string? Text { get; set; }
public bool Available { get; set; } = true;
public string Link { get; set; } = string.Empty;
public string PermissionKey { get; set; } = string.Empty;
}
}

View File

@ -1,72 +1,97 @@
using Marco.Pms.Model.AppMenu; using AutoMapper;
using Azure;
using Marco.Pms.CacheHelper;
using Marco.Pms.Model.AppMenu;
using Marco.Pms.Model.Dtos.AppMenu;
using Marco.Pms.Model.Employees; using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Utilities;
using Marco.Pms.Services.Service; using Marco.Pms.Services.Service;
using Marco.Pms.Services.Service.ServiceInterfaces; using Marco.Pms.Services.Service.ServiceInterfaces;
using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Helpers;
using MarcoBMS.Services.Service;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Asn1.Ocsp;
using System.Threading.Tasks; using System.Threading.Tasks;
using static System.Collections.Specialized.BitVector32;
namespace Marco.Pms.Services.Controllers namespace Marco.Pms.Services.Controllers
{ {
public class AppMenuController [Authorize]
[ApiController]
[Route("api/[controller]")]
public class AppMenuController : ControllerBase
{ {
private readonly UserHelper _userHelper; private readonly UserHelper _userHelper;
private readonly EmployeeHelper _employeeHelper; private readonly EmployeeHelper _employeeHelper;
private readonly RolesHelper _rolesHelper; private readonly RolesHelper _rolesHelper;
private readonly SideBarMenu _sideBarMenuHelper;
private readonly IMapper _mapper;
private readonly ILoggingService _logger;
public AppMenuController(EmployeeHelper employeeHelper, IProjectServices projectServices, UserHelper userHelper, RolesHelper rolesHelper) { public AppMenuController(EmployeeHelper employeeHelper, IProjectServices projectServices, UserHelper userHelper, RolesHelper rolesHelper, SideBarMenu sideBarMenuHelper, IMapper mapper, ILoggingService logger) {
_userHelper = userHelper; _userHelper = userHelper;
_employeeHelper = employeeHelper; _employeeHelper = employeeHelper;
_rolesHelper = rolesHelper; _rolesHelper = rolesHelper;
_sideBarMenuHelper = sideBarMenuHelper;
_mapper = mapper;
_logger = logger;
} }
[HttpGet("/appMenu")] //[HttpGet("/appMenu")]
public async Task<IActionResult> getAppSideBarMenu() //public async Task<IActionResult> getAppSideBarMenu()
//{
// return Ok();
//}
[HttpPost("create/appsidebar")]
public async Task<IActionResult> PostAppSideBarMenu([FromBody] MenuSectionDto sidebarMenu)
{ {
return Ok();
}
[HttpPost("/create/appsidebar")]
public async Task<IActionResult> PostAppSideBarMenu([FromForm] MenuSection sidebarmenu)
{
var user = await _userHelper.GetCurrentEmployeeAsync(); var user = await _userHelper.GetCurrentEmployeeAsync();
Employee? loginUser = null;
if (user != null) if (!(user.ApplicationUser?.IsRootUser ?? false))
{ {
loginUser = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id.ToString()); _logger.LogWarning("Access Denied while creating side menu");
return StatusCode(403, ApiResponse<object>.ErrorResponse("access denied", "User haven't permission", 403));
List<FeaturePermission> featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeId(loginUser.Id);
string[] projectsId = [];
return Ok(loginUser);
} }
var sideMenu = _mapper.Map<MenuSection>(sidebarMenu);
try
{
sideMenu = await _sideBarMenuHelper.CreateMenuSectionAsync(sideMenu);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error Occurred while creating Menu");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Server Error", ex, 500));
}
if (sideMenu == null) {
_logger.LogWarning("Error Occurred while creating Menu");
return BadRequest(ApiResponse<object>.ErrorResponse("Menu creation failed", 400));
}
_logger.LogInfo("Error Occurred while creating Menu");
return Ok(ApiResponse<object>.SuccessResponse(sideMenu, "Sidebar menu created successfully.", 201));
}
} }
} }
}

View File

@ -1,4 +1,6 @@
using AutoMapper; using AutoMapper;
using Marco.Pms.Model.AppMenu;
using Marco.Pms.Model.Dtos.AppMenu;
using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Dtos.Project;
using Marco.Pms.Model.Employees; using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Master; using Marco.Pms.Model.Master;
@ -63,6 +65,12 @@ namespace Marco.Pms.Services.MappingProfiles
#region ======================================================= Projects ======================================================= #region ======================================================= Projects =======================================================
CreateMap<Employee, EmployeeVM>(); CreateMap<Employee, EmployeeVM>();
#endregion #endregion
#region ======================================================= AppMenu =======================================================
CreateMap<MenuSectionDto, MenuSection>();
CreateMap<MenuItemDto, MenuItem>();
CreateMap<SubMenuItemDto, SubMenuItem>();
#endregion
} }
} }
} }

View File

@ -189,6 +189,7 @@ builder.Services.AddScoped<CacheUpdateHelper>();
builder.Services.AddScoped<ProjectCache>(); builder.Services.AddScoped<ProjectCache>();
builder.Services.AddScoped<EmployeeCache>(); builder.Services.AddScoped<EmployeeCache>();
builder.Services.AddScoped<ReportCache>(); builder.Services.AddScoped<ReportCache>();
builder.Services.AddScoped<SideBarMenu>();
#endregion #endregion
// Singleton services (one instance for the app's lifetime) // Singleton services (one instance for the app's lifetime)

View File

@ -1,53 +1,55 @@
{ {
"Cors": { "Cors": {
"AllowedOrigins": "*", "AllowedOrigins": "*",
"AllowedMethods": "*", "AllowedMethods": "*",
"AllowedHeaders": "*" "AllowedHeaders": "*"
}, },
"Environment": { "Environment": {
"Name": "Development", "Name": "Development",
"Title": "Dev" "Title": "Dev"
}, },
"ConnectionStrings": { "ConnectionStrings": {
"DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1"
}, },
"SmtpSettings": { "SmtpSettings": {
"SmtpServer": "smtp.gmail.com", "SmtpServer": "smtp.gmail.com",
"Port": 587, "Port": 587,
"SenderName": "MarcoAIOT", "SenderName": "MarcoAIOT",
"SenderEmail": "marcoioitsoft@gmail.com", "SenderEmail": "marcoioitsoft@gmail.com",
"Password": "qrtq wfuj hwpp fhqr" "Password": "qrtq wfuj hwpp fhqr"
}, },
//"SmtpSettings": { //"SmtpSettings": {
// "SmtpServer": "mail.marcoaiot.com", // "SmtpServer": "mail.marcoaiot.com",
// "Port": 587, // "Port": 587,
// "SenderName": "MarcoAIOT", // "SenderName": "MarcoAIOT",
// "SenderEmail": "ashutosh.nehete@marcoaiot.com", // "SenderEmail": "ashutosh.nehete@marcoaiot.com",
// "Password": "Reset@123" // "Password": "Reset@123"
//}, //},
"AppSettings": { "AppSettings": {
"WebFrontendUrl": "http://localhost:5173", "WebFrontendUrl": "http://localhost:5173",
"ImagesBaseUrl": "http://localhost:5173" "ImagesBaseUrl": "http://localhost:5173"
}, },
"Jwt": { "Jwt": {
"Issuer": "http://localhost:5246", "Issuer": "http://localhost:5246",
"Audience": "http://localhost:5246", "Audience": "http://localhost:5246",
"Key": "sworffishhkjfa9dnfdndfu33infnajfj", "Key": "sworffishhkjfa9dnfdndfu33infnajfj",
"ExpiresInMinutes": 60, "ExpiresInMinutes": 60,
"RefreshTokenExpiresInDays": 7 "RefreshTokenExpiresInDays": 7
}, },
"MailingList": { "MailingList": {
"RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" "RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com"
//"ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" //"ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com"
}, },
"AWS": { "AWS": {
"AccessKey": "AKIARZDBH3VDMSUUY2FX", "AccessKey": "AKIARZDBH3VDMSUUY2FX",
"SecretKey": "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", "SecretKey": "NTS5XXgZINQbU6ctpNuLXtIY/Qk9GCgD9Rr5yNJP",
"Region": "us-east-1", "Region": "us-east-1",
"BucketName": "testenv-marco-pms-documents" "BucketName": "testenv-marco-pms-documents"
}, },
"MongoDB": { "MongoDB": {
"SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", "SerilogDatabaseUrl": "mongodb://devuser:DevPass123@147.93.98.152:27017/DotNetLogs?authSource=admin",
"ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" "ConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/DevelopmentCache?authSource=admin&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500",
} "ConnectionMenu": "mongodb://devuser:DevPass123@147.93.98.152:27017/UpdateLogs?authSource=admin&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500",
}
} }