diff --git a/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs b/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs index c2856673c2..1af6e86581 100644 --- a/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs +++ b/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs @@ -7,6 +7,6 @@ namespace Volo.Abp.Identity { public interface IIdentityUserAppService : IAsyncCrudAppService { - + Task> GetRolesAsync(Guid id); } } diff --git a/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserRoleInfoDto.cs b/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleDto.cs similarity index 68% rename from src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserRoleInfoDto.cs rename to src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleDto.cs index a5dbc9db3a..cb48f53146 100644 --- a/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserRoleInfoDto.cs +++ b/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleDto.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.Identity { - public class IdentityUserRoleInfoDto : EntityDto + public class IdentityRoleDto : EntityDto { public string Name { get; set; } } diff --git a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpDeskApplicationModuleAutoMapperProfile.cs b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpDeskApplicationModuleAutoMapperProfile.cs index ec4ff20850..e796a0a7ae 100644 --- a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpDeskApplicationModuleAutoMapperProfile.cs +++ b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/AbpDeskApplicationModuleAutoMapperProfile.cs @@ -7,6 +7,7 @@ namespace Volo.Abp.Identity public AbpIdentityApplicationModuleAutoMapperProfile() { CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs index d4af50528e..548f47bf24 100644 --- a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs +++ b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs @@ -67,6 +67,14 @@ namespace Volo.Abp.Identity await _userManager.DeleteAsync(user); } + public async Task> GetRolesAsync(Guid id) + { + var roles = await _userRepository.GetRolesAsync(id); + return new ListResultDto( + ObjectMapper.Map, List>(roles) + ); + } + private async Task UpdateUserByInput(IdentityUser user, IdentityUserCreateOrUpdateDtoBase input) { await _userManager.SetEmailAsync(user, input.Email); diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs index 477f8da6c7..a845d8faf8 100644 --- a/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs @@ -82,5 +82,14 @@ namespace Volo.Abp.Identity { return await this.OrderBy(sorting ?? nameof(IdentityUser.UserName)).PageBy(skipCount, maxResultCount).ToListAsync(); } + + public async Task> GetRolesAsync(Guid userId) + { + var query = from userRole in DbContext.UserRoles + join role in DbContext.Roles on userRole.RoleId equals role.Id + select role; + + return await query.ToListAsync(); + } } } diff --git a/src/Volo.Abp.Identity/Properties/AssemblyInfo.cs b/src/Volo.Abp.Identity/Properties/AssemblyInfo.cs index 9228f2e1ca..9e3183705f 100644 --- a/src/Volo.Abp.Identity/Properties/AssemblyInfo.cs +++ b/src/Volo.Abp.Identity/Properties/AssemblyInfo.cs @@ -1,4 +1,5 @@ using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -8,6 +9,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Volo.Abp.Identity")] [assembly: AssemblyTrademark("")] +[assembly: InternalsVisibleTo("Volo.Abp.Identity.Application.Tests")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IIdentityUserRepository.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IIdentityUserRepository.cs index e28253d081..d583b83f46 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -25,5 +25,7 @@ namespace Volo.Abp.Identity Task> GetListByNormalizedRoleNameAsync(string normalizedRoleName, CancellationToken cancellationToken); Task> GetListAsync(string sorting, int maxResultCount, int skipCount); + + Task> GetRolesAsync(Guid userId); } } diff --git a/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs b/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs index ebdc325b6d..0ef2ad4524 100644 --- a/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs +++ b/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs @@ -9,6 +9,10 @@ namespace Volo.Abp.Identity private readonly IIdentityUserRepository _userRepository; private readonly IIdentityRoleRepository _roleRepository; + private IdentityRole _adminRole; + private IdentityRole _moderator; + private IdentityRole _supporterRole; + public AbpIdentityTestDataBuilder( IGuidGenerator guidGenerator, IIdentityUserRepository userRepository, @@ -27,14 +31,20 @@ namespace Volo.Abp.Identity private void AddRoles() { - _roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "admin")); - _roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "moderator")); - _roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "supporter")); + _adminRole = new IdentityRole(_guidGenerator.Create(), "admin"); + _moderator = new IdentityRole(_guidGenerator.Create(), "moderator"); + _supporterRole = new IdentityRole(_guidGenerator.Create(), "supporter"); + + _roleRepository.Insert(_adminRole); + _roleRepository.Insert(_moderator); + _roleRepository.Insert(_supporterRole); } private void AddUsers() { - _userRepository.Insert(new IdentityUser(_guidGenerator.Create(), "john.nash")); + var john = new IdentityUser(_guidGenerator.Create(), "john.nash"); + john.Roles.Add(new IdentityUserRole(_guidGenerator.Create(), john.Id, _moderator.Id)); + _userRepository.Insert(john); } } } \ No newline at end of file diff --git a/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs b/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs index 25aa11dbe7..9c891bf859 100644 --- a/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs +++ b/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs @@ -140,6 +140,23 @@ namespace Volo.Abp.Identity (await FindUserAsync("john.nash")).ShouldBeNull(); } + [Fact] + public async Task GetRolesAsync() + { + //Arrange + + var johnNash = await GetUserAsync("john.nash"); + + //Act + + var result = await _identityUserAppService.GetRolesAsync(johnNash.Id); + + //Assert + + result.Items.Count.ShouldBe(1); + result.Items[0].Name.ShouldBe("moderator"); + } + private async Task GetUserAsync(string userName) { return (await _userRepository.GetListAsync()).First(u => u.UserName == userName);