Browse Source

Created initial non-functional new event page and tests.

pull/15/head
Halil İbrahim Kalkan 6 years ago
parent
commit
0ba8e8b4b7
  1. 27
      eventhub/src/EventHub.Application.Contracts/Events/CreateEventDto.cs
  2. 10
      eventhub/src/EventHub.Application.Contracts/Events/IEventAppService.cs
  3. 2
      eventhub/src/EventHub.Application.Contracts/Organizations/IOrganizationAppService.cs
  4. 12
      eventhub/src/EventHub.Application/Events/EventAppService.cs
  5. 13
      eventhub/src/EventHub.Application/Organizations/OrganizationAppService.cs
  6. 11
      eventhub/src/EventHub.Domain.Shared/Events/EventConsts.cs
  7. 9
      eventhub/src/EventHub.Domain.Shared/Localization/EventHub/en.json
  8. 4
      eventhub/src/EventHub.Domain/EventHub.Domain.csproj
  9. 1
      eventhub/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/EventHubDbContextModelCreatingExtensions.cs
  10. 5
      eventhub/src/EventHub.Web/EventHubWebAutoMapperProfile.cs
  11. 10
      eventhub/src/EventHub.Web/Pages/Events/New.cshtml
  12. 90
      eventhub/src/EventHub.Web/Pages/Events/New.cshtml.cs
  13. 34
      eventhub/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs
  14. 14
      eventhub/test/EventHub.TestBase/EventHubTestDataSeedContributor.cs

27
eventhub/src/EventHub.Application.Contracts/Events/CreateEventDto.cs

@ -0,0 +1,27 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace EventHub.Events
{
public class CreateEventDto
{
public Guid OrganizationId { get; set; }
[Required]
[StringLength(EventConsts.MaxTitleLength, MinimumLength = EventConsts.MinTitleLength)]
public string Title { get; set; }
[Required]
public DateTime StartTime { get; set; }
[Required]
public DateTime EndTime { get; set; }
[Required]
[StringLength(EventConsts.MaxDescriptionLength, MinimumLength = EventConsts.MinDescriptionLength)]
public string Description { get; set; }
public bool IsOnline { get; set; }
public int? Capacity { get; set; }
}}

10
eventhub/src/EventHub.Application.Contracts/Events/IEventAppService.cs

@ -0,0 +1,10 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventHub.Events
{
public interface IEventAppService : IApplicationService
{
Task CreateAsync(CreateEventDto input);
}
}

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

@ -11,5 +11,7 @@ namespace EventHub.Organizations
Task<PagedResultDto<OrganizationInListDto>> GetListAsync(PagedResultRequestDto input);
Task<OrganizationProfileDto> GetProfileAsync(string name);
Task<ListResultDto<OrganizationInListDto>> GetMyOrganizationsAsync();
}
}

12
eventhub/src/EventHub.Application/Events/EventAppService.cs

@ -0,0 +1,12 @@
using System.Threading.Tasks;
namespace EventHub.Events
{
public class EventAppService : EventHubAppService, IEventAppService
{
public async Task CreateAsync(CreateEventDto input)
{
}
}
}

13
eventhub/src/EventHub.Application/Organizations/OrganizationAppService.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
@ -52,5 +53,17 @@ namespace EventHub.Organizations
var organization = await _organizationRepository.GetAsync(o => o.Name == name);
return ObjectMapper.Map<Organization, OrganizationProfileDto>(organization);
}
[Authorize]
public async Task<ListResultDto<OrganizationInListDto>> GetMyOrganizationsAsync()
{
var currentUserId = CurrentUser.GetId();
var query = (await _organizationRepository.GetQueryableAsync()).Where(o => o.OwnerUserId == currentUserId);
var organizations = await AsyncExecuter.ToListAsync(query);
return new ListResultDto<OrganizationInListDto>(
ObjectMapper.Map<List<Organization>, List<OrganizationInListDto>>(organizations)
);
}
}
}

11
eventhub/src/EventHub.Domain.Shared/Events/EventConsts.cs

@ -0,0 +1,11 @@
namespace EventHub.Events
{
public static class EventConsts
{
public const int MinTitleLength = 8;
public const int MaxTitleLength = 128;
public const int MinDescriptionLength = 50;
public const int MaxDescriptionLength = 2000;
}
}

