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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks; using System.Threading.Tasks;
using EventHub.Admin.Permissions; using EventHub.Admin.Permissions;
using EventHub.Countries; using EventHub.Countries;
@ -72,6 +71,10 @@ namespace EventHub.Admin.Events
{ {
await SetCoverImageAsync(blobName: id.ToString(), input.CoverImageStreamContent); await SetCoverImageAsync(blobName: id.ToString(), input.CoverImageStreamContent);
} }
else
{
await DeleteCoverImageAsync(blobName: id.ToString());
}
await _eventRepository.UpdateAsync(@event); await _eventRepository.UpdateAsync(@event);
} }
@ -107,5 +110,10 @@ namespace EventHub.Admin.Events
{ {
await _eventBlobContainer.SaveAsync(blobName, streamContent.GetStream(), overrideExisting); 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); return await CreateOrganizationProfileDto(organization);
} }
public async Task<OrganizationProfileDto> GetByNameAsync(string name) public async Task<OrganizationProfileDto> GetByNameAsync(string name)
{ {
var organization = await _organizationRepository.FindAsync(x => x.Name.ToLower() == name.ToLower()); 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); await SaveCoverImageAsync(organization.Id, input.ProfilePictureStreamContent);
} }
else
{
await DeleteCoverImageAsync(blobName: id.ToString());
}
await _organizationRepository.UpdateAsync(organization); await _organizationRepository.UpdateAsync(organization);
@ -121,7 +125,7 @@ namespace EventHub.Admin.Organizations
{ {
await _organizationRepository.DeleteAsync(id); await _organizationRepository.DeleteAsync(id);
} }
private async Task<OrganizationProfileDto> CreateOrganizationProfileDto(Organization organization) private async Task<OrganizationProfileDto> CreateOrganizationProfileDto(Organization organization)
{ {
var dto = ObjectMapper.Map<Organization, OrganizationProfileDto>(organization); var dto = ObjectMapper.Map<Organization, OrganizationProfileDto>(organization);
@ -138,7 +142,7 @@ namespace EventHub.Admin.Organizations
{ {
var blobName = id.ToString(); var blobName = id.ToString();
var coverImageStream = await _organizationBlobContainer.GetOrNullAsync(blobName); var coverImageStream = await _organizationBlobContainer.GetOrNullAsync(blobName);
if (coverImageStream is null) if (coverImageStream is null)
{ {
return null; return null;
@ -153,5 +157,10 @@ namespace EventHub.Admin.Organizations
await _organizationBlobContainer.SaveAsync(blobName, coverImageContent.GetStream(), overrideExisting: true); 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.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using EventHub.Admin.Events; using EventHub.Admin.Events;
using EventHub.Events;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp; using Volo.Abp;
@ -47,16 +48,7 @@ namespace EventHub.Admin.Controllers.Events
var remoteStreamContent = await _eventAppService.GetCoverImageAsync(id); var remoteStreamContent = await _eventAppService.GetCoverImageAsync(id);
if (remoteStreamContent is null) if (remoteStreamContent is null)
{ {
var stream = _virtualFileProvider return null;
.GetFileInfo("/Images/eh-event.png")
.CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream)
{
ContentType = "image/png"
};
await stream.FlushAsync();
} }
Response.Headers.Add("Accept-Ranges", "bytes"); 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.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using EventHub.Admin.Organizations; using EventHub.Admin.Organizations;
using EventHub.Organizations;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp; using Volo.Abp;
@ -69,15 +70,7 @@ namespace EventHub.Admin.Controllers.Organizations
var remoteStreamContent = await _organizationAppService.GetCoverImageAsync(id); var remoteStreamContent = await _organizationAppService.GetCoverImageAsync(id);
if (remoteStreamContent is null) if (remoteStreamContent is null)
{ {
var stream = _virtualFileProvider return null;
.GetFileInfo("/Images/eh-organization.png")
.CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream)
{
ContentType = "image/png"
};
await stream.FlushAsync();
} }
Response.Headers.Add("Accept-Ranges", "bytes"); Response.Headers.Add("Accept-Ranges", "bytes");

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

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

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

@ -93,10 +93,6 @@ namespace EventHub.Admin
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<EventHubAdminHttpApiHostModule>(
baseNamespace: "EventHub.Admin",
baseFolder: "/Images");
if (hostingEnvironment.IsDevelopment()) if (hostingEnvironment.IsDevelopment())
{ {
options.FileSets.ReplaceEmbeddedByPhysical<EventHubDomainSharedModule>( 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" /> <PackageReference Include="Volo.Abp.Identity.Blazor.WebAssembly" Version="4.4.0-rc.1" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\**\*.*" />
</ItemGroup>
</Project> </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"/> <FileEdit MaxMessageSize="@EventConsts.MaxCoverImageFileSize" Filter="@string.Join(", ", EventConsts.AllowedCoverImageExtensions)" Changed="@OnCoverImageFileChanged" AutoReset="true"/>
</FieldBody> </FieldBody>
<Column ColumnSize="ColumnSize.Is3"> <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 else
{ {
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button> <Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
} }
</Column> </Column>
</Field> </Field>

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

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

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

@ -238,16 +238,16 @@
<Field Horizontal="true"> <Field Horizontal="true">
<FieldLabel ColumnSize="ColumnSize.Is3">@L["ChooseProfileImage"]</FieldLabel> <FieldLabel ColumnSize="ColumnSize.Is3">@L["ChooseProfileImage"]</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6"> <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> </FieldBody>
<Column ColumnSize="ColumnSize.Is3"> <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 else
{ {
<Button disabled Color="Color.Secondary" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button> <Button Color="Color.Warning" Clicked="@OnDeleteCoverImageButtonClicked">@L["DeleteCoverImage"]</Button>
} }
</Column> </Column>
</Field> </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 IFileEntry FileEntry { get; set; }
private bool IsLoadingProfileImage { get; set; } private bool IsLoadingProfileImage { get; set; }
private string SelectedTabInEditModal { get; set; } private string SelectedTabInEditModal { get; set; }
private bool DisabledProfileImageButton { get; set; }
public OrganizationManagement() public OrganizationManagement()
{ {
@ -76,7 +77,7 @@ namespace EventHub.Admin.Web.Pages
Organization = await OrganizationAppService.GetAsync(EditingOrganizationId); Organization = await OrganizationAppService.GetAsync(EditingOrganizationId);
FileEntry = new FileEntry(); FileEntry = new FileEntry();
ProfileImageUrl = UrlOptions.Value.AdminApi.EnsureEndsWith('/') + "api/eventhub/admin/organization/cover-image/" + EditingOrganizationId; await SetProfileImageUrlAsync();
EditingOrganization = ObjectMapper.Map<OrganizationProfileDto, UpdateOrganizationDto>(Organization); EditingOrganization = ObjectMapper.Map<OrganizationProfileDto, UpdateOrganizationDto>(Organization);
EditOrganizationModal.Show(); EditOrganizationModal.Show();
@ -87,6 +88,9 @@ namespace EventHub.Admin.Web.Pages
await OrganizationAppService.UpdateAsync(EditingOrganizationId, EditingOrganization); await OrganizationAppService.UpdateAsync(EditingOrganizationId, EditingOrganization);
await GetOrganizationsAsync(); await GetOrganizationsAsync();
EditOrganizationModal.Hide(); EditOrganizationModal.Hide();
ProfileImageUrl = null;
DisabledProfileImageButton = false;
} }
private void OnDeleteCoverImageButtonClicked() private void OnDeleteCoverImageButtonClicked()
@ -94,6 +98,7 @@ namespace EventHub.Admin.Web.Pages
EditingOrganization.ProfilePictureStreamContent = null; EditingOrganization.ProfilePictureStreamContent = null;
FileEntry = new FileEntry(); FileEntry = new FileEntry();
ProfileImageUrl = null; ProfileImageUrl = null;
DisabledProfileImageButton = true;
IsLoadingProfileImage = false; IsLoadingProfileImage = false;
} }
@ -123,18 +128,19 @@ namespace EventHub.Admin.Web.Pages
FileName = FileEntry.Name FileName = FileEntry.Name
}; };
SetProfileImageUrl(FileEntry.Type, stream.ToArray()); void SetProfileImageUrl(string contentType, byte[] content)
await InvokeAsync(StateHasChanged);
}
private void SetProfileImageUrl(string contentType, byte[] content)
{
if (content != null)
{ {
contentType = string.IsNullOrWhiteSpace(contentType) ? "image/png" : contentType; if (content != null)
var imageDataUrl = $"data:{contentType};base64,{Convert.ToBase64String(content)}"; {
ProfileImageUrl = imageDataUrl; 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) private void OnProgressedForProfileImage(FileProgressedEventArgs e)
@ -163,6 +169,18 @@ namespace EventHub.Admin.Web.Pages
await GetOrganizationsAsync(); 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 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 MaxInstagramUsernameLength = 24;
public const int MaxMediumUsernameLength = 24; public const int MaxMediumUsernameLength = 24;
public static string[] AllowedProfilePictureExtensions = { ".jpg", ".png" };
} }
} }

Loading…
Cancel
Save