Browse Source

refactor(EventHub.Web): Use IRemoteContentStream instead of byte array for Events

pull/62/head
Berkan Sasmaz 5 years ago
parent
commit
277f6e72ac
  1. 3
      src/EventHub.Application.Contracts/Events/CreateEventDto.cs
  2. 4
      src/EventHub.Application.Contracts/Events/EventDetailDto.cs
  3. 2
      src/EventHub.Application.Contracts/Events/EventInListDto.cs
  4. 3
      src/EventHub.Application.Contracts/Events/IEventAppService.cs
  5. 3
      src/EventHub.Application.Contracts/Events/UpdateEventDto.cs
  6. 33
      src/EventHub.Application/Events/EventAppService.cs
  7. 24
      src/EventHub.Application/Organizations/OrganizationAppService.cs
  8. 24
      src/EventHub.HttpApi.Host/Controllers/Events/EventController.cs
  9. 2
      src/EventHub.HttpApi.Host/Controllers/Organizations/OrganizationController.cs
  10. 2
      src/EventHub.HttpApi.Host/EventHub.HttpApi.Host.csproj
  11. 5
      src/EventHub.HttpApi.Host/EventHubHttpApiHostModule.cs
  12. BIN
      src/EventHub.HttpApi.Host/Images/eh-event.png
  13. 0
      src/EventHub.HttpApi.Host/Images/eh-organization.png
  14. 15
      src/EventHub.Web/Controllers/EventController.cs
  15. 2
      src/EventHub.Web/EventHubWebAutoMapperProfile.cs
  16. 18
      src/EventHub.Web/Pages/Events/Components/EventsArea/_eventListSection.cshtml
  17. 21
      src/EventHub.Web/Pages/Events/Detail.cshtml
  18. 12
      src/EventHub.Web/Pages/Events/Edit.cshtml
  19. 21
      src/EventHub.Web/Pages/Events/Edit.cshtml.cs
  20. 20
      src/EventHub.Web/Pages/Events/New.cshtml.cs
  21. 26
      src/EventHub.Web/Pages/Index.cshtml
  22. 1
      src/EventHub.Web/Pages/Organizations/Edit.cshtml.cs
  23. 2
      src/EventHub.Web/Pages/Organizations/New.cshtml.cs

3
src/EventHub.Application.Contracts/Events/CreateEventDto.cs

@ -1,6 +1,7 @@
using System;
using System.ComponentModel.DataAnnotations;
using JetBrains.Annotations;
using Volo.Abp.Content;
namespace EventHub.Events
{
@ -24,7 +25,7 @@ namespace EventHub.Events
public string Description { get; set; }
[CanBeNull]
public byte[] CoverImageContent { get; set; }
public IRemoteStreamContent CoverImageStreamContent { get; set; }
public bool IsOnline { get; set; }

4
src/EventHub.Application.Contracts/Events/EventDetailDto.cs

@ -22,9 +22,7 @@ namespace EventHub.Events
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public byte[] CoverImageContent { get; set; }
public bool IsOnline { get; set; }
public string OnlineLink { get; set; }

2
src/EventHub.Application.Contracts/Events/EventInListDto.cs

@ -16,8 +16,6 @@ namespace EventHub.Events
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public byte[] CoverImageContent { get; set; }
public bool IsOnline { get; set; }

3
src/EventHub.Application.Contracts/Events/IEventAppService.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace EventHub.Events
{
@ -22,6 +23,6 @@ namespace EventHub.Events
Task UpdateAsync(Guid id, UpdateEventDto input);
Task<byte[]> GetCoverImageAsync(Guid id);
Task<IRemoteStreamContent> GetCoverImageAsync(Guid id);
}
}

3
src/EventHub.Application.Contracts/Events/UpdateEventDto.cs

