Browse Source

Feat: Add Organization name on Organization memberships page

pull/49/head
Berkan Sasmaz 5 years ago
parent
commit
1f61892afe
  1. 2
      src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs
  2. 2
      src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs
  3. 4
      src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs
  4. 4
      src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs
  5. 21
      src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs
  6. 7
      src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs
  7. 25
      src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor
  8. 26
      src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor.cs
  9. 1
      src/EventHub.Domain.Shared/EventHubErrorCodes.cs
  10. 4
      src/EventHub.Domain.Shared/Localization/EventHub/en.json
  11. 2
      src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs
  12. 18
      src/EventHub.Domain/Organizations/Memberships/OrganizationMemberWithDetails.cs
  13. 25
      src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Organizations/Memberships/OrganizationMembershipRepository.cs

2
src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs

@ -11,6 +11,8 @@ namespace EventHub.Admin.Organizations
Task<OrganizationProfileDto> GetAsync(Guid id);
Task<OrganizationProfileDto> GetByNameAsync(string name);
Task<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input);
Task DeleteAsync(Guid id);

2
src/EventHub.Admin.Application.Contracts/Organizations/Memberships/OrganizationMemberDto.cs

@ -5,6 +5,8 @@ namespace EventHub.Admin.Organizations.Memberships
{
public class OrganizationMemberDto : EntityDto<Guid>
{
public string OrganizationName { get; set; }
public string UserName { get; set; }
public string Email { get; set; }

4
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<IdentityUser, OrganizationMemberDto>();
CreateMap<OrganizationMemberWithDetails, OrganizationMemberDto>();
}
}
}

4
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<OrganizationMemberDto>(
totalCount,
ObjectMapper.Map<List<IdentityUser>, List<OrganizationMemberDto>>(members)
ObjectMapper.Map<List<OrganizationMemberWithDetails>, List<OrganizationMemberDto>>(members)
);
}
}

21
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<OrganizationProfileDto> 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, OrganizationProfileDto>(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<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input)

7
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<OrganizationProfileDto> GetByNameAsync(string name)
{
return _organizationAppService.GetByNameAsync(name);
}
[HttpPut]
public Task<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input)

25
src/EventHub.Admin.Web/Pages/OrganizationMembershipManagement.razor

@ -14,7 +14,7 @@
@L["OrganizationMemberships"]
@if (OrganizationId.HasValue && !OrganizationName.IsNullOrWhiteSpace())
{
<span> (@OrganizationName)</span>
<span> (@OrganizationName)</span>
}
</h2>
</CardHeader>
@ -22,10 +22,21 @@
@* ************************* SEARCH ************************* *@
<CardBody>
<div id="FilterSection" class="mt-3 ml-2">
<Field>
<FieldLabel>@L["UserName"]</FieldLabel>
<TextEdit TValue="string" KeyPress="OnKeyPress" @bind-Text="@Filter.UserName"/>
</Field>
<Row>
<Column ColumnSize="ColumnSize.Is5">
<Field>
<FieldLabel>@L["OrganizationName"]</FieldLabel>
<TextEdit TValue="string" KeyPress="OnKeyPress" @bind-Text="@OrganizationName"/>
</Field>
</Column>
<Column ColumnSize="ColumnSize.Is5">
<Field>
<FieldLabel>@L["UserName"]</FieldLabel>
<TextEdit TValue="string" KeyPress="OnKeyPress" @bind-Text="@Filter.UserName"/>
</Field>
</Column>
</Row>
</div>
@* ************************* DATA GRID ************************* *@
@ -38,6 +49,10 @@
Responsive="true"
Sortable="false">
<DataGridColumns>
<DataGridColumn TItem="OrganizationMemberDto"
Field="OrganizationName"
Caption="@L["OrganizationName"]">
</DataGridColumn>
<DataGridColumn TItem="OrganizationMemberDto"
Field="UserName"
Caption="@L["UserName"]">

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

1
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";
}
}

4
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"
}
}

2
src/EventHub.Domain/Organizations/Memberships/IOrganizationMembershipRepository.cs

@ -9,7 +9,7 @@ namespace EventHub.Organizations.Memberships
{
public interface IOrganizationMembershipRepository : IRepository<OrganizationMembership, Guid>
{
Task<List<IdentityUser>> GetMemberListAsync(
Task<List<OrganizationMemberWithDetails>> GetMemberListAsync(
Guid? organizationId,
Guid? userId,
int skipCount,

18
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<Guid>
{
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; }
}
}

25
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<List<IdentityUser>> GetMemberListAsync(
public async Task<List<OrganizationMemberWithDetails>> GetMemberListAsync(
Guid? organizationId,
Guid? userId,
int skipCount,
@ -29,14 +30,24 @@ namespace EventHub.EntityFrameworkCore.Organizations.Memberships
var organizationMembershipsDbSet = dbContext.Set<OrganizationMembership>();
var identityUserDbSet = dbContext.Set<IdentityUser>();
var organizationDbSet = dbContext.Set<Organization>();
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)

Loading…
Cancel
Save