0
0
mirror of https://github.com/alex289/CleanArchitecture.git synced 2025-06-29 18:21:08 +00:00

feat: Add background service

This commit is contained in:
alex289 2023-08-31 20:13:36 +02:00
parent f46994c60a
commit ebf9cd36d7
No known key found for this signature in database
GPG Key ID: 573F77CD2D87F863
5 changed files with 107 additions and 1 deletions

View File

@ -0,0 +1,69 @@
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<SetInactiveUsersService> _logger;
public SetInactiveUsersService(
IServiceProvider serviceProvider,
ILogger<SetInactiveUsersService> logger)
{
_serviceProvider = serviceProvider;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var scope = _serviceProvider.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
IList<User> inactiveUsers = Array.Empty<User>();
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);
}
}
}

View File

@ -1,3 +1,4 @@
using CleanArchitecture.Api.BackgroundServices;
using CleanArchitecture.Api.Extensions;
using CleanArchitecture.Application.Extensions;
using CleanArchitecture.Application.gRPC;
@ -48,6 +49,8 @@ builder.Services.AddCommandHandlers();
builder.Services.AddNotificationHandlers();
builder.Services.AddApiUser();
builder.Services.AddHostedService<SetInactiveUsersService>();
builder.Services.AddMediatR(cfg => { cfg.RegisterServicesFromAssemblies(typeof(Program).Assembly); });
builder.Services.AddLogging(x => x.AddSimpleConsole(console =>

View File

@ -68,6 +68,14 @@ public sealed class LoginUserCommandHandler : CommandHandlerBase,
return "";
}
user.SetActive();
user.SetLastLoggedinDate(DateTimeOffset.Now);
if (!await CommitAsync())
{
return "";
}
return BuildToken(
user,

View File

@ -10,6 +10,8 @@ public class User : Entity
public string LastName { get; private set; }
public string Password { get; private set; }
public UserRole Role { get; private set; }
public UserStatus Status { get; private set; }
public DateTimeOffset? LastLoggedinDate { get; private set; }
public string FullName => $"{FirstName}, {LastName}";
@ -23,7 +25,8 @@ public class User : Entity
string firstName,
string lastName,
string password,
UserRole role) : base(id)
UserRole role,
UserStatus status = UserStatus.Active) : base(id)
{
Email = email;
TenantId = tenantId;
@ -31,6 +34,7 @@ public class User : Entity
LastName = lastName;
Password = password;
Role = role;
Status = status;
}
public void SetEmail(string email)
@ -62,4 +66,19 @@ public class User : Entity
{
TenantId = tenantId;
}
public void SetLastLoggedinDate(DateTimeOffset lastLoggedinDate)
{
LastLoggedinDate = lastLoggedinDate;
}
public void SetInactive()
{
Status = UserStatus.Inactive;
}
public void SetActive()
{
Status = UserStatus.Active;
}
}

View File

@ -0,0 +1,7 @@
namespace CleanArchitecture.Domain.Enums;
public enum UserStatus
{
Active,
Inactive
}