using Abp.Dependency;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Events.Bus.Entities;
using Abp.Events.Bus.Handlers;
using VberZero.BaseSystem.MultiTenancy;
using VberZero.BaseSystem.Users;
namespace VberZero.Authorization.Users;
///
/// 将用户的信息同步到用户帐户。
///
public class UserAccountSynchronizer :
IEventHandler>,
IEventHandler>,
IEventHandler>,
IEventHandler>,
ITransientDependency
{
private readonly IRepository _userAccountRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
///
/// Constructor
///
public UserAccountSynchronizer(
IRepository userAccountRepository,
IUnitOfWorkManager unitOfWorkManager)
{
_userAccountRepository = userAccountRepository;
_unitOfWorkManager = unitOfWorkManager;
}
///
/// 处理用户的创建事件
///
public virtual void HandleEvent(EntityCreatedEventData eventData)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
using (_unitOfWorkManager.Current.SetTenantId(null))
{
var userAccount = _userAccountRepository.FirstOrDefault(
ua => ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
);
if (userAccount == null)
{
_userAccountRepository.Insert(new UserAccount
{
TenantId = eventData.Entity.TenantId,
UserName = eventData.Entity.UserName,
UserId = eventData.Entity.Id,
EmailAddress = eventData.Entity.EmailAddress,
PhoneNumber = eventData.Entity.PhoneNumber
});
}
else
{
userAccount.UserName = eventData.Entity.UserName;
userAccount.EmailAddress = eventData.Entity.EmailAddress;
userAccount.PhoneNumber = eventData.Entity.PhoneNumber;
_userAccountRepository.Update(userAccount);
}
}
});
}
///
/// Handles deletion event of user
///
///
public virtual void HandleEvent(EntityDeletedEventData eventData)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
using (_unitOfWorkManager.Current.SetTenantId(null))
{
var userAccount = _userAccountRepository.FirstOrDefault(
ua => ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
);
if (userAccount != null)
{
_userAccountRepository.Delete(userAccount);
}
}
});
}
///
/// Handles update event of user
///
///
public virtual void HandleEvent(EntityUpdatedEventData eventData)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
using (_unitOfWorkManager.Current.SetTenantId(null))
{
var userAccount = _userAccountRepository.FirstOrDefault(ua =>
ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
);
if (userAccount != null)
{
userAccount.UserName = eventData.Entity.UserName;
userAccount.EmailAddress = eventData.Entity.EmailAddress;
userAccount.PhoneNumber = eventData.Entity.PhoneNumber;
_userAccountRepository.Update(userAccount);
}
}
});
}
///
/// Handles deletion event of tenant
///
///
public virtual void HandleEvent(EntityDeletedEventData eventData)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
using (_unitOfWorkManager.Current.SetTenantId(null))
{
_userAccountRepository.Delete(ua => ua.TenantId == eventData.Entity.Id);
}
});
}
}