using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Marco.Pms.Model.Mapper; using System.Text.Json; using Marco.Pms.Model.Utilities; namespace Marco.Pms.Services.Controllers { [Route("api/[controller]")] [ApiController] public class TenantController : ControllerBase { private readonly string jsonString = System.IO.File.ReadAllText("Data/RolesCofiguration.json"); private readonly ApplicationDbContext _context; private readonly UserManager _userManager; public TenantController(ApplicationDbContext context,UserManager userManager) { _context = context; _userManager = userManager; } [HttpPost] public async Task CreateTenant([FromForm] CreateTenantDto createTenantDto) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (await _userManager.FindByEmailAsync(createTenantDto.Email) != null) { return BadRequest("Tenant Already Exists"); } Tenant newTenant = createTenantDto.CreateDtoToTenant(); _context.Tenants.Add(newTenant); await _context.SaveChangesAsync(); Tenant? tenant = await _context.Tenants.AsNoTracking().FirstOrDefaultAsync(t => t.Name == newTenant.Name); if (tenant != null) { RoleConfiguration settings = JsonSerializer.Deserialize(jsonString); var TenantId = tenant.Id; JobRole jobRole = new JobRole { Name = settings.JobRoleName, Description = settings.JobRoleDescription, TenantId = TenantId }; ApplicationRole role = new ApplicationRole { Role = settings.RoleName, Description = settings.JobRoleDescription, TenantId = TenantId }; if (_context.JobRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Name == "Admin") != null) { _context.JobRoles.Add(jobRole); await _context.SaveChangesAsync(); } if (_context.JobRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Name == "SuperUser") != null) { _context.ApplicationRoles.Add(role); await _context.SaveChangesAsync(); } List permissions = await _context.FeaturePermissions.AsNoTracking().ToListAsync(); //List < RolePermissionMappings > = []; foreach(var permission in permissions) { var item = new RolePermissionMappings() { ApplicationRoleId = role.Id, FeaturePermissionId = permission.Id }; bool assigned = _context.RolePermissionMappings.Any(c => c.ApplicationRoleId == role.Id && c.FeaturePermissionId == permission.Id); if (permission.IsEnabled && !assigned) _context.RolePermissionMappings.Add(item); } await _context.SaveChangesAsync(); var user = new ApplicationUser { UserName = createTenantDto.Username, Email = createTenantDto.Email, TenantId = TenantId, IsRootUser = true, EmailConfirmed = true }; var result = await _userManager.CreateAsync(user, createTenantDto.Password); if (result.Succeeded) { Employee newEmployee = CreateTenantDtoToEmployee(createTenantDto, TenantId, user.Id,jobRole.Id); _context.Employees.Add(newEmployee); await _context.SaveChangesAsync(); var employeeRoleMapping = new EmployeeRoleMapping { EmployeeId = newEmployee.Id, RoleId = role.Id, TenantId = TenantId, IsEnabled = true }; _context.EmployeeRoleMappings.Add(employeeRoleMapping); await _context.SaveChangesAsync(); return Ok(newEmployee); } else { // Log the errors for debugging foreach (var error in result.Errors) { // Log error.Description Console.WriteLine($"UserManager Error: {error.Description}"); } return BadRequest("Failed to create the root user."); } } return BadRequest("Falied to create Tenant"); } private static Employee CreateTenantDtoToEmployee(CreateTenantDto model, int TenantId, string? ApplicationUserId,int jobRoleId) { return new Employee { ApplicationUserId = ApplicationUserId, //FirstName = model.FirstName, FirstName = model.Name, //LastName = model.LastName, LastName = "", Email = model.Email, TenantId = TenantId, CurrentAddress = "", BirthDate = DateTime.UtcNow, EmergencyPhoneNumber = "", EmergencyContactPerson = "", AadharNumber = "", Gender = "", //MiddleName = model.MiddleName, MiddleName = "", PanNumber = "", PeramnentAddress = "", PhoneNumber = "", Photo = null, // GetFileDetails(model.Photo).Result.FileData, //JobRoleId = Convert.ToInt32(model.JobRoleId), JobRoleId = jobRoleId, JoiningDate = DateTime.UtcNow, }; } } }