Skip to content

Commit

Permalink
#130 Added Mail Message REST API Controller
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonGeering committed Sep 1, 2020
1 parent ba0531d commit 1845ade
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
<ItemGroup>
<Folder Include="WebAPI\v1\DashboardModule\" />
<Folder Include="WebAPI\v1\BillingModule\" />
<Folder Include="WebAPI\v1\MailModule\" />
<Folder Include="WebAPI\v1\ReportsModule\" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using AdminAssistant.DomainModel.Modules.MailModule;
using AdminAssistant.Framework.TypeMapping;

namespace AdminAssistant.WebAPI.v1.MailModule
{
public class MailMessageResponseDto : IMapFrom<MailMessage>
{
public int MailMessageID { get; set; }
public string Subject { get; set; } = string.Empty;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using AdminAssistant.DomainModel.Modules.MailModule.CQRS;
using AdminAssistant.Infra.Providers;
using AutoMapper;
using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;

namespace AdminAssistant.WebAPI.v1.MailModule
{
[ApiController]
[Route("api/v1/core/[controller]")]
[ApiExplorerSettings(GroupName = "MailMessage Register - MailMessage")]
public class MailMessageController : WebAPIControllerBase
{
public MailMessageController(IMapper mapper, IMediator mediator, ILoggingProvider loggingProvider)
: base(mapper, mediator, loggingProvider)
{
}

[HttpGet]
[SwaggerOperation("Lists all mail messages", OperationId = "GetMailMessage")]
[SwaggerResponse(StatusCodes.Status200OK, "Ok - returns a list of MailMessageResponseDto", type: typeof(IEnumerable<MailMessageResponseDto>))]
public async Task<ActionResult<IEnumerable<MailMessageResponseDto>>> GetMailMessages()
{
Log.Start();

var result = await Mediator.Send(new MailMessageQuery()).ConfigureAwait(false);
var response = Mapper.Map<IEnumerable<MailMessageResponseDto>>(result.Value);

return Log.Finish(Ok(response));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using AdminAssistant.DomainModel.Modules.ContactsModule;
using AdminAssistant.DomainModel.Modules.CoreModule;
using AdminAssistant.DomainModel.Modules.DocumentsModule;
using AdminAssistant.DomainModel.Modules.MailModule;
using AdminAssistant.DomainModel.Modules.TasksModule;
using AdminAssistant.WebAPI.v1.AccountsModule;
using AdminAssistant.WebAPI.v1.AssetRegisterModule;
Expand All @@ -16,6 +17,7 @@
using AdminAssistant.WebAPI.v1.ContactsModule;
using AdminAssistant.WebAPI.v1.CoreModule;
using AdminAssistant.WebAPI.v1.DocumentsModule;
using AdminAssistant.WebAPI.v1.MailModule;
using AdminAssistant.WebAPI.v1.TasksModule;
using AutoMapper;
using FluentAssertions;
Expand Down Expand Up @@ -156,6 +158,21 @@ public void ShouldSupportDocumentsModuleMappingFromSourceToDestination(Type sour
result.Should().NotBeNull();
}

[Theory]
[Trait("Category", "Unit")]
[InlineData(typeof(MailMessage), typeof(MailMessageResponseDto))]
public void ShouldSupportMailModuleMappingFromSourceToDestination(Type source, Type destination)
{
// Arrange
var instance = Activator.CreateInstance(source);

// Act
var result = _mapper.Map(instance, source, destination);

// Assert
result.Should().NotBeNull();
}

[Theory]
[Trait("Category", "Unit")]
[InlineData(typeof(TaskList), typeof(TaskListResponseDto))]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#pragma warning disable CA1707 // Identifiers should not contain underscores
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AdminAssistant.DomainModel;
using AdminAssistant.DomainModel.Modules.MailModule;
using AdminAssistant.DomainModel.Modules.MailModule.CQRS;
using Ardalis.Result;
using AutoMapper;
using FluentAssertions;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Xunit;

namespace AdminAssistant.WebAPI.v1.MailModule
{
public class MailMessageController_GetMailMessages
{
[Fact]
[Trait("Category", "Unit")]
public async Task Returns_Status200OK_With_AListOfMailMessages_Given_NoArguments()
{
// Arrange
var documents = new List<MailMessage>()
{
Factory.MailMessage.WithTestData(10).Build(),
Factory.MailMessage.WithTestData(20).Build()
};

var services = new ServiceCollection();
services.AddMockServerSideLogging();
services.AddAutoMapper(typeof(MappingProfile));

var mockMediator = new Mock<IMediator>();
mockMediator.Setup(x => x.Send(It.IsAny<MailMessageQuery>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(Result<IEnumerable<MailMessage>>.Success(documents)));

services.AddTransient((sp) => mockMediator.Object);
services.AddTransient<MailMessageController>();

// Act
var response = await services.BuildServiceProvider().GetRequiredService<MailMessageController>().GetMailMessages().ConfigureAwait(false);

// Assert
response.Result.Should().BeOfType<OkObjectResult>();
response.Value.Should().BeNull();

var result = (OkObjectResult)response.Result;
result.Value.Should().BeAssignableTo<IEnumerable<MailMessageResponseDto>>();

//var value = ((IEnumerable<CurrencyResponseDto>)result.Value).ToArray();
//value.Should().HaveCount(currencies.Count);

//var expected = currencies.ToArray();
//for (int i = 0; i < expected.Length; i++)
//{
// value[i].CurrencyID.Should().Be(expected[i].CurrencyID);
// value[i].Symbol.Should().Be(expected[i].Symbol);
// value[i].DecimalFormat.Should().Be(expected[i].DecimalFormat);
//}
}
}
}
#pragma warning restore CA1707 // Identifiers should not contain underscores
1 change: 0 additions & 1 deletion src/AdminAssistant/AdminAssistant.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
<Folder Include="Infra\DAL\Modules\ReportsModule\" />
<Folder Include="DomainModel\Modules\BillingModule\" />
<Folder Include="DomainModel\Modules\DashboardModule\" />
<Folder Include="DomainModel\Modules\MailModule\" />
<Folder Include="DomainModel\Modules\ReportsModule\" />
<Folder Include="Infra\Providers\" />
</ItemGroup>
Expand Down
4 changes: 4 additions & 0 deletions src/AdminAssistant/DomainModel/Factory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using AdminAssistant.DomainModel.Modules.ContactsModule.Builders;
using AdminAssistant.DomainModel.Modules.CoreModule.Builders;
using AdminAssistant.DomainModel.Modules.DocumentsModule.Builders;
using AdminAssistant.DomainModel.Modules.MailModule.Builders;
using AdminAssistant.DomainModel.Modules.TasksModule.Builders;

namespace AdminAssistant.DomainModel
Expand Down Expand Up @@ -36,6 +37,9 @@ public static class Factory
// Documents Module ...
public static IDocumentBuilder Document => new DocumentBuilder();

// Mail Module ...
public static IMailMessageBuilder MailMessage => new MailMessageBuilder();

// Tasks Module ...
public static ITaskListBuilder TaskList => new TaskListBuilder();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace AdminAssistant.DomainModel.Modules.MailModule.Builders
{
public interface IMailMessageBuilder
{
MailMessage Build();
IMailMessageBuilder WithTestData(int assetID = Constants.UnknownRecordID);
IMailMessageBuilder WithSubject(string subject);
}
internal class MailMessageBuilder : MailMessage, IMailMessageBuilder
{
public static MailMessage Default(IMailMessageBuilder builder) => builder.Build();
public static MailMessage Default(MailMessageBuilder builder) => builder.Build();

public MailMessage Build() => this;

public IMailMessageBuilder WithTestData(int assetID = Constants.UnknownRecordID)
{
MailMessageID = assetID;
Subject = "A mail from the boss";
return this;
}
public IMailMessageBuilder WithSubject(string subject)
{
Subject = subject;
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Collections.Generic;
using Ardalis.Result;
using MediatR;

namespace AdminAssistant.DomainModel.Modules.MailModule.CQRS
{
public class MailMessageQuery : IRequest<Result<IEnumerable<MailMessage>>>
{
}
}
14 changes: 14 additions & 0 deletions src/AdminAssistant/DomainModel/Modules/MailModule/MailMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using AdminAssistant.Infra.DAL;

namespace AdminAssistant.DomainModel.Modules.MailModule
{
public class MailMessage : IDatabasePersistable
{
public const int SubjectNameMaxLength = Constants.DescriptionMaxLength;

public int MailMessageID { get; set; }
public string Subject { get; set; } = string.Empty;

public int PrimaryKey => MailMessageID;
}
}

0 comments on commit 1845ade

Please sign in to comment.