From 1f61892afec99ef7832dae944cf7bbe84988b321 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Thu, 29 Jul 2021 16:18:21 +0300 Subject: [PATCH] Feat: Add Organization name on Organization memberships page --- .../Organizations/IOrganizationAppService.cs | 2 ++ .../Memberships/OrganizationMemberDto.cs | 2 ++ .../EventHubApplicationAutoMapperProfile.cs | 4 +-- .../OrganizationMembershipAppService.cs | 4 +-- .../Organizations/OrganizationAppService.cs | 21 +++++++++++++++ .../Organizations/OrganizationController.cs | 7 +++++ .../OrganizationMembershipManagement.razor | 25 ++++++++++++++---- .../OrganizationMembershipManagement.razor.cs | 26 +++++++++++++++++-- .../EventHubErrorCodes.cs | 1 + .../Localization/EventHub/en.json | 4 ++- .../IOrganizationMembershipRepository.cs | 2 +- .../OrganizationMemberWithDetails.cs | 18 +++++++++++++ .../OrganizationMembershipRepository.cs | 25 +++++++++++++----- 13 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs index 0a1a715..b0850b8 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs @@ -11,6 +11,8 @@ namespace EventHub.Admin.Organizations Task GetAsync(Guid id); + Task GetByNameAsync(string name); + Task UpdateAsync(Guid id, UpdateOrganizationDto input); Task DeleteAsync(Guid id); diff --git a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs index f356ca1..e4e3550 100644 --- a/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs +++ b/src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs @@ -5,6 +5,8 @@ namespace EventHub.Admin.Organizations.Memberships { public class OrganizationMemberDto : EntityDto { + public string OrganizationName { get; set; } + public string UserName { get; set; } public string Email { get; set; } diff --git a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs index 6d40c34..b11a97c 100644 --- a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs +++ b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs @@ -2,8 +2,8 @@ using AutoMapper; using EventHub.Admin.Organizations; using EventHub.Admin.Organizations.Memberships; using EventHub.Organizations; +using EventHub.Organizations.Memberships; using Volo.Abp.AutoMapper; -using Volo.Abp.Identity; namespace EventHub.Admin { @@ -18,7 +18,7 @@ namespace EventHub.Admin .Ignore(x => x.OwnerEmail) .Ignore(x => x.ProfilePictureContent); - CreateMap(); + CreateMap(); } } } diff --git a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index f06fe45..b97d381 100644 --- a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -33,7 +33,7 @@ namespace EventHub.Admin.Organizations.Memberships if (!input.UserName.IsNullOrWhiteSpace()) { input.UserName = input.UserName.ToLower(); - user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower().Contains(input.UserName)); + user = await _userRepository.SingleOrDefaultAsync(x => x.UserName.ToLower() == input.UserName); if (user is null) { throw new BusinessException(EventHubErrorCodes.UserNotFound) @@ -46,7 +46,7 @@ namespace EventHub.Admin.Organizations.Memberships return new PagedResultDto( totalCount, - ObjectMapper.Map, List>(members) + ObjectMapper.Map, List>(members) ); } } diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index bbf2c37..9551782 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Organizations; using Microsoft.AspNetCore.Authorization; +using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.BlobStoring; using Volo.Abp.Domain.Repositories; @@ -84,6 +85,26 @@ namespace EventHub.Admin.Organizations return dto; } + + public async Task GetByNameAsync(string name) + { + var organization = await _organizationRepository.FindAsync(x => x.Name.ToLower() == name.ToLower()); + if (organization is null) + { + throw new BusinessException(EventHubErrorCodes.OrganizationNotFound) + .WithData("OrganizationName", name); + } + + var dto = ObjectMapper.Map(organization); + + var user = await _identityUserRepository.GetAsync(organization.OwnerUserId); + dto.OwnerUserName = user.UserName; + dto.OwnerEmail = user.Email; + + dto.ProfilePictureContent = await GetCoverImageAsync(organization.Id); + + return dto; + } [Authorize(EventHubPermissions.Organizations.Update)] public async Task UpdateAsync(Guid id, UpdateOrganizationDto input) diff --git a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs index 53d70fa..50a6c07 100644 --- a/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs +++ b/src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs @@ -32,6 +32,13 @@ namespace EventHub.Admin.Controllers.Organizations { return _organizationAppService.GetAsync(id); } + + [HttpGet] + [Route("by-name/{name}")] + public Task GetByNameAsync(string name) + { + return _organizationAppService.GetByNameAsync(name); + } [HttpPut] public Task UpdateAsync(Guid id, UpdateOrganizationDto input) diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor index 3474b5e..a304b2d 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor @@ -14,7 +14,7 @@ @L["OrganizationMemberships"] @if (OrganizationId.HasValue && !OrganizationName.IsNullOrWhiteSpace()) { - (@OrganizationName) + (@OrganizationName) } @@ -22,10 +22,21 @@ @* ************************* SEARCH ************************* *@
- - @L["UserName"] - - + + + + @L["OrganizationName"] + + + + + + + @L["UserName"] + + + +
@* ************************* DATA GRID ************************* *@ @@ -38,6 +49,10 @@ Responsive="true" Sortable="false"> + + diff --git a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs index f8e6a86..8d9a017 100644 --- a/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs +++ b/src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs @@ -14,7 +14,8 @@ namespace EventHub.Admin.Web.Pages { [Parameter] public Guid? OrganizationId { get; set; } - public string OrganizationName { get; set; } + private string OrganizationName { get; set; } + [Inject] protected IOrganizationAppService OrganizationAppService { get; set; } @@ -59,7 +60,16 @@ namespace EventHub.Admin.Web.Pages { Filter.OrganizationId = OrganizationId!.Value; } - + else + { + Filter.OrganizationId = null; + } + + if (!Filter.UserName.IsNullOrWhiteSpace()) + { + Filter.UserName = Filter.UserName.Trim(); + } + var result = await OrganizationMembershipAppService.GetListAsync(Filter); OrganizationMemberList = result.Items; TotalCount = (int) result.TotalCount; @@ -69,6 +79,18 @@ namespace EventHub.Admin.Web.Pages { if (e.Code == "Enter" || e.Code == "NumpadEnter") { + if (OrganizationName.IsNullOrWhiteSpace()) + { + OrganizationId = null; + OrganizationName = null; + } + else + { + var organization = await OrganizationAppService.GetByNameAsync(OrganizationName.Trim()); + OrganizationId = organization.Id; + OrganizationName = organization.Name; + } + await GetOrganizationMembershipsAsync(); } } diff --git a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs index e2bc477..d35d621 100644 --- a/src/EventHub.Domain.Shared/EventHubErrorCodes.cs +++ b/src/EventHub.Domain.Shared/EventHubErrorCodes.cs @@ -12,5 +12,6 @@ public const string NotAuthorizedToUpdateEvent = "EventHub:NotAuthorizedToUpdateEvent"; public const string CantChangeEventTiming = "EventHub:CantChangeEventTiming"; public const string UserNotFound = "EventHub:UserNotFound"; + public const string OrganizationNotFound = "EventHub:OrganizationNotFound"; } } diff --git a/src/EventHub.Domain.Shared/Localization/EventHub/en.json b/src/EventHub.Domain.Shared/Localization/EventHub/en.json index 5eab35a..1bf060c 100644 --- a/src/EventHub.Domain.Shared/Localization/EventHub/en.json +++ b/src/EventHub.Domain.Shared/Localization/EventHub/en.json @@ -109,10 +109,12 @@ "ChooseProfileImage": "Choose profile image:", "OrganizationMemberships": "Organization Memberships", "EventHub:UserNotFound": "There is no user named \"{UserName}\"", + "EventHub:OrganizationNotFound": "There is no organization named \"{OrganizationName}\"", "DeleteCoverImage": "Delete Cover Image", "DeleteConfirmationMessage": "Are you sure you want to delete this item?", "Loading": "Loading", "OrganizationInfo": "Organization Info", - "ProfileImage": "Profile Image" + "ProfileImage": "Profile Image", + "OrganizationName": "Organization Name" } } diff --git a/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs index c8b25b7..07f542a 100644 --- a/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs +++ b/src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs @@ -9,7 +9,7 @@ namespace EventHub.Organizations.Memberships { public interface IOrganizationMembershipRepository : IRepository { - Task> GetMemberListAsync( + Task> GetMemberListAsync( Guid? organizationId, Guid? userId, int skipCount, diff --git a/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs b/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs new file mode 100644 index 0000000..df907f3 --- /dev/null +++ b/src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs @@ -0,0 +1,18 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace EventHub.Organizations.Memberships +{ + public class OrganizationMemberWithDetails : Entity + { + public string OrganizationName { get; set; } + + public string UserName { get; set; } + + public string Email { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } + } +} \ No newline at end of file diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs index 91fa861..f540e94 100644 --- a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using EventHub.Organizations; using EventHub.Organizations.Memberships; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; @@ -18,7 +19,7 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships } - public async Task> GetMemberListAsync( + public async Task> GetMemberListAsync( Guid? organizationId, Guid? userId, int skipCount, @@ -29,14 +30,24 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships var organizationMembershipsDbSet = dbContext.Set(); var identityUserDbSet = dbContext.Set(); - + var organizationDbSet = dbContext.Set(); + var query = organizationMembershipsDbSet - .Join(identityUserDbSet, organizationMember => organizationMember.UserId, user => user.Id, - (organizationMember, user) => new {organizationMember, user}) + .Join(organizationDbSet, t => t.OrganizationId, organization => organization.Id + , (organizationMember, organization) => new {organizationMember, organization}) + .Join(identityUserDbSet, organizationWithMember => organizationWithMember.organizationMember.UserId, user => user.Id, + (organizationWithMember, user) => new {organizationWithMember, user}) .WhereIf(userId.HasValue, t => t.user.Id == userId) - .WhereIf(organizationId.HasValue, t => t.organizationMember.OrganizationId == organizationId) - .OrderByDescending(x => x.organizationMember.CreationTime) - .Select(x => x.user); + .WhereIf(organizationId.HasValue, t => t.organizationWithMember.organizationMember.OrganizationId == organizationId) + .OrderByDescending(o => o.organizationWithMember.organizationMember.CreationTime) + .Select(t => new OrganizationMemberWithDetails + { + OrganizationName = t.organizationWithMember.organization.Name, + UserName = t.user.UserName, + Email = t.user.Email, + Name = t.user.Name, + Surname = t.user.Surname + }); return await query .PageBy(skipCount, maxResultCount)