UserAccountSynchronizer.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using Abp.Dependency;
  2. using Abp.Domain.Repositories;
  3. using Abp.Domain.Uow;
  4. using Abp.Events.Bus.Entities;
  5. using Abp.Events.Bus.Handlers;
  6. using VberZero.BaseSystem.MultiTenancy;
  7. using VberZero.BaseSystem.Users;
  8. namespace VberZero.Authorization.Users;
  9. /// <summary>
  10. /// 将用户的信息同步到用户帐户。
  11. /// </summary>
  12. public class UserAccountSynchronizer :
  13. IEventHandler<EntityCreatedEventData<User>>,
  14. IEventHandler<EntityDeletedEventData<User>>,
  15. IEventHandler<EntityUpdatedEventData<User>>,
  16. IEventHandler<EntityDeletedEventData<Tenant>>,
  17. ITransientDependency
  18. {
  19. private readonly IRepository<UserAccount, long> _userAccountRepository;
  20. private readonly IUnitOfWorkManager _unitOfWorkManager;
  21. /// <summary>
  22. /// Constructor
  23. /// </summary>
  24. public UserAccountSynchronizer(
  25. IRepository<UserAccount, long> userAccountRepository,
  26. IUnitOfWorkManager unitOfWorkManager)
  27. {
  28. _userAccountRepository = userAccountRepository;
  29. _unitOfWorkManager = unitOfWorkManager;
  30. }
  31. /// <summary>
  32. /// 处理用户的创建事件
  33. /// </summary>
  34. public virtual void HandleEvent(EntityCreatedEventData<User> eventData)
  35. {
  36. _unitOfWorkManager.WithUnitOfWork(() =>
  37. {
  38. using (_unitOfWorkManager.Current.SetTenantId(null))
  39. {
  40. var userAccount = _userAccountRepository.FirstOrDefault(
  41. ua => ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
  42. );
  43. if (userAccount == null)
  44. {
  45. _userAccountRepository.Insert(new UserAccount
  46. {
  47. TenantId = eventData.Entity.TenantId,
  48. UserName = eventData.Entity.UserName,
  49. UserId = eventData.Entity.Id,
  50. EmailAddress = eventData.Entity.EmailAddress,
  51. PhoneNumber = eventData.Entity.PhoneNumber
  52. });
  53. }
  54. else
  55. {
  56. userAccount.UserName = eventData.Entity.UserName;
  57. userAccount.EmailAddress = eventData.Entity.EmailAddress;
  58. userAccount.PhoneNumber = eventData.Entity.PhoneNumber;
  59. _userAccountRepository.Update(userAccount);
  60. }
  61. }
  62. });
  63. }
  64. /// <summary>
  65. /// Handles deletion event of user
  66. /// </summary>
  67. /// <param name="eventData"></param>
  68. public virtual void HandleEvent(EntityDeletedEventData<User> eventData)
  69. {
  70. _unitOfWorkManager.WithUnitOfWork(() =>
  71. {
  72. using (_unitOfWorkManager.Current.SetTenantId(null))
  73. {
  74. var userAccount = _userAccountRepository.FirstOrDefault(
  75. ua => ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
  76. );
  77. if (userAccount != null)
  78. {
  79. _userAccountRepository.Delete(userAccount);
  80. }
  81. }
  82. });
  83. }
  84. /// <summary>
  85. /// Handles update event of user
  86. /// </summary>
  87. /// <param name="eventData"></param>
  88. public virtual void HandleEvent(EntityUpdatedEventData<User> eventData)
  89. {
  90. _unitOfWorkManager.WithUnitOfWork(() =>
  91. {
  92. using (_unitOfWorkManager.Current.SetTenantId(null))
  93. {
  94. var userAccount = _userAccountRepository.FirstOrDefault(ua =>
  95. ua.TenantId == eventData.Entity.TenantId && ua.UserId == eventData.Entity.Id
  96. );
  97. if (userAccount != null)
  98. {
  99. userAccount.UserName = eventData.Entity.UserName;
  100. userAccount.EmailAddress = eventData.Entity.EmailAddress;
  101. userAccount.PhoneNumber = eventData.Entity.PhoneNumber;
  102. _userAccountRepository.Update(userAccount);
  103. }
  104. }
  105. });
  106. }
  107. /// <summary>
  108. /// Handles deletion event of tenant
  109. /// </summary>
  110. /// <param name="eventData"></param>
  111. public virtual void HandleEvent(EntityDeletedEventData<Tenant> eventData)
  112. {
  113. _unitOfWorkManager.WithUnitOfWork(() =>
  114. {
  115. using (_unitOfWorkManager.Current.SetTenantId(null))
  116. {
  117. _userAccountRepository.Delete(ua => ua.TenantId == eventData.Entity.Id);
  118. }
  119. });
  120. }
  121. }