9
eventhub/src/EventHub.Domain.Shared/Localization/EventHub/en.json

@ -11,9 +11,16 @@
"DisplayName:Name": "Name",
"DisplayName:DisplayName": "Display Name",
"DisplayName:Description": "Description",
"DisplayName:Title": "Title",
"DisplayName:StartTime": "Start Time",
"DisplayName:EndTime": "End Time",
"DisplayName:IsOnline": "Is Online?",
"DisplayName:Capacity": "Capacity",
"EventHub:OrganizationNameAlreadyExists": "The organization {Name} already exists. Please use another name.",
"Events": "Events",
"Members": "Members",
"SeeOrganization": "See Organization"
"SeeOrganization": "See Organization",
"Organization": "Organization",
"Submit": "Submit"
}
}

4
eventhub/src/EventHub.Domain/EventHub.Domain.csproj

@ -22,4 +22,8 @@
<PackageReference Include="Volo.Abp.SettingManagement.Domain" Version="4.2.0-rc.1" />
</ItemGroup>
<ItemGroup>
<Folder Include="Events" />
</ItemGroup>
</Project>

1
eventhub/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/EventHubDbContextModelCreatingExtensions.cs

@ -21,6 +21,7 @@ namespace EventHub.EntityFrameworkCore
b.Property(x => x.Name).IsRequired().HasMaxLength(OrganizationConsts.MaxNameLength);
b.Property(x => x.DisplayName).IsRequired().HasMaxLength(OrganizationConsts.MaxDisplayNameLength);
b.Property(x => x.Description).IsRequired().HasMaxLength(OrganizationConsts.MaxDescriptionNameLength);
b.HasIndex(x => x.Name);
b.HasIndex(x => x.DisplayName);

5
eventhub/src/EventHub.Web/EventHubWebAutoMapperProfile.cs

@ -1,6 +1,6 @@
using AutoMapper;
using EventHub.Events;
using EventHub.Organizations;
using EventHub.Web.Pages.Organizations;
namespace EventHub.Web
{
@ -8,7 +8,8 @@ namespace EventHub.Web
{
public EventHubWebAutoMapperProfile()
{
CreateMap<New.CreateOrganizationViewModel, CreateOrganizationDto>();
CreateMap<EventHub.Web.Pages.Organizations.New.CreateOrganizationViewModel, CreateOrganizationDto>();
CreateMap<EventHub.Web.Pages.Events.New.NewEventViewModel, CreateEventDto>();
}
}
}

10
eventhub/src/EventHub.Web/Pages/Events/New.cshtml

@ -4,3 +4,13 @@
@using Microsoft.AspNetCore.Mvc.Localization
@model EventHub.Web.Pages.Events.New
<h1>@L["NewEvent"]</h1>
<form method="post">
<abp-select asp-for="Event.OrganizationId" />
<abp-input asp-for="Event.Title" />
<abp-input asp-for="Event.StartTime" />
<abp-input asp-for="Event.EndTime" />
<abp-input asp-for="Event.Description" />
<abp-input asp-for="Event.IsOnline" />
<abp-input asp-for="Event.Capacity" />
<abp-button size="Large" button-type="Primary" type="submit" text="@L["Submit"].Value" />
</form>

90
eventhub/src/EventHub.Web/Pages/Events/New.cshtml.cs

