feat/Update_Controllers_to_Allow_for_Premium_Membership

This commit is contained in:
cesnimda
2026-08-03 09:17:28 +02:00
parent de937d25dc
commit c3f4a57195
187 changed files with 26062 additions and 991 deletions
@@ -0,0 +1,57 @@
using JobTrackerApi.Data;
using Microsoft.EntityFrameworkCore;
namespace JobTrackerApi.Services;
public sealed record BackgroundWorkerRunResult(bool Enabled, int Owners, int Succeeded, int Failed)
{
public static readonly BackgroundWorkerRunResult Disabled = new(false, 0, 0, 0);
}
public sealed class BackgroundTenantRunner(
IServiceScopeFactory scopes,
ILogger<BackgroundTenantRunner> logger)
{
public async Task<BackgroundWorkerRunResult> RunForJobOwnersAsync(
string worker,
Func<IServiceProvider, CancellationToken, Task> work,
CancellationToken cancellationToken)
{
await using var enumerationScope = scopes.CreateAsyncScope();
var ownerIds = await enumerationScope.ServiceProvider.GetRequiredService<JobTrackerContext>()
.JobApplications.IgnoreQueryFilters().AsNoTracking()
.Where(job => job.OwnerUserId != null)
.Select(job => job.OwnerUserId!)
.ToListAsync(cancellationToken);
var owners = ownerIds.Where(owner => !string.IsNullOrWhiteSpace(owner))
.Distinct(StringComparer.Ordinal)
.Order(StringComparer.Ordinal)
.ToList();
var succeeded = 0;
var failed = 0;
foreach (var owner in owners)
{
await using var ownerScope = scopes.CreateAsyncScope();
using var ownerContext = ownerScope.ServiceProvider.GetRequiredService<CurrentUserService>()
.UseBackgroundUser(owner);
try
{
await work(ownerScope.ServiceProvider, cancellationToken);
succeeded++;
}
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
{
throw;
}
catch (Exception ex)
{
failed++;
logger.LogWarning("{Worker} owner pass failed with {FailureCategory}; private owner data was omitted from the log.", worker, ex.GetType().Name);
}
}
logger.LogInformation("{Worker} pass complete: {Owners} owners, {Succeeded} succeeded, {Failed} failed.", worker, owners.Count, succeeded, failed);
return new BackgroundWorkerRunResult(true, owners.Count, succeeded, failed);
}
}