using Abp.BackgroundJobs;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Extensions;
using Abp.Threading.BackgroundWorkers;
using Abp.Threading.Timers;
using Abp.Timing;
using VberZero.BaseSystem.MultiTenancy;
using VberZero.BaseSystem.Users;
namespace VberZero.Authorization.Users;
///
/// UserToken 过期工作者
///
public class UserTokenExpirationWorker : PeriodicBackgroundWorkerBase
{
private readonly IRepository _userTokenRepository;
private readonly IRepository _tenantRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public UserTokenExpirationWorker(
AbpTimer timer,
IRepository userTokenRepository,
IBackgroundJobConfiguration backgroundJobConfiguration,
IUnitOfWorkManager unitOfWorkManager,
IRepository tenantRepository)
: base(timer)
{
_userTokenRepository = userTokenRepository;
_unitOfWorkManager = unitOfWorkManager;
_tenantRepository = tenantRepository;
Timer.Period = backgroundJobConfiguration.UserTokenExpirationPeriod?.TotalMilliseconds.To()
//?? backgroundJobConfiguration.CleanUserTokenPeriod
?? TimeSpan.FromHours(1).TotalMilliseconds.To();
}
protected override void DoWork()
{
try
{
List tenantIds;
var utcNow = Clock.Now.ToUniversalTime();
using (var uow = _unitOfWorkManager.Begin())
{
using (_unitOfWorkManager.Current.SetTenantId(null))
{
_userTokenRepository.Delete(t => t.ExpireDate <= utcNow);
tenantIds = _tenantRepository.GetAll().Select(t => t.Id).ToList();
uow.Complete();
}
}
foreach (var tenantId in tenantIds)
{
using var uow = _unitOfWorkManager.Begin();
using (_unitOfWorkManager.Current.SetTenantId(tenantId))
{
_userTokenRepository.Delete(t => t.ExpireDate <= utcNow);
uow.Complete();
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}