using Mapster;
using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus;
using Volo.Abp.Uow;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.Rbac.Domain.Shared.Etos;
namespace Yi.Framework.Rbac.Domain.EventHandlers;
///
/// 登录成功后写 LoginLog;写库失败不得影响登录接口(如泰额 host 库无 LoginLog 表)。
///
public class LoginEventHandler : ILocalEventHandler, ITransientDependency
{
private readonly ILogger _logger;
private readonly IRepository _loginLogRepository;
public LoginEventHandler(
ILogger logger,
IRepository loginLogRepository)
{
_logger = logger;
_loginLogRepository = loginLogRepository;
}
[UnitOfWork(isTransactional: false)]
public async Task HandleEventAsync(LoginEventArgs eventData)
{
try
{
_logger.LogInformation("用户【{UserId}:{UserName}】登入系统", eventData.UserId, eventData.UserName);
var loginLogEntity = eventData.Adapt();
loginLogEntity.LogMsg = eventData.UserName + "登录系统";
loginLogEntity.LoginUser = eventData.UserName;
loginLogEntity.CreatorId = eventData.UserId;
await _loginLogRepository.InsertAsync(loginLogEntity, autoSave: true);
}
catch (Exception ex)
{
_logger.LogWarning(
ex,
"LoginLog insert skipped for user {UserId} ({UserName}); current database may not have LoginLog table.",
eventData.UserId,
eventData.UserName);
}
}
}