Browse Source

refactor(EventHub-Admin): cover image operations

pull/62/head
Berkan Sasmaz 5 years ago
parent
commit
41660f2644
  1. 10
      src/EventHub.Admin.Application/Events/EventAppService.cs
  2. 15
      src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs
  3. 12
      src/EventHub.Admin.HttpApi.Host/Controllers/Events/EventController.cs
  4. 11
      src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs
  5. 1
      src/EventHub.Admin.HttpApi.Host/EventHub.Admin.HttpApi.Host.csproj
  6. 4
      src/EventHub.Admin.HttpApi.Host/EventHubAdminHttpApiHostModule.cs
  7. 3
      src/EventHub.Admin.Web/EventHub.Admin.Web.csproj
  8. 6
      src/EventHub.Admin.Web/Pages/EventManagement.razor
  9. 42
      src/EventHub.Admin.Web/Pages/EventManagement.razor.cs
  10. 8
      src/EventHub.Admin.Web/Pages/OrganizationManagement.razor
  11. 40
      src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs
  12. 0
      src/EventHub.Admin.Web/wwwroot/assets/eh-event.png
  13. 0
      src/EventHub.Admin.Web/wwwroot/assets/eh-organization.png
  14. 2
      src/EventHub.Domain.Shared/Organizations/OrganizationContst.cs

10
src/EventHub.Admin.Application/Events/EventAppService.cs

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using EventHub.Admin.Permissions;
using EventHub.Countries;
@ -72,6 +71,10 @@ namespace EventHub.Admin.Events
{
await SetCoverImageAsync(blobName: id.ToString(), input.CoverImageStreamContent);
}
else
{
await DeleteCoverImageAsync(blobName: id.ToString());
}
await _eventRepository.UpdateAsync(@event);
}
@ -107,5 +110,10 @@ namespace EventHub.Admin.Events
{
await _eventBlobContainer.SaveAsync(blobName, streamContent.GetStream(), overrideExisting);
}
private async Task DeleteCoverImageAsync(string blobName)
{
await _eventBlobContainer.DeleteAsync(blobName);
}
}
}

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

@ -78,7 +78,7 @@ namespace EventHub.Admin.Organizations
return await CreateOrganizationProfileDto(organization);
}
public async Task<OrganizationProfileDto> GetByNameAsync(string name)
{
var organization = await _organizationRepository.FindAsync(x => x.Name.ToLower() == name.ToLower());
@ -110,6 +110,10 @@ namespace EventHub.Admin.Organizations
{
await SaveCoverImageAsync(organization.Id, input.ProfilePictureStreamContent);
}
else
{
await DeleteCoverImageAsync(blobName: id.ToString());
}
await _organizationRepository.UpdateAsync(organization);
@ -121,7 +125,7 @@ namespace EventHub.Admin.Organizations
{
await _organizationRepository.DeleteAsync(id);
}
private async Task<OrganizationProfileDto> CreateOrganizationProfileDto(Organization organization)
{
var dto = ObjectMapper.Map<Organization, OrganizationProfileDto>(organization);
@ -138,7 +142,7 @@ namespace EventHub.Admin.Organizations
{
var blobName = id.ToString();
var coverImageStream = await _organizationBlobContainer.GetOrNullAsync(blobName);
if (coverImageStream is null)
{
return null;
@ -153,5 +157,10 @@ namespace EventHub.Admin.Organizations
await _organizationBlobContainer.SaveAsync(blobName, coverImageContent.GetStream(), overrideExisting: true);
}
private async Task DeleteCoverImageAsync(string blobName)
{
await _organizationBlobContainer.DeleteAsync(blobName);
}
}
}

12
src/EventHub.Admin.HttpApi.Host/Controllers/Events/EventController.cs

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using EventHub.Admin.Events;
using EventHub.Events;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
@ -47,16 +48,7 @@ namespace EventHub.Admin.Controllers.Events
var remoteStreamContent = await _eventAppService.GetCoverImageAsync(id);
if (remoteStreamContent is null)
{
var stream = _virtualFileProvider
.GetFileInfo("/Images/eh-event.png")
.CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream)
{
ContentType = "image/png"
};
await stream.FlushAsync();
return null;
}
Response.Headers.Add("Accept-Ranges", "bytes");

11
src/EventHub.Admin.HttpApi.Host/Controllers/Organizations/OrganizationController.cs

@ -2,6 +2,7 @@ using System;
using System.IO;
using System.Threading.Tasks;
using EventHub.Admin.Organizations;
using EventHub.Organizations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
@ -69,15 +70,7 @@ namespace EventHub.Admin.Controllers.Organizations
var remoteStreamContent = await _organizationAppService.GetCoverImageAsync(id);
if (remoteStreamContent is null)
{
var stream = _virtualFileProvider
.GetFileInfo("/Images/eh-organization.png")
.CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream)
{
ContentType = "image/png"
};
await stream.FlushAsync();
return null;
}
Response.Headers.Add("Accept-Ranges", "bytes");

1
src/EventHub.Admin.HttpApi.Host/EventHub.Admin.HttpApi.Host.csproj

