LoginEventHandler.cs 1.77 KB
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;

/// <summary>
/// 登录成功后写 LoginLog;写库失败不得影响登录接口(如泰额 host 库无 LoginLog 表)。
/// </summary>
public class LoginEventHandler : ILocalEventHandler<LoginEventArgs>, ITransientDependency
{
    private readonly ILogger<LoginEventHandler> _logger;
    private readonly IRepository<LoginLogAggregateRoot> _loginLogRepository;

    public LoginEventHandler(
        ILogger<LoginEventHandler> logger,
        IRepository<LoginLogAggregateRoot> 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<LoginLogAggregateRoot>();
            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);
        }
    }
}