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); } }); } }