@ -1,6 +1,7 @@
using System;
using System.ComponentModel.DataAnnotations;
using JetBrains.Annotations;
using Volo.Abp.Content;
namespace EventHub.Events
{
@ -15,7 +16,7 @@ namespace EventHub.Events
public string Description { get; set; }
[CanBeNull]
public byte[] CoverImageContent { get; set; }
public IRemoteStreamContent CoverImageStreamContent { get; set; }
[Required]
[DataType(DataType.DateTime)]

33
src/EventHub.Application/Events/EventAppService.cs

@ -5,11 +5,11 @@ using System.Threading.Tasks;
using EventHub.Countries;
using EventHub.Events.Registrations;
using EventHub.Organizations;
using EventHub.Users;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Authorization;
using Volo.Abp.BlobStoring;
using Volo.Abp.Content;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Volo.Abp.Users;
@ -73,9 +73,9 @@ namespace EventHub.Events
await _eventManager.SetCapacityAsync(@event, input.Capacity);
if (input.CoverImageContent != null && input.CoverImageContent.Length > 0)
if (input.CoverImageStreamContent != null && input.CoverImageStreamContent.ContentLength > 0)
{
await SaveCoverImageAsync(@event.Id, input.CoverImageContent);
await SaveCoverImageAsync(@event.Id, input.CoverImageStreamContent);
}
await _eventRepository.InsertAsync(@event);
@ -161,11 +161,6 @@ namespace EventHub.Events
}
).ToList();
foreach (var @event in events)
{
@event.CoverImageContent = await GetCoverImageAsync(@event.Id);
}
return new PagedResultDto<EventInListDto>(totalCount, events);
}
@ -179,8 +174,7 @@ namespace EventHub.Events
dto.OrganizationId = organization.Id;
dto.OrganizationName = organization.Name;
dto.OrganizationDisplayName = organization.DisplayName;
dto.CoverImageContent = await GetCoverImageAsync(dto.Id);
var user = await _userRepository.GetAsync(organization.OwnerUserId);
dto.OwnerUserName = user.UserName;
dto.OwnerEmail = user.Email;
@ -254,26 +248,33 @@ namespace EventHub.Events
@event.SetTime(input.StartTime, input.EndTime);
await _eventManager.SetCapacityAsync(@event, input.Capacity);
if (input.CoverImageContent != null && input.CoverImageContent.Length > 0)
if (input.CoverImageStreamContent != null && input.CoverImageStreamContent.ContentLength > 0)
{
await SaveCoverImageAsync(@event.Id, input.CoverImageContent);
await SaveCoverImageAsync(@event.Id, input.CoverImageStreamContent);
}
await _eventRepository.UpdateAsync(@event);
}
public async Task<byte[]> GetCoverImageAsync(Guid id)
public async Task<IRemoteStreamContent> GetCoverImageAsync(Guid id)
{
var blobName = id.ToString();
return await _eventBlobContainer.GetAllBytesOrNullAsync(blobName);
var coverImageStream = await _eventBlobContainer.GetOrNullAsync(blobName);
if (coverImageStream is null)
{
return null;
}
return new RemoteStreamContent(coverImageStream, blobName);
}
private async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent)
private async Task SaveCoverImageAsync(Guid id, IRemoteStreamContent streamContent)
{
var blobName = id.ToString();
await _eventBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true);
await _eventBlobContainer.SaveAsync(blobName, streamContent.GetStream(), overrideExisting: true);
}
}
}

24
src/EventHub.Application/Organizations/OrganizationAppService.cs

@ -146,22 +146,7 @@ namespace EventHub.Organizations
await _organizationRepository.UpdateAsync(organization);
}
private async Task SaveProfilePictureAsync(Guid id, IRemoteStreamContent streamContent)
{
var organization = await _organizationRepository.GetAsync(x => x.Id == id);
if (organization.OwnerUserId != CurrentUser.GetId())
{
throw new AbpAuthorizationException(EventHubErrorCodes.NotAuthorizedToUpdateOrganizationProfile)
.WithData("Name", organization.DisplayName);
}
var blobName = id.ToString();
await _organizationBlobContainer.SaveAsync(blobName, streamContent.GetStream(), overrideExisting: true);
}
public async Task<IRemoteStreamContent> GetProfilePictureAsync(Guid id)
{
var blobName = id.ToString();
@ -175,5 +160,12 @@ namespace EventHub.Organizations
return new RemoteStreamContent(pictureContent, blobName);
}
private async Task SaveProfilePictureAsync(Guid id, IRemoteStreamContent streamContent)
{
var blobName = id.ToString();
await _organizationBlobContainer.SaveAsync(blobName, streamContent.GetStream(), overrideExisting: true);
}
}
}