@ -1,10 +1,96 @@
namespace EventHub.Web.Pages.Events
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using EventHub.Events;
using EventHub.Organizations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
namespace EventHub.Web.Pages.Events
{
public class New : EventHubPageModel
{
public void OnGet()
[BindProperty]
public NewEventViewModel Event { get; set; }
public List<SelectListItem> Organizations { get; set; }
private readonly IEventAppService _eventAppService;
private readonly IOrganizationAppService _organizationAppService;
public New(
IEventAppService eventAppService,
IOrganizationAppService organizationAppService)
{
_eventAppService = eventAppService;
_organizationAppService = organizationAppService;
}
public async Task OnGetAsync()
{
Event = new NewEventViewModel
{
StartTime = DateTime.Now.ClearTime().AddDays(1).AddHours(19),
EndTime = DateTime.Now.ClearTime().AddDays(1).AddHours(21)
};
var result = await _organizationAppService.GetMyOrganizationsAsync();
Organizations = result.Items.Select(
organization => new SelectListItem
{
Value = organization.Id.ToString(),
Text = organization.DisplayName
}
).ToList();
}
public async Task<IActionResult> OnPostAsync()
{
try
{
ValidateModel();
var input = ObjectMapper.Map<NewEventViewModel, CreateEventDto>(Event);
await _eventAppService.CreateAsync(input);
//TODO: Redirect to the event!
return RedirectToPage("/");
}
catch (Exception exception)
{
ShowAlert(exception);
return Page();
}
}
public class NewEventViewModel
{
[SelectItems(nameof(Organizations))]
[DisplayName("Organization")]
public Guid OrganizationId { get; set; }
[Required]
[StringLength(EventConsts.MaxTitleLength, MinimumLength = EventConsts.MinTitleLength)]
public string Title { get; set; }
[Required]
public DateTime StartTime { get; set; }
[Required]
public DateTime EndTime { get; set; }
[Required]
[StringLength(EventConsts.MaxDescriptionLength, MinimumLength = EventConsts.MinDescriptionLength)]
[TextArea]
public string Description { get; set; }
public bool IsOnline { get; set; }
public int? Capacity { get; set; }
}
}
}

34
eventhub/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs

@ -0,0 +1,34 @@
using System;
using System.Threading.Tasks;
using Xunit;
namespace EventHub.Events
{
public class EventAppServiceTests : EventHubApplicationTestBase
{
private readonly IEventAppService _eventAppService;
private readonly EventHubTestData _testData;
public EventAppServiceTests()
{
_eventAppService = GetRequiredService<IEventAppService>();
_testData = GetRequiredService<EventHubTestData>();
}
[Fact]
public async Task Should_Create_A_New_Valid_Event()
{
await _eventAppService.CreateAsync(
new CreateEventDto
{
OrganizationId = _testData.OrganizationVolosoftId,
Title = "Introduction to the ABP Framework",
Description = "In this event, we will introduce the ABP Framework and explore the fundamental features.",
StartTime = DateTime.Now.AddDays(1),
EndTime = DateTime.Now.AddDays(1).AddHours(3),
IsOnline = true
}
);
}
}
}

14
eventhub/test/EventHub.TestBase/EventHubTestDataSeedContributor.cs

@ -3,24 +3,24 @@ using System.Threading.Tasks;
using EventHub.Organizations;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Users;
namespace EventHub
{
public class EventHubTestDataSeedContributor : IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Organization, Guid> _organizationRepository;
private readonly OrganizationManager _organizationManager;
private readonly ICurrentUser _currentUser;
private readonly EventHubTestData _eventHubTestData;
public EventHubTestDataSeedContributor(
IRepository<Organization, Guid> organizationRepository,
EventHubTestData eventHubTestData,
OrganizationManager organizationManager)
OrganizationManager organizationManager,
ICurrentUser currentUser)
{
_organizationRepository = organizationRepository;
_eventHubTestData = eventHubTestData;
_organizationManager = organizationManager;
_currentUser = currentUser;
}
public async Task SeedAsync(DataSeedContext context)
@ -31,7 +31,7 @@ namespace EventHub
private async Task CreateOrganizationsAsync()
{
var volosoft = await _organizationManager.CreateAsync(
Guid.NewGuid(),
_currentUser.GetId(),
_eventHubTestData.OrganizationVolosoftName,
"Volosoft",
"Volosoft is producing software development tools for developers. We are organizing events related to the ABP.IO platform and general software development topic."
@ -39,7 +39,7 @@ namespace EventHub
_eventHubTestData.OrganizationVolosoftId = volosoft.Id;
var dotnetEurope = await _organizationManager.CreateAsync(
Guid.NewGuid(),
_currentUser.GetId(),
_eventHubTestData.OrganizationDotnetEuropeName,
"Dotnet Europe",
"Organizing events on Microsoft's .NET Platform in European Countries."

Loading…
Cancel
Save