Browse Source

Feature(Admin-Backend): Create necessary backend for organization admin ui

pull/49/head
Berkan Sasmaz 5 years ago
parent
commit
a66596387c
  1. 19
      src/EventHub.Admin.Application.Contracts/Organizations/IOrganizationAppService.cs
  2. 14
      src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs
  3. 16
      src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs
  4. 32
      src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs
  5. 45
      src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs
  6. 8
      src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs
  7. 9
      src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs
  8. 13
      src/EventHub.Admin.Application/EventHubAdminAppService.cs
  9. 11
      src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs
  10. 20
      src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs
  11. 138
      src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs
  12. 50
      src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs
  13. 3
      src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs
  14. 3
      src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs

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

@ -0,0 +1,19 @@
using System;
using System.Threading.Tasks;
using EventHub.Admin.Application.Contracts.Organizations;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EventHub.Admin.Organizations
{
public interface IOrganizationAppService : IApplicationService
{
Task<PagedResultDto<OrganizationInListDto>> GetListAsync(OrganizationListFilterDto input);
Task<OrganizationProfileDto> GetAsync(Guid id);
Task<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input);
Task DeleteAsync(Guid id);
}
}

14
src/EventHub.Admin.Application.Contracts/Organizations/OrganizationInListDto.cs

@ -0,0 +1,14 @@
using System;
using Volo.Abp.Application.Dtos;
namespace EventHub.Admin.Organizations
{
public class OrganizationInListDto : EntityDto<Guid>
{
public string Name { get; set; }
public string DisplayName { get; set; }
public int MemberCount { get; set; }
}
}

16
src/EventHub.Admin.Application.Contracts/Organizations/OrganizationListFilterDto.cs

@ -0,0 +1,16 @@
using System;
using Volo.Abp.Application.Dtos;
namespace EventHub.Admin.Application.Contracts.Organizations
{
public class OrganizationListFilterDto : PagedAndSortedResultRequestDto
{
public string? Name { get; set; }
public string? DisplayName { get; set; }
public int? MinMemberCount { get; set; }
public int? MaxMemberCount { get; set; }
}
}

32
src/EventHub.Admin.Application.Contracts/Organizations/OrganizationProfileDto.cs

@ -0,0 +1,32 @@
using System;
using Volo.Abp.Application.Dtos;
namespace EventHub.Admin.Organizations
{
public class OrganizationProfileDto : EntityDto<Guid>
{
public string Name { get; set; }
public string DisplayName { get; set; }
public byte[] ProfilePictureContent { get; set; }
public string OwnerUserName { get; set; }
public string OwnerEmail { get; set; }
public string Description { get; set; }
public string Website { get; set; }
public string TwitterUsername { get; set; }
public string GitHubUsername { get; set; }
public string FacebookUsername { get; set; }
public string InstagramUsername { get; set; }
public string MediumUsername { get; set; }
}
}

45
src/EventHub.Admin.Application.Contracts/Organizations/UpdateOrganizationDto.cs

@ -0,0 +1,45 @@
using System;
using System.ComponentModel.DataAnnotations;
using EventHub.Organizations;
using JetBrains.Annotations;
namespace EventHub.Admin.Organizations
{
public class UpdateOrganizationDto
{
[Required]
[StringLength(OrganizationConsts.MaxDisplayNameLength, MinimumLength = OrganizationConsts.MinDisplayNameLength)]
public string DisplayName { get; set; }
[Required]
[StringLength(OrganizationConsts.MaxDescriptionNameLength, MinimumLength = OrganizationConsts.MinDescriptionNameLength)]
public string Description { get; set; }
[CanBeNull]
public byte[] ProfilePictureContent { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxWebsiteLength)]
public string Website { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxTwitterUsernameLength)]
public string TwitterUsername { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxGitHubUsernameLength)]
public string GitHubUsername { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxFacebookUsernameLength)]
public string FacebookUsername { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxInstagramUsernameLength)]
public string InstagramUsername { get; set; }
[CanBeNull]
[StringLength(OrganizationConsts.MaxMediumUsernameLength)]
public string MediumUsername { get; set; }
}
}

8
src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissionDefinitionProvider.cs