24
src/EventHub.HttpApi.Host/Controllers/Events/EventController.cs

@ -6,6 +6,8 @@ using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Content;
using Volo.Abp.VirtualFileSystem;
namespace EventHub.Controllers.Events
{
@ -16,10 +18,14 @@ namespace EventHub.Controllers.Events
public class EventController : AbpController, IEventAppService
{
private readonly IEventAppService _eventAppService;
private readonly IVirtualFileProvider _virtualFileProvider;
public EventController(IEventAppService eventAppService)
public EventController(
IEventAppService eventAppService,
IVirtualFileProvider virtualFileProvider)
{
_eventAppService = eventAppService;
_virtualFileProvider = virtualFileProvider;
}
[HttpPost]
@ -71,9 +77,21 @@ namespace EventHub.Controllers.Events
[HttpGet]
[Route("cover-image/{id}")]
public async Task<byte[]> GetCoverImageAsync(Guid id)
public async Task<IRemoteStreamContent> GetCoverImageAsync(Guid id)
{
return await _eventAppService.GetCoverImageAsync(id);
var remoteStreamContent = await _eventAppService.GetCoverImageAsync(id);
if (remoteStreamContent is null)
{
var stream = _virtualFileProvider.GetFileInfo("/Images/eh-event.png").CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream);
await stream.FlushAsync();
}
Response.Headers.Add("Accept-Ranges", "bytes");
Response.ContentType = remoteStreamContent.ContentType;
return remoteStreamContent;
}
}
}

2
src/EventHub.HttpApi.Host/Controllers/Organizations/OrganizationController.cs

@ -75,7 +75,7 @@ namespace EventHub.Controllers.Organizations
if (remoteStreamContent is null)
{
await using var stream = _virtualFileProvider.GetFileInfo("/Controllers/Organizations/ProfilePictures/eh-organization.png").CreateReadStream();
var stream = _virtualFileProvider.GetFileInfo("/Images/eh-organization.png").CreateReadStream();
remoteStreamContent = new RemoteStreamContent(stream);
await stream.FlushAsync();
}

2
src/EventHub.HttpApi.Host/EventHub.HttpApi.Host.csproj

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

5
src/EventHub.HttpApi.Host/EventHubHttpApiHostModule.cs

@ -11,6 +11,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using EventHub.EntityFrameworkCore;
using EventHub.Events;
using EventHub.Organizations;
using EventHub.Utils;
using EventHub.Web;
@ -71,6 +72,8 @@ namespace EventHub
{
options.ConventionalControllers.FormBodyBindingIgnoredTypes.Add(typeof(CreateOrganizationDto));
options.ConventionalControllers.FormBodyBindingIgnoredTypes.Add(typeof(UpdateOrganizationDto));
options.ConventionalControllers.FormBodyBindingIgnoredTypes.Add(typeof(CreateEventDto));
options.ConventionalControllers.FormBodyBindingIgnoredTypes.Add(typeof(UpdateEventDto));
});
}
@ -95,7 +98,7 @@ namespace EventHub
{
options.FileSets.AddEmbedded<EventHubHttpApiHostModule>(
baseNamespace: "EventHub",
baseFolder: "/Controllers/Organizations/ProfilePictures");
baseFolder: "/Images");
if (hostingEnvironment.IsDevelopment())
{

BIN
src/EventHub.HttpApi.Host/Images/eh-event.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

0
src/EventHub.HttpApi.Host/Controllers/Organizations/ProfilePictures/eh-organization.png → src/EventHub.HttpApi.Host/Images/eh-organization.png

Before

Width:  |  Height:  |  Size: 544 KiB

After

Width:  |  Height:  |  Size: 544 KiB

15
src/EventHub.Web/Controllers/EventController.cs

@ -1,4 +1,3 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using EventHub.Events;
@ -29,19 +28,5 @@ namespace EventHub.Web.Controllers
ViewData = ViewData
};
}
[HttpGet]
[Route("cover-picture-source/{eventId}")]
public async Task<IActionResult> GetArticleCoverImageAsync(Guid eventId)
{
var coverImageContent = await _eventAppService.GetCoverImageAsync(eventId);
if (coverImageContent == null)
{
return NotFound();
}
return File(coverImageContent, "image/jpeg");
}
}
}

