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:
parent
f46994c60a
commit
ebf9cd36d7
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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 =>
|
||||
|
@ -68,6 +68,14 @@ public sealed class LoginUserCommandHandler : CommandHandlerBase,
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
user.SetActive();
|
||||
user.SetLastLoggedinDate(DateTimeOffset.Now);
|
||||
|
||||
if (!await CommitAsync())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
return BuildToken(
|
||||
user,
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
7
CleanArchitecture.Domain/Enums/UserStatus.cs
Normal file
7
CleanArchitecture.Domain/Enums/UserStatus.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace CleanArchitecture.Domain.Enums;
|
||||
|
||||
public enum UserStatus
|
||||
{
|
||||
Active,
|
||||
Inactive
|
||||
}
|
Loading…
Reference in New Issue
Block a user