mirror of
https://github.com/alex289/CleanArchitecture.git
synced 2025-06-30 02:31: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.Api.Extensions;
|
||||||
using CleanArchitecture.Application.Extensions;
|
using CleanArchitecture.Application.Extensions;
|
||||||
using CleanArchitecture.Application.gRPC;
|
using CleanArchitecture.Application.gRPC;
|
||||||
@ -48,6 +49,8 @@ builder.Services.AddCommandHandlers();
|
|||||||
builder.Services.AddNotificationHandlers();
|
builder.Services.AddNotificationHandlers();
|
||||||
builder.Services.AddApiUser();
|
builder.Services.AddApiUser();
|
||||||
|
|
||||||
|
builder.Services.AddHostedService<SetInactiveUsersService>();
|
||||||
|
|
||||||
builder.Services.AddMediatR(cfg => { cfg.RegisterServicesFromAssemblies(typeof(Program).Assembly); });
|
builder.Services.AddMediatR(cfg => { cfg.RegisterServicesFromAssemblies(typeof(Program).Assembly); });
|
||||||
|
|
||||||
builder.Services.AddLogging(x => x.AddSimpleConsole(console =>
|
builder.Services.AddLogging(x => x.AddSimpleConsole(console =>
|
||||||
|
@ -68,6 +68,14 @@ public sealed class LoginUserCommandHandler : CommandHandlerBase,
|
|||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
user.SetActive();
|
||||||
|
user.SetLastLoggedinDate(DateTimeOffset.Now);
|
||||||
|
|
||||||
|
if (!await CommitAsync())
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
return BuildToken(
|
return BuildToken(
|
||||||
user,
|
user,
|
||||||
|
@ -10,6 +10,8 @@ public class User : Entity
|
|||||||
public string LastName { get; private set; }
|
public string LastName { get; private set; }
|
||||||
public string Password { get; private set; }
|
public string Password { get; private set; }
|
||||||
public UserRole Role { 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}";
|
public string FullName => $"{FirstName}, {LastName}";
|
||||||
|
|
||||||
@ -23,7 +25,8 @@ public class User : Entity
|
|||||||
string firstName,
|
string firstName,
|
||||||
string lastName,
|
string lastName,
|
||||||
string password,
|
string password,
|
||||||
UserRole role) : base(id)
|
UserRole role,
|
||||||
|
UserStatus status = UserStatus.Active) : base(id)
|
||||||
{
|
{
|
||||||
Email = email;
|
Email = email;
|
||||||
TenantId = tenantId;
|
TenantId = tenantId;
|
||||||
@ -31,6 +34,7 @@ public class User : Entity
|
|||||||
LastName = lastName;
|
LastName = lastName;
|
||||||
Password = password;
|
Password = password;
|
||||||
Role = role;
|
Role = role;
|
||||||
|
Status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetEmail(string email)
|
public void SetEmail(string email)
|
||||||
@ -62,4 +66,19 @@ public class User : Entity
|
|||||||
{
|
{
|
||||||
TenantId = tenantId;
|
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