2
src/EventHub.Web/EventHubWebAutoMapperProfile.cs

@ -13,7 +13,7 @@ namespace EventHub.Web
{
CreateMap<NewPageModel.CreateOrganizationViewModel, CreateOrganizationDto>();
CreateMap<Pages.Events.NewPageModel.NewEventViewModel, CreateEventDto>()
.Ignore(x => x.CoverImageContent);
.Ignore(x => x.CoverImageStreamContent);
CreateMap<OrganizationProfileDto, EditOrganizationViewModel>();
CreateMap<EditOrganizationViewModel, UpdateOrganizationDto>();
CreateMap<EventDetailDto, EditPageModel.EditEventViewModel>();

18
src/EventHub.Web/Pages/Events/Components/EventsArea/_eventListSection.cshtml

@ -1,22 +1,16 @@
@using System.Globalization
@using EventHub.Web.Helpers
@using EventHub.Web
@using EventHub.Web.Pages.Events
@using Microsoft.Extensions.Options
@model List<EventHub.Events.EventInListDto>
@inject IOptions<EventHubUrlOptions> UrlOptions
@foreach (var eventDto in Model)
{
<div class="col-lg-4 col-md-6 event">
<div class="card">
@if (eventDto.CoverImageContent is null)
{
<div class="event-thumbnail" style="background-image: url(/assets/eh-event.png);" alt="@eventDto.Title">
</div>
}
else
{
<div class="event-thumbnail" style="background-image: url( @($"data:image/png;base64,{Convert.ToBase64String(eventDto.CoverImageContent)}")" alt="@eventDto.Title">
</div>
}
<div class="event-thumbnail" style="background-image: url(@(UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{eventDto.Id}")" alt="@eventDto.Title">
</div>
<div class="card-body">
<div class="event-container">
<div class="form-row">
@ -32,7 +26,7 @@
<small>@eventDto.StartTime.ToString("hh tt", CultureInfo.InvariantCulture) - @eventDto.EndTime.ToString("hh tt", CultureInfo.InvariantCulture) | @EventDateHelper.GetLocationInfo(eventDto)</small>
<p>@eventDto.Description</p>
</div>
<a href="@Url.Page("/Events/Detail", new {url = eventDto.Url})" class="btn btn-link p-0">Learn More <img src="/assets/more-btn.svg"></a>
<a href="@Url.Page("/Events/Detail", new { url = eventDto.Url })" class="btn btn-link p-0">Learn More <img src="/assets/more-btn.svg"></a>
</div>
</div>
</div>

21
src/EventHub.Web/Pages/Events/Detail.cshtml

@ -24,17 +24,7 @@
@{
string description = Model.Event.Description.Length >= 160 ? Model.Event.Description.TruncateWithPostfix(155) : Model.Event.Description;
string title = Model.Event.Title;
string coverImageUrl;
if (Model.Event.CoverImageContent is null)
{
// TODO(berkansasmaz): Get a default image from the design team to be used in social media posts
coverImageUrl = UrlOptions.Value.Www + "/assets/slide.jpg";
}
else
{
coverImageUrl = $"{UrlOptions.Value.Www}/api/event/cover-picture-source/{Model.Event.Id}";
}
string coverImageUrl = UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{Model.Event.Id}";
ViewBag.Title = title;
ViewBag.Description = description;
@ -52,14 +42,7 @@
<div class="row">
<div class="col-md-7">
<div class="detail-image">
@if (Model.Event.CoverImageContent == null)
{
<img src="/assets/eh-event.png" class="detail-img" alt="@Model.Event.Title">
}
else
{
<img class="detail-img" src="@($"data:image/png;base64,{Convert.ToBase64String(Model.Event.CoverImageContent)}")" alt="@Model.Event.Title">
}
<img class="detail-img" src="@(UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{Model.Event.Id}")" alt="@Model.Event.Title">
</div>
</div>

12
src/EventHub.Web/Pages/Events/Edit.cshtml

@ -1,8 +1,11 @@
@page "/event/edit/{url}"
@inject IHtmlLocalizer<EventHubResource> L
@using EventHub.Localization
@using EventHub.Web
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@model EventHub.Web.Pages.Events.EditPageModel
@inject IOptions<EventHubUrlOptions> UrlOptions
@section scripts {
<abp-script src="/Pages/Events/Edit.js"/>
@ -62,14 +65,7 @@
<div class="row">
<div class="col-5">
<div class="image-area">
@if (Model.CoverImageContent != null && Model.CoverImageContent.Length > 0)
{
<img id="imageResult" src="@($"data:image/png;base64,{Convert.ToBase64String(Model.CoverImageContent)}")" alt="" class="img-fluid rounded shadow-sm mx-auto d-block">
}
else
{
<img id="imageResult" src="#" alt="" class="img-fluid rounded shadow-sm mx-auto d-block">
}
<img id="imageResult" src="@(UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{Model.Event.Id}")" alt="" class="img-fluid rounded shadow-sm mx-auto d-block">
</div>
</div>
<div class="col-7">

21
src/EventHub.Web/Pages/Events/Edit.cshtml.cs

@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using NUglify.Helpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.Content;
using Volo.Abp.Users;
namespace EventHub.Web.Pages.Events
@ -30,7 +31,6 @@ namespace EventHub.Web.Pages.Events
public List<SelectListItem> Organizations { get; private set; }
public List<SelectListItem> Countries { get; private set; }
public List<SelectListItem> Languages { get; private set; }
public byte[] CoverImageContent { get; private set; }
private readonly IEventAppService _eventAppService;
private readonly IOrganizationAppService _organizationAppService;
@ -47,7 +47,7 @@ namespace EventHub.Web.Pages.Events
{
var urlCode = EventUrlCodeHelper.GetCodeFromUrl(Url);
var eventDetailDto = await _eventAppService.GetByUrlCodeAsync(urlCode);
CoverImageContent = eventDetailDto.CoverImageContent;
Event = ObjectMapper.Map<EventDetailDto, EditEventViewModel>(eventDetailDto);
await FillOrganizationsAsync();
@ -61,19 +61,22 @@ namespace EventHub.Web.Pages.Events
{
ValidateModel();
var input = ObjectMapper.Map<EditEventViewModel, UpdateEventDto>(Event);
var updateEventDto = ObjectMapper.Map<EditEventViewModel, UpdateEventDto>(Event);
await using var memoryStream = new MemoryStream();
if (Event.CoverImageFile != null && Event.CoverImageFile.Length > 0)
{
using (var memoryStream = new MemoryStream())
await Event.CoverImageFile.CopyToAsync(memoryStream);
updateEventDto.CoverImageStreamContent = new RemoteStreamContent(memoryStream)
{
await Event.CoverImageFile.CopyToAsync(memoryStream);
input.CoverImageContent = memoryStream.ToArray();
}
ContentType = Event.CoverImageFile.ContentType,
FileName = Event.CoverImageFile.FileName,
};
}
await _eventAppService.UpdateAsync(Event.Id, input);
await _eventAppService.UpdateAsync(Event.Id, updateEventDto);
await memoryStream.DisposeAsync();
return RedirectToPage("./Detail", new { url = Url });
}
catch (Exception exception)

20
src/EventHub.Web/Pages/Events/New.cshtml.cs

@ -15,13 +15,15 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using NUglify.Helpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.Content;
using Volo.Abp.Users;
namespace EventHub.Web.Pages.Events
{
public class NewPageModel : EventHubPageModel
{
[BindProperty] public NewEventViewModel Event { get; set; }
[BindProperty]
public NewEventViewModel Event { get; set; }
public List<SelectListItem> Organizations { get; private set; }
public List<SelectListItem> Countries { get; private set; }
@ -57,18 +59,22 @@ namespace EventHub.Web.Pages.Events
{
ValidateModel();
var input = ObjectMapper.Map<NewEventViewModel, CreateEventDto>(Event);
var createEventDto = ObjectMapper.Map<NewEventViewModel, CreateEventDto>(Event);
await using var memoryStream = new MemoryStream();
if (Event.CoverImageFile != null && Event.CoverImageFile.Length > 0)
{
using (var memoryStream = new MemoryStream())
await Event.CoverImageFile.CopyToAsync(memoryStream);
createEventDto.CoverImageStreamContent = new RemoteStreamContent(memoryStream)
{
await Event.CoverImageFile.CopyToAsync(memoryStream);
input.CoverImageContent = memoryStream.ToArray();
}
ContentType = Event.CoverImageFile.ContentType,
FileName = Event.CoverImageFile.FileName
};
}
var eventDto = await _eventAppService.CreateAsync(input);
var eventDto = await _eventAppService.CreateAsync(createEventDto);
await memoryStream.DisposeAsync();
return RedirectToPage("/Events/Detail", new {url = eventDto.UrlCode});
}

26
src/EventHub.Web/Pages/Index.cshtml

@ -152,16 +152,8 @@
<div class="card mb-3">
<div class="row no-glutters">
<div class="col-5 pr-0">
@if (Model.OnlineEvents[i].CoverImageContent is null)
{
<div class="event-thumbnail-left" style="background-image: url(/assets/eh-event.png);">
</div>
}
else
{
<div class="event-thumbnail-left" style="background-image: url( @($"data:image/png;base64,{Convert.ToBase64String(Model.OnlineEvents[i].CoverImageContent)}") );" alt="@Model.OnlineEvents[i].Title">
</div>
}
<div class="event-thumbnail-left" style="background-image: url( @(UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{Model.OnlineEvents[i].Id}") );" alt="@Model.OnlineEvents[i].Title">
</div>
</div>
<div class="col-7">
<div class="card-body">
@ -171,7 +163,7 @@
<small>@Model.OnlineEvents[i].StartTime.ToString("MMMM dd, yyyy dddd") <br /> @Model.OnlineEvents[i].StartTime.ToString("hh tt", CultureInfo.InvariantCulture) - @Model.OnlineEvents[i].EndTime.ToString("hh tt", CultureInfo.InvariantCulture) | Online</small>
<p>@Model.OnlineEvents[i].Description</p>
</div>
<a href="@Url.Page("/Events/Detail", new {url = @Model.OnlineEvents[i].Url})" class="btn btn-link p-0">Learn More <img src="/assets/more-btn.svg"></a>
<a href="@Url.Page("/Events/Detail", new {url = Model.OnlineEvents[i].Url})" class="btn btn-link p-0">Learn More <img src="/assets/more-btn.svg"></a>
</div>
</div>
</div>
@ -182,16 +174,8 @@
<div class="card mb-3">
<div class="row no-glutters">
<div class="col-5 pr-0">
@if (Model.OnlineEvents[i + 1].CoverImageContent is null)
{
<div class="event-thumbnail-left" style="background-image: url(/assets/eh-event.png);">
</div>
}
else
{
<div class="event-thumbnail-left" style="background-image: url( @($"data:image/png;base64,{Convert.ToBase64String(Model.OnlineEvents[i + 1].CoverImageContent)}") );" alt="@Model.OnlineEvents[i + 1].Title">
</div>
}
<div class="event-thumbnail-left" style="background-image: url( @(UrlOptions.Value.Api.EnsureEndsWith('/') + $"api/eventhub/event/cover-image/{Model.OnlineEvents[i + 1].Id}") );" alt="@Model.OnlineEvents[i + 1].Title">
</div>
</div>
<div class="col-7">
<div class="card-body">

1
src/EventHub.Web/Pages/Organizations/Edit.cshtml.cs

@ -56,6 +56,7 @@ namespace EventHub.Web.Pages.Organizations
}
await _organizationAppService.UpdateAsync(Organization.Id, updateOrganizationDto);
await memoryStream.DisposeAsync();
return RedirectToPage("./Profile", new { name = Name });
}

2
src/EventHub.Web/Pages/Organizations/New.cshtml.cs

@ -52,7 +52,7 @@ namespace EventHub.Web.Pages.Organizations
}
await _organizationAppService.CreateAsync(createOrganizationDto);
await memoryStream.FlushAsync();
await memoryStream.DisposeAsync();
return RedirectToPage("./Profile", new {name = Organization.Name});
}

Loading…
Cancel
Save