UserAppService.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using BaseService.BaseData;
  2. using BaseService.Systems.UserManagement.Dto;
  3. using Microsoft.AspNetCore.Authorization;
  4. using Microsoft.AspNetCore.Identity;
  5. using Microsoft.EntityFrameworkCore;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. using Volo.Abp.Application.Dtos;
  11. using Volo.Abp.Application.Services;
  12. using Volo.Abp.Domain.Repositories;
  13. using Volo.Abp.Identity;
  14. using Volo.Abp.ObjectExtending;
  15. namespace BaseService.Systems.UserManagement
  16. {
  17. [Authorize(IdentityPermissions.Users.Default)]
  18. public class UserAppService : ApplicationService, IUserAppService
  19. {
  20. protected IdentityUserManager UserManager { get; }
  21. protected IIdentityUserRepository UserRepository { get; }
  22. public IIdentityRoleRepository RoleRepository { get; }
  23. private readonly IRepository<Organization, Guid> _orgRepository;
  24. private readonly IRepository<UserJob> _userJobsRepository;
  25. private readonly IRepository<UserOrganization> _userOrgsRepository;
  26. public UserAppService(
  27. IdentityUserManager userManager,
  28. IIdentityUserRepository userRepository,
  29. IIdentityRoleRepository roleRepository,
  30. IRepository<Organization, Guid> orgRepository,
  31. IRepository<UserJob> userJobsRepository,
  32. IRepository<UserOrganization> userOrgsRepository
  33. )
  34. {
  35. UserManager = userManager;
  36. UserRepository = userRepository;
  37. RoleRepository = roleRepository;
  38. _orgRepository = orgRepository;
  39. _userJobsRepository = userJobsRepository;
  40. _userOrgsRepository = userOrgsRepository;
  41. }
  42. public async Task<BaseIdentityUserDto> Get(Guid id)
  43. {
  44. var dto = ObjectMapper.Map<IdentityUser, BaseIdentityUserDto>(await UserManager.GetByIdAsync(id));
  45. var jobIds = await (await _userJobsRepository.GetQueryableAsync()).Where(_ => _.UserId == id).Select(_ => _.JobId).ToListAsync();
  46. var orgIds = await (await _userOrgsRepository.GetQueryableAsync()).Where(_ => _.UserId == id).Select(_ => _.OrganizationId).ToListAsync();
  47. dto.JobIds = jobIds;
  48. dto.OrganizationIds = orgIds;
  49. return dto;
  50. }
  51. [Authorize(IdentityPermissions.Users.Create)]
  52. public async Task<IdentityUserDto> Create(BaseIdentityUserCreateDto input)
  53. {
  54. var user = new IdentityUser(
  55. GuidGenerator.Create(),
  56. input.UserName,
  57. input.Email,
  58. CurrentTenant.Id
  59. );
  60. input.MapExtraPropertiesTo(user);
  61. (await UserManager.CreateAsync(user, input.Password)).CheckErrors();
  62. await UpdateUserByInput(user, input);
  63. var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
  64. foreach (var id in input.JobIds)
  65. {
  66. await _userJobsRepository.InsertAsync(new UserJob(CurrentTenant.Id, user.Id, id));
  67. }
  68. foreach (var id in input.OrganizationIds)
  69. {
  70. await _userOrgsRepository.InsertAsync(new UserOrganization(CurrentTenant.Id, user.Id, id));
  71. }
  72. await CurrentUnitOfWork.SaveChangesAsync();
  73. return dto;
  74. }
  75. [Authorize(IdentityPermissions.Users.Update)]
  76. public async Task<IdentityUserDto> UpdateAsync(Guid id, BaseIdentityUserUpdateDto input)
  77. {
  78. var user = await UserManager.GetByIdAsync(id);
  79. user.ConcurrencyStamp = input.ConcurrencyStamp;
  80. (await UserManager.SetUserNameAsync(user, input.UserName)).CheckErrors();
  81. await UpdateUserByInput(user, input);
  82. input.MapExtraPropertiesTo(user);
  83. (await UserManager.UpdateAsync(user)).CheckErrors();
  84. if (!input.Password.IsNullOrEmpty())
  85. {
  86. (await UserManager.RemovePasswordAsync(user)).CheckErrors();
  87. (await UserManager.AddPasswordAsync(user, input.Password)).CheckErrors();
  88. }
  89. var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
  90. await _userJobsRepository.DeleteAsync(_ => _.UserId == id);
  91. foreach (var jid in input.JobIds)
  92. {
  93. await _userJobsRepository.InsertAsync(new UserJob(CurrentTenant.Id, id, jid));
  94. }
  95. await _userOrgsRepository.DeleteAsync(_ => _.UserId == id);
  96. foreach (var oid in input.OrganizationIds)
  97. {
  98. await _userOrgsRepository.InsertAsync(new UserOrganization(CurrentTenant.Id, id, oid));
  99. }
  100. await CurrentUnitOfWork.SaveChangesAsync();
  101. return dto;
  102. }
  103. public async Task<PagedResultDto<BaseIdentityUserDto>> GetAll(GetBaseIdentityUsersInput input)
  104. {
  105. var orgQueryable = await _orgRepository.GetQueryableAsync();
  106. var userOrgQueryable = await _userOrgsRepository.GetQueryableAsync();
  107. if (input.OrganizationId.HasValue)
  108. {
  109. var userDbSet = await UserRepository.GetDbSetAsync();
  110. var org = await _orgRepository.GetAsync(input.OrganizationId.Value);
  111. var orgs = await (await _orgRepository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(org.CascadeId)).ToListAsync();
  112. var totalCount = await userOrgQueryable.Where(_ => orgs.Select(o => o.Id).Contains(_.OrganizationId))
  113. .GroupBy(_ => _.UserId)
  114. .LongCountAsync();
  115. //TODO: Redis Query
  116. var userIds = await userOrgQueryable.Where(_ => orgs.Select(o => o.Id).Contains(_.OrganizationId))
  117. .Select(_ => _.UserId)
  118. .Distinct()
  119. .Skip(input.SkipCount)
  120. .Take(input.MaxResultCount)
  121. .ToListAsync();
  122. var items = await userDbSet.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.UserName.Contains(input.Filter))
  123. .Where(_ => userIds.Contains(_.Id)).ToListAsync();
  124. var userOrgs = await userOrgQueryable.Where(_ => items.Select(i => i.Id).Contains(_.UserId))
  125. .ToListAsync();
  126. var allOrg = await orgQueryable.Where(_ => userOrgs.Select(uo => uo.OrganizationId).Contains(_.Id))
  127. .OrderBy(_ => _.CascadeId)
  128. .ToListAsync();
  129. var dtos = ObjectMapper.Map<List<IdentityUser>, List<BaseIdentityUserDto>>(items);
  130. foreach (var dto in dtos)
  131. {
  132. var oids = userOrgs.Where(_ => _.UserId == dto.Id).Select(_ => _.OrganizationId);
  133. dto.OrganizationNames = string.Join(", ", allOrg.Where(_ => oids.Contains(_.Id)).Select(_ => _.Name).ToArray());
  134. }
  135. return new PagedResultDto<BaseIdentityUserDto>(totalCount, dtos);
  136. }
  137. else
  138. {
  139. var totalCount = await UserRepository.GetCountAsync(input.Filter);
  140. var items = await UserRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter);
  141. //TODO: Redis Query
  142. var userOrgs = await userOrgQueryable.Where(_ => items.Select(i => i.Id).Contains(_.UserId))
  143. .ToListAsync();
  144. var orgs = await orgQueryable.Where(_ => userOrgs.Select(uo => uo.OrganizationId).Contains(_.Id))
  145. .OrderBy(_ => _.CascadeId)
  146. .ToListAsync();
  147. var dtos = ObjectMapper.Map<List<IdentityUser>, List<BaseIdentityUserDto>>(items);
  148. foreach (var dto in dtos)
  149. {
  150. var oids = userOrgs.Where(_ => _.UserId == dto.Id).Select(_ => _.OrganizationId);
  151. dto.OrganizationNames = string.Join(", ", orgs.Where(_ => oids.Contains(_.Id)).Select(_ => _.Name).ToArray());
  152. }
  153. return new PagedResultDto<BaseIdentityUserDto>(totalCount, dtos);
  154. }
  155. }
  156. protected virtual async Task UpdateUserByInput(IdentityUser user, IdentityUserCreateOrUpdateDtoBase input)
  157. {
  158. if (!string.Equals(user.Email, input.Email, StringComparison.InvariantCultureIgnoreCase))
  159. {
  160. (await UserManager.SetEmailAsync(user, input.Email)).CheckErrors();
  161. }
  162. if (!string.Equals(user.PhoneNumber, input.PhoneNumber, StringComparison.InvariantCultureIgnoreCase))
  163. {
  164. (await UserManager.SetPhoneNumberAsync(user, input.PhoneNumber)).CheckErrors();
  165. }
  166. (await UserManager.SetLockoutEnabledAsync(user, input.LockoutEnabled)).CheckErrors();
  167. user.Name = input.Name;
  168. user.Surname = input.Surname;
  169. if (input.RoleNames != null)
  170. {
  171. (await UserManager.SetRolesAsync(user, input.RoleNames)).CheckErrors();
  172. }
  173. }
  174. }
  175. }