diff --git a/HR.LeaveManagement.Infrastructure/EmailService/EmailSender.cs b/HR.LeaveManagement.Infrastructure/EmailService/EmailSender.cs new file mode 100644 index 0000000..b911a1c --- /dev/null +++ b/HR.LeaveManagement.Infrastructure/EmailService/EmailSender.cs @@ -0,0 +1,31 @@ +using HR.LeaveManagement.Application.Contracts.Email; +using HR.LeaveManagement.Application.Models.Email; + +using Microsoft.Extensions.Options; + +using SendGrid; +using SendGrid.Helpers.Mail; + +namespace HR.LeaveManagement.Infrastructure.EmailService; +public class EmailSender : IEmailSender +{ + public EmailSettings _emailSettings { get; } + public EmailSender(IOptions emailSettings) + => _emailSettings = emailSettings.Value; + + public async Task SendEmail(EmailMessage email) + { + var client = new SendGridClient(_emailSettings.ApiKey); + var to = new EmailAddress(email.To); + var from = new EmailAddress + { + Email = _emailSettings.FromAddress, + Name = _emailSettings.FromName + }; + + var message = MailHelper.CreateSingleEmail(from, to, email.Subject, email.Body, email.Body); + var response = await client.SendEmailAsync(message); + + return response.IsSuccessStatusCode; + } +} \ No newline at end of file diff --git a/HR.LeaveManagement.Infrastructure/HR.LeaveManagement.Infrastructure.csproj b/HR.LeaveManagement.Infrastructure/HR.LeaveManagement.Infrastructure.csproj new file mode 100644 index 0000000..6452165 --- /dev/null +++ b/HR.LeaveManagement.Infrastructure/HR.LeaveManagement.Infrastructure.csproj @@ -0,0 +1,21 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/HR.LeaveManagement.Infrastructure/InfrastructureServicesRegistration.cs b/HR.LeaveManagement.Infrastructure/InfrastructureServicesRegistration.cs new file mode 100644 index 0000000..89cfa14 --- /dev/null +++ b/HR.LeaveManagement.Infrastructure/InfrastructureServicesRegistration.cs @@ -0,0 +1,20 @@ +using HR.LeaveManagement.Application.Contracts.Email; +using HR.LeaveManagement.Application.Contracts.Logging; +using HR.LeaveManagement.Application.Models.Email; +using HR.LeaveManagement.Infrastructure.EmailService; +using HR.LeaveManagement.Infrastructure.Logging; + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace HR.LeaveManagement.Infrastructure; +public static class InfrastructureServicesRegistration +{ + public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, IConfiguration configuration) + { + services.Configure(configuration.GetSection("EmailSettings")); + services.AddTransient(); + services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>)); + return services; + } +} \ No newline at end of file diff --git a/HR.LeaveManagement.Infrastructure/Logging/LoggerAdapter.cs b/HR.LeaveManagement.Infrastructure/Logging/LoggerAdapter.cs new file mode 100644 index 0000000..c47c36a --- /dev/null +++ b/HR.LeaveManagement.Infrastructure/Logging/LoggerAdapter.cs @@ -0,0 +1,17 @@ +using HR.LeaveManagement.Application.Contracts.Logging; + +using Microsoft.Extensions.Logging; + +namespace HR.LeaveManagement.Infrastructure.Logging; +public class LoggerAdapter : IAppLogger +{ + private readonly ILogger _logger; + public LoggerAdapter(ILoggerFactory loggerFactory) + => _logger = loggerFactory.CreateLogger(); + + public void LogInformation(string message, params object[] args) + => _logger.LogInformation(message, args); + + public void LogWarning(string message, params object[] args) + => _logger.LogWarning(message, args); +} \ No newline at end of file diff --git a/HR.LeaveManagement.sln b/HR.LeaveManagement.sln index d1075bf..61fa4ca 100644 --- a/HR.LeaveManagement.sln +++ b/HR.LeaveManagement.sln @@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HR.LeaveManagement.Domain", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HR.LeaveManagement.Application", "HR.LeaveManagement.Application\HR.LeaveManagement.Application.csproj", "{D63F4CEC-1751-4508-89BB-004EF5F2D655}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HR.LeaveManagement.Persistence", "HR.LeaveManagement.Persistence\HR.LeaveManagement.Persistence.csproj", "{5CC8F511-EDD3-47A8-9EBF-5B949696991B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HR.LeaveManagement.Infrastructure", "HR.LeaveManagement.Infrastructure\HR.LeaveManagement.Infrastructure.csproj", "{FEF27D23-751D-4D0C-9FEB-740537F0CB9D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -35,10 +35,10 @@ Global {D63F4CEC-1751-4508-89BB-004EF5F2D655}.Debug|Any CPU.Build.0 = Debug|Any CPU {D63F4CEC-1751-4508-89BB-004EF5F2D655}.Release|Any CPU.ActiveCfg = Release|Any CPU {D63F4CEC-1751-4508-89BB-004EF5F2D655}.Release|Any CPU.Build.0 = Release|Any CPU - {5CC8F511-EDD3-47A8-9EBF-5B949696991B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CC8F511-EDD3-47A8-9EBF-5B949696991B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CC8F511-EDD3-47A8-9EBF-5B949696991B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CC8F511-EDD3-47A8-9EBF-5B949696991B}.Release|Any CPU.Build.0 = Release|Any CPU + {FEF27D23-751D-4D0C-9FEB-740537F0CB9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FEF27D23-751D-4D0C-9FEB-740537F0CB9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FEF27D23-751D-4D0C-9FEB-740537F0CB9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FEF27D23-751D-4D0C-9FEB-740537F0CB9D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -50,7 +50,7 @@ Global {806C1EC6-F10D-40B0-A859-1E6D915C2CFB} = {5DA04958-626B-491F-9598-ADD8B89F0205} {77E4397B-55C9-484F-B8FD-9D5C2917B561} = {79013FD3-7C1C-4AF0-AA5B-8F356DC00404} {D63F4CEC-1751-4508-89BB-004EF5F2D655} = {79013FD3-7C1C-4AF0-AA5B-8F356DC00404} - {5CC8F511-EDD3-47A8-9EBF-5B949696991B} = {806C1EC6-F10D-40B0-A859-1E6D915C2CFB} + {FEF27D23-751D-4D0C-9FEB-740537F0CB9D} = {806C1EC6-F10D-40B0-A859-1E6D915C2CFB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {20D6677C-2E5C-4FCC-9FFB-D6FE8214DA70}