@ -33,7 +33,6 @@
<Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" />
<EmbeddedResource Include="Images\**\*.*" />
</ItemGroup>
</Project>

4
src/EventHub.Admin.HttpApi.Host/EventHubAdminHttpApiHostModule.cs

@ -93,10 +93,6 @@ namespace EventHub.Admin
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<EventHubAdminHttpApiHostModule>(
baseNamespace: "EventHub.Admin",
baseFolder: "/Images");
if (hostingEnvironment.IsDevelopment())
{
options.FileSets.ReplaceEmbeddedByPhysical<EventHubDomainSharedModule>(

3
src/EventHub.Admin.Web/EventHub.Admin.Web.csproj

@ -22,4 +22,7 @@
<PackageReference Include="Volo.Abp.Identity.Blazor.WebAssembly" Version="4.4.0-rc.1" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\**\*.*" />
</ItemGroup>
</Project>

6
src/EventHub.Admin.Web/Pages/EventManagement.razor

@ -266,13 +266,13 @@
<FileEdit MaxMessageSize="@EventConsts.MaxCoverImageFileSize" Filter="@string.Join(", ", EventConsts.AllowedCoverImageExtensions)" Changed="@OnCoverImageFileChanged" AutoReset="true"/>
</FieldBody>
<Column ColumnSize="ColumnSize.Is3">
@if (!string.IsNullOrEmpty(CoverImageUrl))
@if (DisabledCoverImageButton)
{
<Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
}
else
{
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
<Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
}
</Column>
</Field>

42
src/EventHub.Admin.Web/Pages/EventManagement.razor.cs

@ -10,6 +10,7 @@ using System.ComponentModel;
using Microsoft.AspNetCore.Components.Web;
using System.IO;
using System.Globalization;
using EventHub.Events;
using NUglify.Helpers;
using Volo.Abp;
using Volo.Abp.Content;
@ -33,6 +34,7 @@ namespace EventHub.Admin.Web.Pages
private IFileEntry FileEntry { get; set; }
private List<CountryLookupDto> Countries { get; set; }
private List<Language> Languages { get; set; }
private bool DisabledCoverImageButton { get; set; }
public EventManagement()
{
@ -96,7 +98,7 @@ namespace EventHub.Admin.Web.Pages
EditingEvent = ObjectMapper.Map<EventDetailDto, UpdateEventDto>(Event);
FileEntry = new FileEntry();
CoverImageUrl = UrlOptions.Value.AdminApi.EnsureEndsWith('/') + "api/eventhub/admin/event/cover-image/" + EditingEventId;
await SetCoverImageUrlAsync();
EditEventModal.Show();
}
@ -122,6 +124,7 @@ namespace EventHub.Admin.Web.Pages
await GetEventsAsync();
CoverImageUrl = string.Empty;
DisabledCoverImageButton = false;
EditEventModal.Hide();
}
@ -145,17 +148,6 @@ namespace EventHub.Admin.Web.Pages
await GetEventsAsync();
}
private void SetCoverImageUrl(string contentType, byte[] content)
{
if (content.IsNullOrEmpty())
{
return;
}
contentType = string.IsNullOrWhiteSpace(contentType) ? "image/png" : contentType;
CoverImageUrl = $"data:{contentType};base64,{Convert.ToBase64String(content)}";
}
private async Task OnCoverImageFileChanged(FileChangedEventArgs e)
{
FileEntry = e.Files.FirstOrDefault();
@ -174,6 +166,18 @@ namespace EventHub.Admin.Web.Pages
FileName = FileEntry.Name
};
void SetCoverImageUrl(string contentType, byte[] content)
{
if (content.IsNullOrEmpty())
{
return;
}
contentType = string.IsNullOrWhiteSpace(contentType) ? "image/png" : contentType;
CoverImageUrl = $"data:{contentType};base64,{Convert.ToBase64String(content)}";
DisabledCoverImageButton = false;
}
SetCoverImageUrl(FileEntry.Type, stream.ToArray());
await InvokeAsync(StateHasChanged);
}
@ -183,12 +187,26 @@ namespace EventHub.Admin.Web.Pages
EditingEvent.CoverImageStreamContent = null;
FileEntry = new FileEntry();
CoverImageUrl = null;
DisabledCoverImageButton = true;
}
private async Task FillCountriesAsync()
{
Countries = await EventAppService.GetCountriesLookupAsync();
}
private async Task SetCoverImageUrlAsync()
{
var imageRemoteStreamContent = await EventAppService.GetCoverImageAsync(id: EditingEventId);
if (imageRemoteStreamContent.ContentLength <= 0)
{
CoverImageUrl = "/assets/eh-event.png";
DisabledCoverImageButton = true;
return;
}
CoverImageUrl = UrlOptions.Value.AdminApi.EnsureEndsWith('/') + "api/eventhub/admin/event/cover-image/" + EditingEventId;
}
private enum EventEditTabs : byte
{

8
src/EventHub.Admin.Web/Pages/OrganizationManagement.razor

@ -238,16 +238,16 @@
<Field Horizontal="true">
<FieldLabel ColumnSize="ColumnSize.Is3">@L["ChooseProfileImage"]</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<FileEdit MaxMessageSize="@OrganizationConsts.MaxProfilePictureFileSize" Filter=".jpg, .png" Changed="@OnProfileImageFileChanged" Progressed="@OnProgressedForProfileImage" AutoReset="true"/>
<FileEdit MaxMessageSize="@OrganizationConsts.MaxProfilePictureFileSize" Filter="@string.Join(", ", OrganizationConsts.AllowedProfilePictureExtensions)" Changed="@OnProfileImageFileChanged" Progressed="@OnProgressedForProfileImage" AutoReset="true"/>
</FieldBody>
<Column ColumnSize="ColumnSize.Is3">
@if (!ProfileImageUrl.IsNullOrWhiteSpace())
@if (DisabledProfileImageButton)
{
<Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
}
else
{
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
<Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
}
</Column>
</Field>

40
src/EventHub.Admin.Web/Pages/OrganizationManagement.razor.cs

@ -31,6 +31,7 @@ namespace EventHub.Admin.Web.Pages
private IFileEntry FileEntry { get; set; }
private bool IsLoadingProfileImage { get; set; }
private string SelectedTabInEditModal { get; set; }
private bool DisabledProfileImageButton { get; set; }
public OrganizationManagement()
{
@ -76,7 +77,7 @@ namespace EventHub.Admin.Web.Pages
Organization = await OrganizationAppService.GetAsync(EditingOrganizationId);
FileEntry = new FileEntry();
ProfileImageUrl = UrlOptions.Value.AdminApi.EnsureEndsWith('/') + "api/eventhub/admin/organization/cover-image/" + EditingOrganizationId;
await SetProfileImageUrlAsync();
EditingOrganization = ObjectMapper.Map<OrganizationProfileDto, UpdateOrganizationDto>(Organization);
EditOrganizationModal.Show();
@ -87,6 +88,9 @@ namespace EventHub.Admin.Web.Pages
await OrganizationAppService.UpdateAsync(EditingOrganizationId, EditingOrganization);
await GetOrganizationsAsync();
EditOrganizationModal.Hide();
ProfileImageUrl = null;
DisabledProfileImageButton = false;
}
private void OnDeleteCoverImageButtonClicked()
@ -94,6 +98,7 @@ namespace EventHub.Admin.Web.Pages
EditingOrganization.ProfilePictureStreamContent = null;
FileEntry = new FileEntry();
ProfileImageUrl = null;
DisabledProfileImageButton = true;
IsLoadingProfileImage = false;
}
@ -123,18 +128,19 @@ namespace EventHub.Admin.Web.Pages
FileName = FileEntry.Name
};
SetProfileImageUrl(FileEntry.Type, stream.ToArray());
await InvokeAsync(StateHasChanged);
}
private void SetProfileImageUrl(string contentType, byte[] content)
{
if (content != null)
void SetProfileImageUrl(string contentType, byte[] content)
{
contentType = string.IsNullOrWhiteSpace(contentType) ? "image/png" : contentType;
var imageDataUrl = $"data:{contentType};base64,{Convert.ToBase64String(content)}";
ProfileImageUrl = imageDataUrl;
if (content != null)
{
contentType = string.IsNullOrWhiteSpace(contentType) ? "image/png" : contentType;
var imageDataUrl = $"data:{contentType};base64,{Convert.ToBase64String(content)}";
ProfileImageUrl = imageDataUrl;
DisabledProfileImageButton = false;
}
}
SetProfileImageUrl(FileEntry.Type, stream.ToArray());
await InvokeAsync(StateHasChanged);
}
private void OnProgressedForProfileImage(FileProgressedEventArgs e)
@ -163,6 +169,18 @@ namespace EventHub.Admin.Web.Pages
await GetOrganizationsAsync();
}
}
private async Task SetProfileImageUrlAsync()
{
var imageRemoteStreamContent = await OrganizationAppService.GetCoverImageAsync(id: EditingOrganizationId);
if (imageRemoteStreamContent.ContentLength <= 0)
{
ProfileImageUrl = "assets/eh-organization.png";
DisabledProfileImageButton = true;
return;
}
ProfileImageUrl = UrlOptions.Value.AdminApi.EnsureEndsWith('/') + "api/eventhub/admin/organization/cover-image/" + EditingOrganizationId;
}
}
public enum TabContentInEditModal : byte

0
src/EventHub.Admin.HttpApi.Host/Images/eh-event.png → src/EventHub.Admin.Web/wwwroot/assets/eh-event.png

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

0
src/EventHub.Admin.HttpApi.Host/Images/eh-organization.png → src/EventHub.Admin.Web/wwwroot/assets/eh-organization.png

Before

Width:  |  Height:  |  Size: 544 KiB

After

Width:  |  Height:  |  Size: 544 KiB

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

@ -26,5 +26,7 @@
public const int MaxInstagramUsernameLength = 24;
public const int MaxMediumUsernameLength = 24;
public static string[] AllowedProfilePictureExtensions = { ".jpg", ".png" };
}
}

Loading…
Cancel
Save