diff --git a/Correo.sln b/Correo.sln
index 1c5cffa..29e20eb 100644
--- a/Correo.sln
+++ b/Correo.sln
@@ -22,6 +22,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Correo.Application", "src\C
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Correo.PublishedLanguage", "src\Correo.PublishedLanguage\Correo.PublishedLanguage.csproj", "{DA47BCEE-9AE7-4F20-A04F-5866966503C5}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Correo.Domain", "src\Correo.Domain\Correo.Domain.csproj", "{A2D2694C-AB68-49B0-B4B0-94BBFF48C043}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -40,6 +42,10 @@ Global
{DA47BCEE-9AE7-4F20-A04F-5866966503C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA47BCEE-9AE7-4F20-A04F-5866966503C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DA47BCEE-9AE7-4F20-A04F-5866966503C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2D2694C-AB68-49B0-B4B0-94BBFF48C043}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2D2694C-AB68-49B0-B4B0-94BBFF48C043}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A2D2694C-AB68-49B0-B4B0-94BBFF48C043}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A2D2694C-AB68-49B0-B4B0-94BBFF48C043}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -48,6 +54,7 @@ Global
{B712E585-E63F-4A6D-8E17-FEFACE04BBE2} = {245E2FBE-DFDF-40B4-94B7-5DDA216E58AD}
{3AEA1AB4-F068-4C39-A173-AD65F3F8E2F2} = {245E2FBE-DFDF-40B4-94B7-5DDA216E58AD}
{DA47BCEE-9AE7-4F20-A04F-5866966503C5} = {245E2FBE-DFDF-40B4-94B7-5DDA216E58AD}
+ {A2D2694C-AB68-49B0-B4B0-94BBFF48C043} = {245E2FBE-DFDF-40B4-94B7-5DDA216E58AD}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {86FCF989-26FC-41E9-8A23-9485606D619D}
diff --git a/dependencies.props b/dependencies.props
index ab137b6..ce84682 100644
--- a/dependencies.props
+++ b/dependencies.props
@@ -4,6 +4,8 @@
6.1.0
5.5.0
6.2.3
+ 12.0.1
+ 12.0.0
9.0.0
6.0.30
diff --git a/src/Correo.Application/CommandHandlers/SendEmailHandler.cs b/src/Correo.Application/CommandHandlers/SendEmailHandler.cs
new file mode 100644
index 0000000..96422c1
--- /dev/null
+++ b/src/Correo.Application/CommandHandlers/SendEmailHandler.cs
@@ -0,0 +1,49 @@
+using AutoMapper;
+using Correo.Domain.Models;
+using Correo.PublishedLanguage.Commands;
+using Correo.PublishedLanguage.Events;
+using MediatR;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using NBB.Messaging.Abstractions;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Correo.Application.CommandHandlers
+{
+ public class SendEmailHandler : IRequestHandler
+ {
+ private readonly IMessageBusPublisher _messageBusPublisher;
+ private readonly ILogger _logger;
+ private readonly IMapper _mapper;
+ private readonly IOptions _defaultSender;
+
+ public SendEmailHandler(IMessageBusPublisher messageBusPublisher, ILogger logger, IMapper mapper, IOptions defaultSender)
+ {
+ _messageBusPublisher=messageBusPublisher;
+ _logger=logger;
+ _mapper=mapper;
+ _defaultSender=defaultSender;
+ }
+
+ public async Task Handle(SendEmail command, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var emailMessage = _mapper.Map(command);
+ if (emailMessage.From == null)
+ emailMessage.From = new EmailMessage.MailAddress(_defaultSender.Value.Address, _defaultSender.Value.Name);
+
+ // send email
+ }
+ catch (Exception ex)
+ {
+ await _messageBusPublisher.PublishAsync(new EmailSentFailed(command.Subject, ex.Message), cancellationToken);
+ throw;
+ }
+
+ return Unit.Value;
+ }
+ }
+}
diff --git a/src/Correo.Application/Correo.Application.csproj b/src/Correo.Application/Correo.Application.csproj
index 9c6904d..1e842d8 100644
--- a/src/Correo.Application/Correo.Application.csproj
+++ b/src/Correo.Application/Correo.Application.csproj
@@ -5,6 +5,13 @@
+
+
+
+
+
+
+
diff --git a/src/Correo.Application/DependencyInjectionExtensions.cs b/src/Correo.Application/DependencyInjectionExtensions.cs
new file mode 100644
index 0000000..0fd3631
--- /dev/null
+++ b/src/Correo.Application/DependencyInjectionExtensions.cs
@@ -0,0 +1,14 @@
+using Correo.Domain.Models;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Correo.Application
+{
+ public static class DependencyInjectionExtensions
+ {
+ public static void AddApplicationServices(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.Configure(configuration.GetSection("DefaultSender"));
+ }
+ }
+}
diff --git a/src/Correo.Application/Mappings/MappingProfile.cs b/src/Correo.Application/Mappings/MappingProfile.cs
new file mode 100644
index 0000000..32b3305
--- /dev/null
+++ b/src/Correo.Application/Mappings/MappingProfile.cs
@@ -0,0 +1,15 @@
+using AutoMapper;
+using Correo.Domain.Models;
+using Correo.PublishedLanguage.Commands;
+
+namespace Correo.Application.Mappings
+{
+ public class MappingProfile : Profile
+ {
+ public MappingProfile()
+ {
+ CreateMap();
+ CreateMap();
+ }
+ }
+}
diff --git a/src/Correo.Application/Queries/GetSystemVersion.cs b/src/Correo.Application/Queries/GetSystemVersion.cs
index e98f839..dc70921 100644
--- a/src/Correo.Application/Queries/GetSystemVersion.cs
+++ b/src/Correo.Application/Queries/GetSystemVersion.cs
@@ -9,7 +9,6 @@ namespace Correo.Application.Queries
{
public record Query : IRequest
{
- public int CountyId { get; init; }
}
public record Model
diff --git a/src/Correo.Domain/Correo.Domain.csproj b/src/Correo.Domain/Correo.Domain.csproj
new file mode 100644
index 0000000..dbc1517
--- /dev/null
+++ b/src/Correo.Domain/Correo.Domain.csproj
@@ -0,0 +1,7 @@
+
+
+
+ net6.0
+
+
+
diff --git a/src/Correo.Domain/Models/EmailMessage.cs b/src/Correo.Domain/Models/EmailMessage.cs
new file mode 100644
index 0000000..aaf4665
--- /dev/null
+++ b/src/Correo.Domain/Models/EmailMessage.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+
+namespace Correo.Domain.Models
+{
+ public record EmailMessage
+ {
+ public string Subject { get; init; }
+ public string Body { get; init; }
+ public MailAddress From { get; set; }
+ public IEnumerable To { get; init; }
+ public IEnumerable Cc { get; init; }
+ public IEnumerable Bcc { get; init; }
+ public bool IsBodyHtml { get; init; }
+
+ public record MailAddress(string Address, string DisplayName);
+ }
+}
diff --git a/src/Correo.Domain/Models/Settings.cs b/src/Correo.Domain/Models/Settings.cs
new file mode 100644
index 0000000..b479757
--- /dev/null
+++ b/src/Correo.Domain/Models/Settings.cs
@@ -0,0 +1,4 @@
+namespace Correo.Domain.Models
+{
+ public record DefaultSender(string Address, string Name);
+}
diff --git a/src/Correo.PublishedLanguage/Class1.cs b/src/Correo.PublishedLanguage/Class1.cs
deleted file mode 100644
index d476516..0000000
--- a/src/Correo.PublishedLanguage/Class1.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Correo.PublishedLanguage
-{
- public class Class1
- {
-
- }
-}
\ No newline at end of file
diff --git a/src/Correo.PublishedLanguage/Commands/SendEmail.cs b/src/Correo.PublishedLanguage/Commands/SendEmail.cs
new file mode 100644
index 0000000..e30bd59
--- /dev/null
+++ b/src/Correo.PublishedLanguage/Commands/SendEmail.cs
@@ -0,0 +1,18 @@
+using MediatR;
+using System.Collections.Generic;
+
+namespace Correo.PublishedLanguage.Commands
+{
+ public record SendEmail : IRequest
+ {
+ public string Subject { get; init; }
+ public string Body { get; init; }
+ public MailAddress From { get; init; }
+ public IEnumerable To { get; init; }
+ public IEnumerable Cc { get; init; }
+ public IEnumerable Bcc { get; init; }
+ public bool IsBodyHtml { get; init; }
+
+ public record MailAddress(string Address, string DisplayName);
+ }
+}
diff --git a/src/Correo.PublishedLanguage/Events/Records.cs b/src/Correo.PublishedLanguage/Events/Records.cs
new file mode 100644
index 0000000..87ee821
--- /dev/null
+++ b/src/Correo.PublishedLanguage/Events/Records.cs
@@ -0,0 +1,7 @@
+using MediatR;
+
+namespace Correo.PublishedLanguage.Events
+{
+ public record EmailSent(string Subject) : INotification;
+ public record EmailSentFailed(string Subject, string ErrorMessage) : INotification;
+}
diff --git a/src/Correo/Controllers/SystemController.cs b/src/Correo/Controllers/SystemController.cs
index 0fe5966..84e8f23 100644
--- a/src/Correo/Controllers/SystemController.cs
+++ b/src/Correo/Controllers/SystemController.cs
@@ -1,6 +1,8 @@
+using Correo.Application.Queries;
+using MediatR;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Logging;
using System;
+using System.Threading.Tasks;
namespace Correo.Controllers
{
@@ -8,11 +10,11 @@ namespace Correo.Controllers
[Route("[controller]")]
public class SystemController : ControllerBase
{
- private readonly ILogger _logger;
+ private readonly IMediator _mediator;
- public SystemController(ILogger logger)
+ public SystemController(IMediator mediator)
{
- _logger = logger;
+ _mediator=mediator;
}
[HttpGet("ping")]
@@ -20,5 +22,12 @@ namespace Correo.Controllers
{
return $"Ping success. System datetime: {DateTime.Now}";
}
+
+ [HttpGet("version")]
+ public async Task GetSystemVersion([FromRoute] GetSystemVersion.Query query)
+ {
+ var result = await _mediator.Send(query);
+ return Ok(result);
+ }
}
}
\ No newline at end of file
diff --git a/src/Correo/Correo.csproj b/src/Correo/Correo.csproj
index 90cdbcc..47d3913 100644
--- a/src/Correo/Correo.csproj
+++ b/src/Correo/Correo.csproj
@@ -5,6 +5,7 @@
+
diff --git a/src/Correo/Extensions/StartupExtensions.cs b/src/Correo/Extensions/StartupExtensions.cs
index 8ea74b4..7978814 100644
--- a/src/Correo/Extensions/StartupExtensions.cs
+++ b/src/Correo/Extensions/StartupExtensions.cs
@@ -18,6 +18,9 @@ namespace Correo.Extensions
services.AddEndpointsApiExplorer();
services.AddSwaggerGen();
+ // AutoMapper
+ services.AddAutoMapper(typeof(Application.Mappings.MappingProfile).Assembly);
+
// MediatR
services.AddMediatR(typeof(Application.Queries.GetSystemVersion).Assembly);
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(RequestPreProcessorBehavior<,>));
diff --git a/src/Correo/appsettings.json b/src/Correo/appsettings.json
index 308d313..7bdd60b 100644
--- a/src/Correo/appsettings.json
+++ b/src/Correo/appsettings.json
@@ -24,5 +24,21 @@
"qGroup": "Correo",
"durableName": "durable"
}
+ },
+ "DefaultSender": {
+ "Address": "noreply@homelab.com",
+ "Name": "HomeLab"
+ },
+ "SmtpClient": {
+ "Server": "smtp.gmail.com",
+ "Port": "587",
+ "Authentication": {
+ "UserName": "@gmail.com",
+ "Domain": "",
+ "Password": "********"
+ },
+ "UseAuthentication": true,
+ "UseSsl": true,
+ "TrustServer": false
}
-}
+}
\ No newline at end of file