feat: E-Mail-Vorlagenverarbeitung hinzufügen

- Methode `FillTemplate` für Platzhalterersetzung hinzugefügt.
- `TemplatePlaceholderAttribute` eingeführt.
- `EmailOutService` mit Vorlagenmethoden aktualisiert.
- Unit-Tests für Vorlagenverarbeitung hinzugefügt.
This commit is contained in:
Developer 02
2024-06-10 14:16:54 +02:00
parent 1adc0c4d93
commit a2bd369ed1
10 changed files with 240 additions and 25 deletions

View File

@@ -1,4 +1,5 @@
using DigitalData.Core.Contracts.Application;
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut;
using DigitalData.EmailProfilerDispatcher.Domain.Entities;
using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts;
@@ -7,5 +8,6 @@ namespace DigitalData.EmailProfilerDispatcher.Application.Contracts
{
public interface IEmailOutService : ICRUDService<IEmailOutRepository, EmailOutCreateDto, EmailOutDto, EmailOutDto, EmailOut, int>
{
}
Task<DataResult<int>> CreateWithTemplateAsync(EmailOutCreateDto createDto, params object[] models);
}
}

View File

@@ -1,23 +1,25 @@
namespace DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut
{
public record EmailOutCreateDto(
int ReminderTypeId,
int SendingProfile,
int ReferenceId,
string? ReferenceString,
int? EntityId,
int WfId,
string? WfReference,
string EmailAddress,
string EmailSubj,
string EmailBody,
string? EmailAttmt1,
DateTime? EmailSent,
string? Comment,
string? AddedWho, // Default value will be 'DEFAULT', made nullable
string? ChangedWho,
DateTime? ChangedWhen,
DateTime? ErrorTimestamp,
string? ErrorMsg
);
}
public record EmailOutCreateDto
{
public int ReminderTypeId { get; set; }
public int SendingProfile { get; set; }
public int ReferenceId { get; set; }
public int WfId { get; set; }
public string EmailAddress { get; set; }
public string EmailSubj { get; set; }
public string EmailBody { get; set; }
public string? ReferenceString { get; set; } = null;
public int? EntityId { get; set; } = null;
public string? WfReference { get; set; } = null;
public string? EmailAttmt1 { get; set; } = null;
public DateTime? EmailSent { get; set; } = null;
public string? Comment { get; set; } = null;
public string? AddedWho { get; set; } = "DEFAULT";
public string? ChangedWho { get; set; } = null;
public DateTime? ChangedWhen { get; set; } = null;
public DateTime? ErrorTimestamp { get; set; } = null;
public string? ErrorMsg { get; set; } = null;
}
}

View File

@@ -1,10 +1,13 @@
using AutoMapper;
using DigitalData.Core.Application;
using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Application.Contracts;
using DigitalData.EmailProfilerDispatcher.Application.DTOs.EmailOut;
using DigitalData.EmailProfilerDispatcher.Domain.Attributes;
using DigitalData.EmailProfilerDispatcher.Domain.Entities;
using DigitalData.EmailProfilerDispatcher.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
using System.Reflection;
namespace DigitalData.EmailProfilerDispatcher.Application.Services
{
@@ -13,5 +16,36 @@ namespace DigitalData.EmailProfilerDispatcher.Application.Services
public EmailOutService(IEmailOutRepository repository, IStringLocalizer<TResource> localizer, IMapper mapper) : base(repository, localizer, mapper)
{
}
}
public string ApplyTemplate(string template, params object[] models) => FillTemplate(template: template, models: models);
public async Task<DataResult<int>> CreateWithTemplateAsync(EmailOutCreateDto createDto, params object[] models)
{
createDto.EmailSubj = FillTemplate(createDto.EmailSubj, models);
createDto.EmailBody = FillTemplate(createDto.EmailBody, models);
return await base.CreateAsync(createDto);
}
public static string FillTemplate(string template, params object[] models)
{
foreach(var model in models)
{
var properties = model.GetType().GetProperties();
foreach (var property in properties)
{
var attribute = property.GetCustomAttribute<TemplatePlaceholderAttribute>();
if (attribute != null)
{
var value = property.GetValue(model)?.ToString();
template = template.Replace(attribute.Placeholder, value);
}
}
}
return template;
}
}
}