using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Mapper; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using System.Net.Mail; namespace MarcoBMS.Services.Controllers { [Route("api/[controller]")] [ApiController] [Authorize] public class UserController : ControllerBase { private readonly UserHelper _userHelper; private readonly UserManager _userManager; private readonly EmployeeHelper _employeeHelper; private readonly ILoggingService _logger; private readonly IProjectServices _projectServices; private readonly RolesHelper _rolesHelper; public UserController(EmployeeHelper employeeHelper, UserManager userManager, ILoggingService logger, IProjectServices projectServices, UserHelper userHelper, RolesHelper rolesHelper) { _userManager = userManager; _userHelper = userHelper; _logger = logger; _employeeHelper = employeeHelper; _projectServices = projectServices; _rolesHelper = rolesHelper; } [HttpGet("profile")] public async Task GetUserProfileFromJwt() { if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } var user = await _userHelper.GetCurrentUserAsync(); Employee emp = new Employee { }; if (user != null) { emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id); } List featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeId(emp.Id); string[] projectsId = []; /* User with permission manage project can see all projects */ if (featurePermission != null && featurePermission.Exists(c => c.Id.ToString() == "172fc9b6-755b-4f62-ab26-55c34a330614")) { List projects = await _projectServices.GetAllProjectByTanentID(emp.TenantId); projectsId = projects.Select(c => c.Id.ToString()).ToArray(); } else { List allocation = await _projectServices.GetProjectByEmployeeID(emp.Id); projectsId = allocation.Select(c => c.ProjectId.ToString()).ToArray(); } EmployeeProfile profile = new EmployeeProfile() { }; if (featurePermission != null) { EmployeeVM employeeVM = EmployeeMapper.ToEmployeeVMFromEmployee(emp); profile = new EmployeeProfile() { EmployeeInfo = employeeVM, Projects = projectsId, FeaturePermissions = featurePermission.Select(c => c.Id.ToString()).Distinct().ToArray(), Features = featurePermission.Select(c => c.FeatureId.ToString()).Distinct().ToArray(), }; } return Ok(ApiResponse.SuccessResponse(profile, "Success", 200)); } [HttpGet("email/{email}")] public async Task GetUserByEmail(string email) { var isvalid = IsValidEmail(email); if (!isvalid) { _logger.LogWarning("User provided invalid email address"); return BadRequest(ApiResponse.ErrorResponse("Invalid email", "Invalid email", 400)); } var user = await _userManager.FindByEmailAsync(email); if (user == null) { _logger.LogInfo("User with email {Email} not found in ASP.NET users table", email); return Ok(ApiResponse.SuccessResponse(true, "User not exists", 200)); } else { _logger.LogInfo("User with email {Email} founded in ASP.NET users table", email); return Ok(ApiResponse.SuccessResponse(false, "User exists", 200)); } } private static bool IsValidEmail(string email) { if (string.IsNullOrWhiteSpace(email)) return false; try { var addr = new MailAddress(email); return addr.Address == email.Trim(); } catch { return false; } } } }