From 45adcc0227aec45502d51e4ac868ccc4f8263e4c Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Mar 2025 18:05:36 +0530 Subject: [PATCH 1/2] Created new API for creating new tenant --- .../Dtos/Tenant/CreateTenantDto.cs | 44 +++++ .../Entitlements/ApplicationRole.cs | 6 +- .../Entitlements/ApplicationUser.cs | 4 +- Marco.Pms.Model/Entitlements/Client.cs | 11 +- .../Entitlements/FeaturePermission.cs | 9 +- Marco.Pms.Model/Entitlements/JobRole.cs | 4 +- Marco.Pms.Model/Mapper/TenantMapper.cs | 23 +++ .../Utilities/RolesConfiguration.cs | 16 ++ .../Controllers/TenantController.cs | 153 ++++++++++++++++++ .../Data/RolesCofiguration.json | 6 + Marco.Pms.Services/Program.cs | 2 +- Marco.Pms.Services/appsettings.json | 8 +- 12 files changed, 257 insertions(+), 29 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs create mode 100644 Marco.Pms.Model/Mapper/TenantMapper.cs create mode 100644 Marco.Pms.Model/Utilities/RolesConfiguration.cs create mode 100644 Marco.Pms.Services/Controllers/TenantController.cs create mode 100644 Marco.Pms.Services/Data/RolesCofiguration.json diff --git a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs new file mode 100644 index 0000000..bf4cf4a --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations; + +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class CreateTenantDto + { + [Required] + public string Username { get; set; } + + [Required] + [EmailAddress] + public string Email { get; set; } + + [Required] + [MinLength(6)] + [RegularExpression(@"^(?=.*[^a-zA-Z0-9])(?=.*\d)(?=.*[A-Z]).+$", ErrorMessage = "Passwords must have at least one non-alphanumeric character, at least one digit ('0'-'9'), and at least one uppercase ('A'-'Z').")] + public string Password { get; set; } + + + public string OrganizatioinName { get; set; } + public string? About { get; set; } + public string? OragnizationSize { get; set; } + public int IndustryId { get; set; } + public string Website { get; set; } + public string Name { get; set; } + public string ContactNumber { get; set; } + public DateTime OnBoardingDate { get; set; } + + //public string Gender { get; set; } + //public string? BirthDate { get; set; } + //public DateTime JoiningDate { get; set; } + + //public string? PeramnentAddress { get; set; } + //public string? CurrentAddress { get; set; } + + //public string EmergencyPhoneNumber { get; set; } + //public string EmergencyContactPerson { get; set; } + + //public string? AadharNumber { get; set; } + + //public string? PanNumber { get; set; } + + } +} diff --git a/Marco.Pms.Model/Entitlements/ApplicationRole.cs b/Marco.Pms.Model/Entitlements/ApplicationRole.cs index 512e99b..b972f66 100644 --- a/Marco.Pms.Model/Entitlements/ApplicationRole.cs +++ b/Marco.Pms.Model/Entitlements/ApplicationRole.cs @@ -1,8 +1,4 @@ -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; -using System.ComponentModel; -using System.ComponentModel.DataAnnotations.Schema; - -namespace Marco.Pms.Model.Entitlements +namespace Marco.Pms.Model.Entitlements { public class ApplicationRole { diff --git a/Marco.Pms.Model/Entitlements/ApplicationUser.cs b/Marco.Pms.Model/Entitlements/ApplicationUser.cs index ef7770a..aa04986 100644 --- a/Marco.Pms.Model/Entitlements/ApplicationUser.cs +++ b/Marco.Pms.Model/Entitlements/ApplicationUser.cs @@ -9,8 +9,8 @@ namespace Marco.Pms.Model.Entitlements { public class ApplicationUser : IdentityUser { - [Required] - public string Role { get; set; } // e.g. Admin, SiteManager, SkilledWorker, etc. + //[Required] + // public string Role { get; set; } // e.g. Admin, SiteManager, SkilledWorker, etc. [DisplayName("TenantId")] diff --git a/Marco.Pms.Model/Entitlements/Client.cs b/Marco.Pms.Model/Entitlements/Client.cs index 1ce97dd..4494e63 100644 --- a/Marco.Pms.Model/Entitlements/Client.cs +++ b/Marco.Pms.Model/Entitlements/Client.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Marco.Pms.Model.Entitlements +namespace Marco.Pms.Model.Entitlements { public class Tenant { @@ -14,6 +8,9 @@ namespace Marco.Pms.Model.Entitlements public string DomainName { get; set; } public string ContactName { get; set; } public string ContactNumber { get; set; } + + //public string? OragnizationSize { get; set; } + //public int IndustryId { get; set; } public DateTime OnBoardingDate { get; set; } } } diff --git a/Marco.Pms.Model/Entitlements/FeaturePermission.cs b/Marco.Pms.Model/Entitlements/FeaturePermission.cs index 830807a..f7f33c7 100644 --- a/Marco.Pms.Model/Entitlements/FeaturePermission.cs +++ b/Marco.Pms.Model/Entitlements/FeaturePermission.cs @@ -1,12 +1,5 @@ -using Marco.Pms.Model.Projects; +using System.ComponentModel.DataAnnotations.Schema; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations.Schema; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Marco.Pms.Model.Entitlements { diff --git a/Marco.Pms.Model/Entitlements/JobRole.cs b/Marco.Pms.Model/Entitlements/JobRole.cs index 3557525..d89f317 100644 --- a/Marco.Pms.Model/Entitlements/JobRole.cs +++ b/Marco.Pms.Model/Entitlements/JobRole.cs @@ -1,5 +1,5 @@ -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; namespace Marco.Pms.Model.Entitlements { diff --git a/Marco.Pms.Model/Mapper/TenantMapper.cs b/Marco.Pms.Model/Mapper/TenantMapper.cs new file mode 100644 index 0000000..9cfd660 --- /dev/null +++ b/Marco.Pms.Model/Mapper/TenantMapper.cs @@ -0,0 +1,23 @@ +using Marco.Pms.Model.Dtos.Tenant; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; + +namespace Marco.Pms.Model.Mapper +{ + public static class TenantMapper + { + public static Tenant CreateDtoToTenant(this CreateTenantDto createTenant) + { + return new Tenant + { + Name = createTenant.OrganizatioinName, + Description = createTenant.About, + DomainName = createTenant.Website, + ContactName = createTenant.Name, + ContactNumber = createTenant.ContactNumber, + OnBoardingDate = createTenant.OnBoardingDate, + }; + } + + } +} diff --git a/Marco.Pms.Model/Utilities/RolesConfiguration.cs b/Marco.Pms.Model/Utilities/RolesConfiguration.cs new file mode 100644 index 0000000..4eb9b1f --- /dev/null +++ b/Marco.Pms.Model/Utilities/RolesConfiguration.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Marco.Pms.Model.Utilities +{ + public class RoleConfiguration + { + public string JobRoleName { get; set; } + public string JobRoleDescription { get; set; } + public string RoleName { get; set; } + public string RoleDescription { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs new file mode 100644 index 0000000..efe9485 --- /dev/null +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -0,0 +1,153 @@ +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, + + }; + } + + + } + +} diff --git a/Marco.Pms.Services/Data/RolesCofiguration.json b/Marco.Pms.Services/Data/RolesCofiguration.json new file mode 100644 index 0000000..9400eab --- /dev/null +++ b/Marco.Pms.Services/Data/RolesCofiguration.json @@ -0,0 +1,6 @@ +{ + "JobRoleName": "Admin", + "JobRoleDescription": "Admin", + "RoleName": "SuperRole", + "RoleDescription": "SuperRole" +} \ No newline at end of file diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index a01ea0e..29fbd01 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -151,7 +151,7 @@ if (app.Environment.IsDevelopment()) app.UseStaticFiles(); // Enables serving static files -app.UseSerilogRequestLogging(); // Log HTTP requests +//app.UseSerilogRequestLogging(); // Log HTTP requests app.UseHttpsRedirection(); app.UseMiddleware(); app.UseMiddleware(); diff --git a/Marco.Pms.Services/appsettings.json b/Marco.Pms.Services/appsettings.json index 868c367..95a7a52 100644 --- a/Marco.Pms.Services/appsettings.json +++ b/Marco.Pms.Services/appsettings.json @@ -62,11 +62,11 @@ ] }, - "ConnectionStrings": { - // "DefaultConnectionString": "Server=103.50.160.45;User ID=marcowvh_admin;Password=Marcoemp@123;Database=marcowvh_empattendanceci", + "ConnectionStrings": { + // "DefaultConnectionString": "Server=103.50.160.45;User ID=marcowvh_admin;Password=Marcoemp@123;Database=marcowvh_empattendanceci", "DefaultConnectionString": "Server=localhost;port=3333;User ID=root;Password=root;Database=MarcoBMS1", - // "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" + }, "AppSettings": { "WebFrontendUrl": "http://localhost:5173", "ImagesBaseUrl": "http://localhost:5173" -- 2.43.0 From 8014b9048760e7aa6d464fbd54df08cc4c9c8f6c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Mar 2025 16:53:27 +0530 Subject: [PATCH 2/2] Changed ActivityTime field in AttendanceLog Table and Remove Bugs from CreateTenant API --- .../Dtos/Tenant/CreateTenantDto.cs | 19 +----- .../Entitlements/ApplicationUser.cs | 8 +-- Marco.Pms.Model/Mapper/TenantMapper.cs | 3 +- .../Controllers/AttendanceController.cs | 17 ++++-- .../Controllers/TenantController.cs | 61 ++++++++++++------- .../Data/RolesCofiguration.json | 4 +- Marco.Pms.Services/Helpers/UserHelper.cs | 5 +- .../Middleware/LoggingMiddleware.cs | 6 +- Marco.Pms.Services/Program.cs | 1 + Marco.Pms.Services/Service/ILoggingService.cs | 2 +- Marco.Pms.Services/Service/LoggingServices.cs | 3 +- .../Service/RefreshTokenService.cs | 13 ++-- Marco.Pms.Services/appsettings.json | 25 ++++---- 13 files changed, 84 insertions(+), 83 deletions(-) diff --git a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs index bf4cf4a..9e990d8 100644 --- a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs @@ -4,8 +4,8 @@ namespace Marco.Pms.Model.Dtos.Tenant { public class CreateTenantDto { - [Required] - public string Username { get; set; } + //[Required] + //public string Username { get; set; } [Required] [EmailAddress] @@ -25,20 +25,5 @@ namespace Marco.Pms.Model.Dtos.Tenant public string Name { get; set; } public string ContactNumber { get; set; } public DateTime OnBoardingDate { get; set; } - - //public string Gender { get; set; } - //public string? BirthDate { get; set; } - //public DateTime JoiningDate { get; set; } - - //public string? PeramnentAddress { get; set; } - //public string? CurrentAddress { get; set; } - - //public string EmergencyPhoneNumber { get; set; } - //public string EmergencyContactPerson { get; set; } - - //public string? AadharNumber { get; set; } - - //public string? PanNumber { get; set; } - } } diff --git a/Marco.Pms.Model/Entitlements/ApplicationUser.cs b/Marco.Pms.Model/Entitlements/ApplicationUser.cs index aa04986..0906436 100644 --- a/Marco.Pms.Model/Entitlements/ApplicationUser.cs +++ b/Marco.Pms.Model/Entitlements/ApplicationUser.cs @@ -1,9 +1,5 @@ -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; -using Microsoft.Extensions.Logging; -using System.ComponentModel; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel; +using Microsoft.AspNetCore.Identity; namespace Marco.Pms.Model.Entitlements { diff --git a/Marco.Pms.Model/Mapper/TenantMapper.cs b/Marco.Pms.Model/Mapper/TenantMapper.cs index 9cfd660..35659a5 100644 --- a/Marco.Pms.Model/Mapper/TenantMapper.cs +++ b/Marco.Pms.Model/Mapper/TenantMapper.cs @@ -1,5 +1,4 @@ using Marco.Pms.Model.Dtos.Tenant; -using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; namespace Marco.Pms.Model.Mapper @@ -14,6 +13,8 @@ namespace Marco.Pms.Model.Mapper Description = createTenant.About, DomainName = createTenant.Website, ContactName = createTenant.Name, + //OragnizationSize = OragnizationSize, + //IndustryId = IndustryId, ContactNumber = createTenant.ContactNumber, OnBoardingDate = createTenant.OnBoardingDate, }; diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 37b3471..128af7e 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -217,7 +217,10 @@ namespace MarcoBMS.Services.Controllers try { Attendance attendance = await _context.Attendes.FirstOrDefaultAsync(a => a.EmployeeID == recordAttendanceDot.EmployeeID && - a.AttendanceDate.Date == recordAttendanceDot.Date.Date && a.TenantId == TenantId); ; + a.AttendanceDate.Date == recordAttendanceDot.Date.Date && a.TenantId == TenantId); + + DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); + if (attendance != null) @@ -236,13 +239,13 @@ namespace MarcoBMS.Services.Controllers //string timeString = "10:30 PM"; // Format: "hh:mm tt" - DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); + //DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); attendance.OutTime = finalDateTime; } else if (recordAttendanceDot.Action == ATTENDANCE_MARK_TYPE.REQUEST_REGULARIZE) { - DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); + //DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); attendance.OutTime = finalDateTime; attendance.Activity = ATTENDANCE_MARK_TYPE.REQUEST_REGULARIZE; @@ -277,7 +280,7 @@ namespace MarcoBMS.Services.Controllers attendance.Date = DateTime.UtcNow; - DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); + //DateTime finalDateTime = GetDateFromTimeStamp(recordAttendanceDot, recordAttendanceDot.MarkTime); attendance.InTime = finalDateTime; attendance.OutTime = null; @@ -295,7 +298,8 @@ namespace MarcoBMS.Services.Controllers AttendanceId = attendance.Id, // Use existing or new AttendanceId Activity = attendance.Activity, - ActivityTime = recordAttendanceDot.Date, + ActivityTime = finalDateTime, + //ActivityTime = recordAttendanceDot.Date, Comment = recordAttendanceDot.Comment, EmployeeID = recordAttendanceDot.EmployeeID, Latitude = recordAttendanceDot.Latitude, @@ -303,7 +307,8 @@ namespace MarcoBMS.Services.Controllers TenantId = TenantId, UpdatedBy = GetUserId(), - UpdatedOn = DateTime.UtcNow + UpdatedOn = recordAttendanceDot.Date + //UpdatedOn = DateTime.UtcNow }; //if (recordAttendanceDot.Image != null && recordAttendanceDot.Image.Count > 0) //{ diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index efe9485..ef89675 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -1,13 +1,14 @@ -using Marco.Pms.DataAccess.Data; +using System.Text.Json; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Mapper; +using Marco.Pms.Model.Utilities; +using MarcoBMS.Services.Service; 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 { @@ -18,10 +19,12 @@ namespace Marco.Pms.Services.Controllers 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) + private readonly ILoggingService _logger; + public TenantController(ApplicationDbContext context,UserManager userManager, ILoggingService logger) { _context = context; _userManager = userManager; + _logger = logger; } [HttpPost] public async Task CreateTenant([FromForm] CreateTenantDto createTenantDto) @@ -31,7 +34,7 @@ namespace Marco.Pms.Services.Controllers return BadRequest(ModelState); } - if (await _userManager.FindByEmailAsync(createTenantDto.Email) != null) + if (await _userManager.FindByEmailAsync(createTenantDto.Email) != null && await _context.Tenants.FirstOrDefaultAsync(t => t.Name == createTenantDto.OrganizatioinName) != null) { return BadRequest("Tenant Already Exists"); } @@ -39,46 +42,66 @@ namespace Marco.Pms.Services.Controllers 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) + + //Tenant? tenant = await _context.Tenants.FirstOrDefaultAsync(t => t.Name == newTenant.Name); + + if (newTenant != null) { RoleConfiguration settings = JsonSerializer.Deserialize(jsonString); - var TenantId = tenant.Id; + var TenantId = newTenant.Id; JobRole jobRole = new JobRole { Name = settings.JobRoleName, Description = settings.JobRoleDescription, TenantId = TenantId }; + var existingJobRole = await _context.JobRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Name == settings.JobRoleName); + ApplicationRole role = new ApplicationRole { Role = settings.RoleName, - Description = settings.JobRoleDescription, + Description = settings.RoleDescription, TenantId = TenantId }; - if (_context.JobRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Name == "Admin") != null) + var existingRole = await _context.ApplicationRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Role == settings.RoleName); + + if (existingJobRole == null) { _context.JobRoles.Add(jobRole); await _context.SaveChangesAsync(); } - if (_context.JobRoles.AsNoTracking().FirstOrDefaultAsync(r => r.Name == "SuperUser") != null) + else + { + jobRole = existingJobRole; + } + + if (existingRole == null) { _context.ApplicationRoles.Add(role); await _context.SaveChangesAsync(); } + else + { + role = existingRole; + } + List permissions = await _context.FeaturePermissions.AsNoTracking().ToListAsync(); - //List < RolePermissionMappings > = []; - foreach(var permission in permissions) + List rolePermissionMappings = new List(); + + 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); + rolePermissionMappings.Add(item); + } + _context.RolePermissionMappings.AddRange(rolePermissionMappings); await _context.SaveChangesAsync(); + var user = new ApplicationUser { - UserName = createTenantDto.Username, + UserName = createTenantDto.Email, Email = createTenantDto.Email, TenantId = TenantId, IsRootUser = true, @@ -109,7 +132,7 @@ namespace Marco.Pms.Services.Controllers foreach (var error in result.Errors) { // Log error.Description - Console.WriteLine($"UserManager Error: {error.Description}"); + _logger.LogError("{Error}",error.Description); } return BadRequest("Failed to create the root user."); } @@ -122,9 +145,7 @@ namespace Marco.Pms.Services.Controllers return new Employee { ApplicationUserId = ApplicationUserId, - //FirstName = model.FirstName, FirstName = model.Name, - //LastName = model.LastName, LastName = "", Email = model.Email, TenantId = TenantId, @@ -134,13 +155,11 @@ namespace Marco.Pms.Services.Controllers 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, diff --git a/Marco.Pms.Services/Data/RolesCofiguration.json b/Marco.Pms.Services/Data/RolesCofiguration.json index 9400eab..aa9034e 100644 --- a/Marco.Pms.Services/Data/RolesCofiguration.json +++ b/Marco.Pms.Services/Data/RolesCofiguration.json @@ -1,6 +1,6 @@ { "JobRoleName": "Admin", "JobRoleDescription": "Admin", - "RoleName": "SuperRole", - "RoleDescription": "SuperRole" + "RoleName": "SuperUser", + "RoleDescription": "SuperUser" } \ No newline at end of file diff --git a/Marco.Pms.Services/Helpers/UserHelper.cs b/Marco.Pms.Services/Helpers/UserHelper.cs index 4f1d42f..cc6bcc4 100644 --- a/Marco.Pms.Services/Helpers/UserHelper.cs +++ b/Marco.Pms.Services/Helpers/UserHelper.cs @@ -1,7 +1,5 @@ -using Marco.Pms.Model.Dtos.Employees; -using Marco.Pms.Model.Entitlements; +using System.Security.Claims; using Microsoft.AspNetCore.Identity; -using System.Security.Claims; namespace MarcoBMS.Services.Helpers { @@ -29,6 +27,7 @@ namespace MarcoBMS.Services.Helpers if (string.IsNullOrEmpty(userId)) return null; var user = await _userManager.FindByEmailAsync(userId); + //var user = await _userManager.FindByNameAsync(userId); // For fetching user using username return user; //await _userManager.FindByIdAsync(userId); } diff --git a/Marco.Pms.Services/Middleware/LoggingMiddleware.cs b/Marco.Pms.Services/Middleware/LoggingMiddleware.cs index 28535b2..cca31af 100644 --- a/Marco.Pms.Services/Middleware/LoggingMiddleware.cs +++ b/Marco.Pms.Services/Middleware/LoggingMiddleware.cs @@ -29,7 +29,7 @@ namespace MarcoBMS.Services.Middleware using (LogContext.PushProperty("TenantId", tenantId)) - using (LogContext.PushProperty("TraceId", context.TraceIdentifier)) + //using (LogContext.PushProperty("TraceId", context.TraceIdentifier)) using (LogContext.PushProperty("UserAgent", request.Headers["User-Agent"].ToString())) using (LogContext.PushProperty("HttpMethod", request.Method)) using (LogContext.PushProperty("Timestamp", DateTime.UtcNow)) @@ -44,7 +44,7 @@ namespace MarcoBMS.Services.Middleware using (LogContext.PushProperty("StatusCode", response.StatusCode.ToString())) using (LogContext.PushProperty("ResponseTimeMs", stopwatch.ElapsedMilliseconds)) using (LogContext.PushProperty("LogLevel", "Information")) - _logger.LogInformation("HTTP {method} {path} responded {statusCode} in {timeTaken} ms", request.Method,request.Path, response.StatusCode.ToString(),stopwatch.ElapsedMilliseconds); + _logger.LogInformation("HTTP {HttpMethod} {RequestPath} responded {statusCode} in {ResponseTimeMs} ms", request.Method,request.Path, response.StatusCode.ToString(),stopwatch.ElapsedMilliseconds); } catch (Exception ex) { @@ -53,7 +53,7 @@ namespace MarcoBMS.Services.Middleware using (LogContext.PushProperty("StatusCode", "500")) using (LogContext.PushProperty("ResponseTimeMs", stopwatch.ElapsedMilliseconds)) using (LogContext.PushProperty("LogLevel", "Error")) - _logger.LogError("API Error{error}", ex.Message); + _logger.LogError("API Error: {Error}", ex.Message); throw; } } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 29fbd01..6f95011 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -12,6 +12,7 @@ using Microsoft.OpenApi.Models; using Serilog; using System.Text; +Serilog.Debugging.SelfLog.Enable(Console.Error); var builder = WebApplication.CreateBuilder(args); diff --git a/Marco.Pms.Services/Service/ILoggingService.cs b/Marco.Pms.Services/Service/ILoggingService.cs index 744ab19..39dbb00 100644 --- a/Marco.Pms.Services/Service/ILoggingService.cs +++ b/Marco.Pms.Services/Service/ILoggingService.cs @@ -6,7 +6,7 @@ namespace MarcoBMS.Services.Service { void LogInfo(string? message, params object[]? args); void LogWarning(string? message, params object[]? args); - void LogError(Exception? ex, string? message, params object[]? args); + void LogError(string? message, params object[]? args); } } diff --git a/Marco.Pms.Services/Service/LoggingServices.cs b/Marco.Pms.Services/Service/LoggingServices.cs index aec6257..10fc5ab 100644 --- a/Marco.Pms.Services/Service/LoggingServices.cs +++ b/Marco.Pms.Services/Service/LoggingServices.cs @@ -11,9 +11,8 @@ namespace MarcoBMS.Services.Service _logger = logger; } - public void LogError(Exception? ex, string? message, params object[]? args) + public void LogError(string? message, params object[]? args) { - using (LogContext.PushProperty("Error", ex)) using (LogContext.PushProperty("LogLevel", "Error")) _logger.LogError(message, args); } diff --git a/Marco.Pms.Services/Service/RefreshTokenService.cs b/Marco.Pms.Services/Service/RefreshTokenService.cs index 9909283..b8240e1 100644 --- a/Marco.Pms.Services/Service/RefreshTokenService.cs +++ b/Marco.Pms.Services/Service/RefreshTokenService.cs @@ -1,16 +1,11 @@ -using Marco.Pms.DataAccess.Data; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; -using Marco.Pms.Model.Entitlements; -using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.IdentityModel.Tokens; -using Newtonsoft.Json.Linq; -using SharpCompress.Common; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Security.Cryptography; -using System.Text; namespace MarcoBMS.Services.Service diff --git a/Marco.Pms.Services/appsettings.json b/Marco.Pms.Services/appsettings.json index 95a7a52..5bb1e5e 100644 --- a/Marco.Pms.Services/appsettings.json +++ b/Marco.Pms.Services/appsettings.json @@ -21,16 +21,16 @@ "configure": [ { "Name": "MongoDB", - "Args": { - "databaseUrl": "mongodb://localhost:27017/DotNetLogs", - //"databaseUrl": "mongodb://devuser:xxxxx@147.93.98.152:27017/MarcoPMS?authSource=admin", - "collectionName": "application_logs", - "batchPostingLimit": 50, - "cappedMaxSizeMb": "1024", - "cappedMaxDocuments": "1000", - "rollingInterval": "Day" - //"outputTemplate": "[{Timestamp:yyyy/MM/dd HH:mm} {Level:u3}] {SourceContext}:{NewLine} {Message:lj}{Exception}{NewLine}" - } + "Args": { + "databaseUrl": "mongodb+srv://ashutoshnehete:OL1Cy0pTQaGn4hcP@marcopms.m32uppx.mongodb.net/MarcoPMS?retryWrites=true&w=majority", + //"databaseUrl": "mongodb://devuser:xxxxx@147.93.98.152:27017/MarcoPMS?authSource=admin", + "collectionName": "application_logs", + "batchPostingLimit": 50, + "cappedMaxSizeMb": "1024", + "cappedMaxDocuments": "1000", + "rollingInterval": "Day" + //"outputTemplate": "[{Timestamp:yyyy/MM/dd HH:mm} {Level:u3}] {SourceContext}:{NewLine} {Message:lj}{Exception}{NewLine}" + } }, { "Name": "File", @@ -64,8 +64,9 @@ "ConnectionStrings": { // "DefaultConnectionString": "Server=103.50.160.45;User ID=marcowvh_admin;Password=Marcoemp@123;Database=marcowvh_empattendanceci", - "DefaultConnectionString": "Server=localhost;port=3333;User ID=root;Password=root;Database=MarcoBMS1", - //"DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" + //"DefaultConnectionString": "Server=localhost;port=3306;User ID=root;Password=Ashutosh;Database=MarcoBMS1" + //"DefaultConnectionString": "Server=localhost;port=3333;User ID=root;Password=root;Database=MarcoBMS1", + "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" }, "AppSettings": { "WebFrontendUrl": "http://localhost:5173", -- 2.43.0