Restrict the user creation if the maximum user limit is reached
This commit is contained in:
parent
90a2b23c1a
commit
bc935282a5
@ -9,6 +9,7 @@ using Marco.Pms.Model.Projects;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.ViewModels.Activities;
|
||||
using Marco.Pms.Model.ViewModels.Employee;
|
||||
using Marco.Pms.Services.Helpers;
|
||||
using Marco.Pms.Services.Hubs;
|
||||
using Marco.Pms.Services.Service;
|
||||
using Marco.Pms.Services.Service.ServiceInterfaces;
|
||||
@ -36,6 +37,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
private readonly IEmailSender _emailSender;
|
||||
private readonly EmployeeHelper _employeeHelper;
|
||||
private readonly UserHelper _userHelper;
|
||||
private readonly GeneralHelper _generalHelper;
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly ILoggingService _logger;
|
||||
private readonly IHubContext<MarcoHub> _signalR;
|
||||
@ -47,13 +49,14 @@ namespace MarcoBMS.Services.Controllers
|
||||
|
||||
public EmployeeController(UserManager<ApplicationUser> userManager, IEmailSender emailSender,
|
||||
ApplicationDbContext context, EmployeeHelper employeeHelper, UserHelper userHelper, IConfiguration configuration, ILoggingService logger,
|
||||
IHubContext<MarcoHub> signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper)
|
||||
IHubContext<MarcoHub> signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper, GeneralHelper generalHelper)
|
||||
{
|
||||
_context = context;
|
||||
_userManager = userManager;
|
||||
_emailSender = emailSender;
|
||||
_employeeHelper = employeeHelper;
|
||||
_userHelper = userHelper;
|
||||
_generalHelper = generalHelper;
|
||||
_configuration = configuration;
|
||||
_logger = logger;
|
||||
_signalR = signalR;
|
||||
@ -191,6 +194,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
var response = await employeeQuery.Take(10).Select(e => _mapper.Map<BasicEmployeeVM>(e)).ToListAsync();
|
||||
return Ok(ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200));
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("search/{name}/{projectid?}")]
|
||||
public async Task<IActionResult> SearchEmployee(string name, Guid? projectid)
|
||||
@ -233,11 +237,6 @@ namespace MarcoBMS.Services.Controllers
|
||||
return _userHelper.GetTenantId();
|
||||
}
|
||||
|
||||
//[HttpPost("manage/quick")]
|
||||
//public async Task<IActionResult> CreateQuickUser([FromBody] CreateQuickUserDto model)
|
||||
//{
|
||||
// return Ok("Pending implementation");
|
||||
//}
|
||||
|
||||
[HttpPost("manage")]
|
||||
public async Task<IActionResult> CreateUser([FromBody] CreateUserDto model)
|
||||
@ -294,7 +293,12 @@ namespace MarcoBMS.Services.Controllers
|
||||
TenantId = tenantId
|
||||
|
||||
};
|
||||
|
||||
var isSeatsAvaiable = await _generalHelper.CheckSeatsRemaningAsync(tenantId);
|
||||
if (!isSeatsAvaiable)
|
||||
{
|
||||
_logger.LogWarning("Maximum number of users reached for Tenant {TenantId}", tenantId);
|
||||
return BadRequest(ApiResponse<object>.ErrorResponse("Maximum number of users reached. Cannot add new user", "Maximum number of users reached. Cannot add new user", 400));
|
||||
}
|
||||
// Create Identity User
|
||||
var result = await _userManager.CreateAsync(user, "User@123");
|
||||
if (!result.Succeeded)
|
||||
|
@ -296,5 +296,25 @@ namespace Marco.Pms.Services.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<bool> CheckSeatsRemaningAsync(Guid tenantId)
|
||||
{
|
||||
var totalSeatsTask = Task.Run(async () =>
|
||||
{
|
||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||
return await dbContext.TenantSubscriptions.Where(ts => ts.TenantId == tenantId && !ts.IsCancelled).Select(ts => ts.MaxUsers).FirstOrDefaultAsync();
|
||||
});
|
||||
var totalSeatsTakenTask = Task.Run(async () =>
|
||||
{
|
||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||
return await dbContext.Employees.Where(e => e.TenantId == tenantId && e.IsActive).CountAsync();
|
||||
});
|
||||
await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask);
|
||||
|
||||
var totalSeats = totalSeatsTask.Result;
|
||||
var totalSeatsTaken = totalSeatsTakenTask.Result;
|
||||
|
||||
return totalSeats >= totalSeatsTaken;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user