Restrict the user creation if the maximum user limit is reached #111
@ -296,24 +296,79 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> CheckSeatsRemaningAsync(Guid tenantId)
|
/// <summary>
|
||||||
|
/// Checks whether the tenant still has available seats (MaxUsers not exceeded).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tenantId">The ID of the tenant to check.</param>
|
||||||
|
/// <returns>True if seats are available; otherwise false.</returns>
|
||||||
|
public async Task<bool> CheckSeatsRemainingAsync(Guid tenantId)
|
||||||
{
|
{
|
||||||
var totalSeatsTask = Task.Run(async () =>
|
_logger.LogInfo("Checking seats remaining for TenantId: {TenantId}", tenantId);
|
||||||
{
|
|
||||||
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;
|
try
|
||||||
var totalSeatsTaken = totalSeatsTakenTask.Result;
|
{
|
||||||
|
// Run both queries concurrently
|
||||||
|
var totalSeatsTask = GetMaxSeatsAsync(tenantId);
|
||||||
|
var totalSeatsTakenTask = GetActiveEmployeesCountAsync(tenantId);
|
||||||
|
|
||||||
return totalSeats >= totalSeatsTaken;
|
await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask);
|
||||||
|
|
||||||
|
var totalSeats = await totalSeatsTask;
|
||||||
|
var totalSeatsTaken = await totalSeatsTakenTask;
|
||||||
|
|
||||||
|
_logger.LogInfo(
|
||||||
|
"TenantId: {TenantId} | TotalSeats: {TotalSeats} | SeatsTaken: {SeatsTaken}",
|
||||||
|
tenantId, totalSeats, totalSeatsTaken);
|
||||||
|
|
||||||
|
bool seatsAvailable = totalSeats >= totalSeatsTaken;
|
||||||
|
|
||||||
|
_logger.LogDebug("TenantId: {TenantId} | Seats Available: {SeatsAvailable}",
|
||||||
|
tenantId, seatsAvailable);
|
||||||
|
|
||||||
|
return seatsAvailable;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error checking seats for TenantId: {TenantId}", tenantId);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the maximum number of allowed seats (MaxUsers) for a tenant.
|
||||||
|
/// </summary>
|
||||||
|
private async Task<double> GetMaxSeatsAsync(Guid tenantId)
|
||||||
|
{
|
||||||
|
_logger.LogDebug("Fetching maximum seats for TenantId: {TenantId}", tenantId);
|
||||||
|
|
||||||
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
|
|
||||||
|
var maxSeats = await dbContext.TenantSubscriptions
|
||||||
|
.Where(ts => ts.TenantId == tenantId && !ts.IsCancelled)
|
||||||
|
.Select(ts => ts.MaxUsers)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
_logger.LogDebug("TenantId: {TenantId} | MaxSeats: {MaxSeats}", tenantId, maxSeats);
|
||||||
|
|
||||||
|
return maxSeats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Counts the number of active employees for a tenant.
|
||||||
|
/// </summary>
|
||||||
|
private async Task<int> GetActiveEmployeesCountAsync(Guid tenantId)
|
||||||
|
{
|
||||||
|
_logger.LogDebug("Counting active employees for TenantId: {TenantId}", tenantId);
|
||||||
|
|
||||||
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
|
|
||||||
|
var activeEmployees = await dbContext.Employees
|
||||||
|
.Where(e => e.TenantId == tenantId && e.IsActive)
|
||||||
|
.CountAsync();
|
||||||
|
|
||||||
|
_logger.LogDebug("TenantId: {TenantId} | ActiveEmployees: {ActiveEmployees}", tenantId, activeEmployees);
|
||||||
|
|
||||||
|
return activeEmployees;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user