From 307c7c96c206606752b6bed534309d7d0e1cab1b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 20 Aug 2025 12:19:16 +0530 Subject: [PATCH] Optimized the helper function --- Marco.Pms.Services/Helpers/GeneralHelper.cs | 85 +++++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index db7547d..45cdb13 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -296,24 +296,79 @@ namespace Marco.Pms.Services.Helpers } } - public async Task CheckSeatsRemaningAsync(Guid tenantId) + /// + /// Checks whether the tenant still has available seats (MaxUsers not exceeded). + /// + /// The ID of the tenant to check. + /// True if seats are available; otherwise false. + public async Task CheckSeatsRemainingAsync(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); + _logger.LogInfo("Checking seats remaining for TenantId: {TenantId}", tenantId); - var totalSeats = totalSeatsTask.Result; - var totalSeatsTaken = totalSeatsTakenTask.Result; + try + { + // 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; + } + } + + /// + /// Retrieves the maximum number of allowed seats (MaxUsers) for a tenant. + /// + private async Task 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; + } + + /// + /// Counts the number of active employees for a tenant. + /// + private async Task 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; } }