@ -8,10 +8,12 @@ namespace EventHub.Admin.Permissions
{ {
public override void Define(IPermissionDefinitionContext context) public override void Define(IPermissionDefinitionContext context)
{ {
var myGroup = context.AddGroup(EventHubPermissions.GroupName); var eventHubGroup = context.AddGroup(EventHubPermissions.GroupName);
//Define your own permissions here. Example: var tenantsPermission = eventHubGroup.AddPermission(EventHubPermissions.Organizations.Default, L("Permission:OrganizationManagement"));
//myGroup.AddPermission(EventHubPermissions.MyPermission1, L("Permission:MyPermission1")); tenantsPermission.AddChild(EventHubPermissions.Organizations.Create, L("Permission:Create"));
tenantsPermission.AddChild(EventHubPermissions.Organizations.Update, L("Permission:Edit"));
tenantsPermission.AddChild(EventHubPermissions.Organizations.Delete, L("Permission:Delete"));
} }
private static LocalizableString L(string name) private static LocalizableString L(string name)

9
src/EventHub.Admin.Application.Contracts/Permissions/EventHubPermissions.cs

@ -4,7 +4,12 @@
{ {
public const string GroupName = "EventHub"; public const string GroupName = "EventHub";
//Add your own permission names. Example: public static class Organizations
//public const string MyPermission1 = GroupName + ".MyPermission1"; {
public const string Default = GroupName + ".Organizations";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
} }
} }

13
src/EventHub.Admin.Application/EventHubAdminAppService.cs

@ -0,0 +1,13 @@
using EventHub.Localization;
using Volo.Abp.Application.Services;
namespace EventHub.Admin.Application
{
public class EventHubAdminAppService : ApplicationService
{
public EventHubAdminAppService()
{
LocalizationResource = typeof(EventHubResource);
}
}
}

11
src/EventHub.Admin.Application/EventHubAdminApplicationModule.cs

@ -1,4 +1,5 @@
using Volo.Abp.Account; using Volo.Abp.Account;
using Volo.Abp.AutoMapper;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement;
@ -10,9 +11,17 @@ namespace EventHub.Admin
typeof(AbpAccountApplicationModule), typeof(AbpAccountApplicationModule),
typeof(EventHubAdminApplicationContractsModule), typeof(EventHubAdminApplicationContractsModule),
typeof(AbpIdentityApplicationModule), typeof(AbpIdentityApplicationModule),
typeof(AbpPermissionManagementApplicationModule) typeof(AbpPermissionManagementApplicationModule),
typeof(AbpAutoMapperModule)
)] )]
public class EventHubAdminApplicationModule : AbpModule public class EventHubAdminApplicationModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<EventHubAdminApplicationAutoMapperProfile>(validate: true);
});
}
} }
} }

20
src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs

@ -0,0 +1,20 @@
using AutoMapper;
using EventHub.Admin.Organizations;
using EventHub.Organizations;
using Volo.Abp.AutoMapper;
namespace EventHub.Admin
{
public class EventHubAdminApplicationAutoMapperProfile : Profile
{
public EventHubAdminApplicationAutoMapperProfile()
{
CreateMap<Organization, OrganizationInListDto>();
CreateMap<Organization, OrganizationProfileDto>()
.Ignore(x => x.OwnerUserName)
.Ignore(x => x.OwnerEmail)
.Ignore(x => x.ProfilePictureContent);
}
}
}

138
src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs

@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using EventHub.Admin.Application;
using EventHub.Admin.Application.Contracts.Organizations;
using EventHub.Admin.Permissions;
using EventHub.Organizations;
using EventHub.Organizations.Memberships;
using EventHub.Users;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.BlobStoring;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Volo.Abp.Identity.Settings;
namespace EventHub.Admin.Organizations
{
[Authorize(EventHubPermissions.Organizations.Default)]
public class OrganizationAppService : EventHubAdminAppService, IOrganizationAppService
{
private readonly IRepository<Organization, Guid> _organizationRepository;
private readonly IRepository<IdentityUser, Guid> _identityUserRepository;
private readonly IBlobContainer<OrganizationProfilePictureContainer> _organizationBlobContainer;
public OrganizationAppService(
IRepository<Organization, Guid> organizationRepository,
IRepository<IdentityUser, Guid> identityUserRepository,
IBlobContainer<OrganizationProfilePictureContainer> organizationBlobContainer)
{
_organizationRepository = organizationRepository;
_identityUserRepository = identityUserRepository;
_organizationBlobContainer = organizationBlobContainer;
}
public async Task<PagedResultDto<OrganizationInListDto>> GetListAsync(OrganizationListFilterDto input)
{
var query = await _organizationRepository.GetQueryableAsync();
if (!input.Name.IsNullOrWhiteSpace())
{
query = query.Where(o => o.Name.Contains(input.Name));
}
if (!input.DisplayName.IsNullOrWhiteSpace())
{
query = query.Where(o => o.DisplayName.Contains(input.DisplayName));
}
if (!input.DisplayName.IsNullOrWhiteSpace())
{
query = query.Where(o => o.DisplayName.Contains(input.DisplayName));
}
if (input.MinMemberCount != null)
{
query = query.Where(o => o.MemberCount >= input.MinMemberCount);
}
if (input.MaxMemberCount != null)
{
query = query.Where(o => o.MemberCount <= input.MaxMemberCount);
}
var totalCount = await AsyncExecuter.CountAsync(query);
query = query.OrderBy(string.IsNullOrWhiteSpace(input.Sorting) ? OrganizationConsts.DefaultSorting : input.Sorting);
query = query.PageBy(input);
var organizationListDto = ObjectMapper
.Map<List<Organization>, List<OrganizationInListDto>>(await AsyncExecuter.ToListAsync(query));
return new PagedResultDto<OrganizationInListDto>(totalCount, organizationListDto);
}
public async Task<OrganizationProfileDto> GetAsync(Guid id)
{
var organization = await _organizationRepository.GetAsync(id);
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(id);
return dto;
}
public async Task<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input)
{
var organization = await _organizationRepository.GetAsync(id);
organization.SetDisplayName(input.DisplayName);
organization.SetDescription(input.Description);
organization.Website = input.Website;
organization.TwitterUsername = input.TwitterUsername;
organization.GitHubUsername = input.GitHubUsername;
organization.FacebookUsername = input.FacebookUsername;
organization.InstagramUsername = input.InstagramUsername;
organization.MediumUsername = input.MediumUsername;
if (input.ProfilePictureContent?.Length > 0)
{
await SaveCoverImageAsync(organization.Id, input.ProfilePictureContent);
}
await _organizationRepository.UpdateAsync(organization);
return ObjectMapper.Map<Organization, OrganizationProfileDto>(organization);
}
[Authorize(EventHubPermissions.Organizations.Delete)]
public async Task DeleteAsync(Guid id)
{
await _organizationRepository.DeleteAsync(id);
}
private async Task<byte[]> GetCoverImageAsync(Guid id)
{
var blobName = id.ToString();
return await _organizationBlobContainer.GetAllBytesOrNullAsync(blobName);
}
private async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent)
{
var blobName = id.ToString();
await _organizationBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true);
}
}
}

50
src/EventHub.Admin.HttpApi.Host/Controllers/OrganizationController.cs

@ -0,0 +1,50 @@
using System;
using System.Threading.Tasks;
using EventHub.Admin.Application.Contracts.Organizations;
using EventHub.Admin.Organizations;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace EventHub.Admin.Controllers
{
[Controller]
[Area("eventhub-admin")]
[ControllerName("Organization")]
[Route("/api/eventhub/organizations")]
public class OrganizationController : AbpController, IOrganizationAppService
{
private readonly IOrganizationAppService _organizationAppService;
public OrganizationController(IOrganizationAppService organizationAppService)
{
_organizationAppService = organizationAppService;
}
[HttpGet]
public Task<PagedResultDto<OrganizationInListDto>> GetListAsync(OrganizationListFilterDto input)
{
return _organizationAppService.GetListAsync(input);
}
[HttpGet]
[Route("{id}")]
public Task<OrganizationProfileDto> GetAsync(Guid id)
{
return _organizationAppService.GetAsync(id);
}
[HttpPut]
public Task<OrganizationProfileDto> UpdateAsync(Guid id, UpdateOrganizationDto input)
{
return _organizationAppService.UpdateAsync(id, input);
}
[HttpDelete]
[Route("{id}")]
public Task DeleteAsync(Guid id)
{
return _organizationAppService.DeleteAsync(id);
}
}
}

3
src/EventHub.Admin.Web/EventHubBlazorAutoMapperProfile.cs

@ -1,4 +1,5 @@
using AutoMapper; using AutoMapper;
using EventHub.Admin.Organizations;
namespace EventHub.Admin.Web namespace EventHub.Admin.Web
{ {
@ -6,7 +7,7 @@ namespace EventHub.Admin.Web
{ {
public EventHubBlazorAutoMapperProfile() public EventHubBlazorAutoMapperProfile()
{ {
//Define your AutoMapper configuration here for the Blazor project. CreateMap<OrganizationProfileDto, UpdateOrganizationDto>();
} }
} }
} }

3
src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs

@ -2,6 +2,8 @@
{ {
public static class OrganizationConsts public static class OrganizationConsts
{ {
public const string DefaultSorting = "CreationTime desc";
public const int MinNameLength = 2; public const int MinNameLength = 2;
public const int MaxNameLength = 32; public const int MaxNameLength = 32;
@ -24,6 +26,5 @@
public const int MaxInstagramUsernameLength = 24; public const int MaxInstagramUsernameLength = 24;
public const int MaxMediumUsernameLength = 24; public const int MaxMediumUsernameLength = 24;
} }
} }

Loading…
Cancel
Save