using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using CleanArchitecture.Domain.Entities; using CleanArchitecture.Domain.Enums; using CleanArchitecture.Infrastructure.Database; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace CleanArchitecture.Api.BackgroundServices; public sealed class SetInactiveUsersService : BackgroundService { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; public SetInactiveUsersService( IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var scope = _serviceProvider.CreateScope(); var context = scope.ServiceProvider.GetRequiredService(); IList inactiveUsers = Array.Empty(); try { inactiveUsers = await context.Users .Where(user => user.LastLoggedinDate < DateTime.UtcNow.AddDays(-30) && user.Status == UserStatus.Active) .Take(250) .ToListAsync(stoppingToken); } catch (Exception ex) { _logger.LogError(ex, "Error while retrieving users to set inactive"); } foreach (var user in inactiveUsers) { user.SetInactive(); } try { await context.SaveChangesAsync(stoppingToken); } catch (Exception ex) { _logger.LogError(ex, "Error while setting users to inactive"); } await Task.Delay(TimeSpan.FromDays(1), stoppingToken); } } }