mirror of https://github.com/abpframework/abp.git
26 changed files with 248 additions and 206 deletions
@ -0,0 +1,22 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
|
||||
|
namespace Volo.Abp.Emailing.Templates |
||||
|
{ |
||||
|
public class EmailTemplateContributorList : List<IEmailTemplateContributor> |
||||
|
{ |
||||
|
public string GetOrNull(string cultureName) |
||||
|
{ |
||||
|
foreach (var contributor in this.AsQueryable().Reverse()) |
||||
|
{ |
||||
|
var templateString = contributor.GetOrNull(cultureName); |
||||
|
if (templateString != null) |
||||
|
{ |
||||
|
return templateString; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace Volo.Abp.Emailing.Templates |
||||
|
{ |
||||
|
public class EmailTemplateInitializationContext |
||||
|
{ |
||||
|
public EmailTemplateDefinition EmailTemplateDefinition { get; } |
||||
|
|
||||
|
public IServiceProvider ServiceProvider { get; } |
||||
|
|
||||
|
public EmailTemplateInitializationContext(EmailTemplateDefinition emailTemplateDefinition, |
||||
|
IServiceProvider serviceProvider) |
||||
|
{ |
||||
|
EmailTemplateDefinition = emailTemplateDefinition; |
||||
|
ServiceProvider = serviceProvider; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,20 +0,0 @@ |
|||||
using System; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
|
|
||||
namespace Volo.Abp.Emailing.Templates |
|
||||
{ |
|
||||
public class EmailTemplateProviderContributorContext : IServiceProviderAccessor |
|
||||
{ |
|
||||
public string Name { get; } |
|
||||
|
|
||||
public IServiceProvider ServiceProvider { get; } |
|
||||
|
|
||||
public EmailTemplate Template { get; set; } |
|
||||
|
|
||||
public EmailTemplateProviderContributorContext(string name, IServiceProvider serviceProvider) |
|
||||
{ |
|
||||
Name = name; |
|
||||
ServiceProvider = serviceProvider; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,9 @@ |
|||||
|
namespace Volo.Abp.Emailing.Templates |
||||
|
{ |
||||
|
public interface IEmailTemplateContributor |
||||
|
{ |
||||
|
void Initialize(EmailTemplateInitializationContext context); |
||||
|
|
||||
|
string GetOrNull(string cultureName); |
||||
|
} |
||||
|
} |
||||
@ -1,9 +0,0 @@ |
|||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace Volo.Abp.Emailing.Templates |
|
||||
{ |
|
||||
public interface IEmailTemplateProviderContributor |
|
||||
{ |
|
||||
Task ProvideAsync(EmailTemplateProviderContributorContext contributorContext); |
|
||||
} |
|
||||
} |
|
||||
@ -1,16 +0,0 @@ |
|||||
namespace Volo.Abp.Emailing.Templates.Virtual |
|
||||
{ |
|
||||
public static class EmailTemplateDefinitionExtensions |
|
||||
{ |
|
||||
public static EmailTemplateDefinition SetVirtualFilePath(this EmailTemplateDefinition emailTemplateDefinition, string path) |
|
||||
{ |
|
||||
emailTemplateDefinition[VirtualFileEmailTemplateProviderContributor.VirtualFilePathKey] = path; |
|
||||
return emailTemplateDefinition; |
|
||||
} |
|
||||
|
|
||||
public static string GetVirtualFilePathOrNull(this EmailTemplateDefinition emailTemplateDefinition) |
|
||||
{ |
|
||||
return emailTemplateDefinition[VirtualFileEmailTemplateProviderContributor.VirtualFilePathKey] as string; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,14 +0,0 @@ |
|||||
using System.Collections.Generic; |
|
||||
|
|
||||
namespace Volo.Abp.Emailing.Templates.Virtual |
|
||||
{ |
|
||||
public class VirtualFileEmailTemplateOptions |
|
||||
{ |
|
||||
public IDictionary<string, string> Templates { get; } |
|
||||
|
|
||||
public VirtualFileEmailTemplateOptions() |
|
||||
{ |
|
||||
Templates = new Dictionary<string, string>(); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,59 +0,0 @@ |
|||||
using System.Collections.Generic; |
|
||||
using System.Threading.Tasks; |
|
||||
using Microsoft.Extensions.DependencyInjection; |
|
||||
using Microsoft.Extensions.FileProviders; |
|
||||
using Microsoft.Extensions.Options; |
|
||||
using Volo.Abp.VirtualFileSystem; |
|
||||
|
|
||||
namespace Volo.Abp.Emailing.Templates.Virtual |
|
||||
{ |
|
||||
public class VirtualFileEmailTemplateProviderContributor : IEmailTemplateProviderContributor |
|
||||
{ |
|
||||
public const string VirtualFilePathKey = "VirtualFilePath"; |
|
||||
|
|
||||
public Task ProvideAsync(EmailTemplateProviderContributorContext contributorContext) |
|
||||
{ |
|
||||
var templateDefinition = FindTemplateDefinition(contributorContext); |
|
||||
if (templateDefinition == null) |
|
||||
{ |
|
||||
return Task.CompletedTask; |
|
||||
} |
|
||||
|
|
||||
var fileInfo = FindVirtualFileInfo(contributorContext, templateDefinition); |
|
||||
if (fileInfo == null) |
|
||||
{ |
|
||||
return Task.CompletedTask; |
|
||||
} |
|
||||
|
|
||||
contributorContext.Template = new EmailTemplate(fileInfo.ReadAsString(), templateDefinition); |
|
||||
return Task.CompletedTask; |
|
||||
} |
|
||||
|
|
||||
protected virtual EmailTemplateDefinition FindTemplateDefinition(EmailTemplateProviderContributorContext contributorContext) |
|
||||
{ |
|
||||
return contributorContext |
|
||||
.ServiceProvider |
|
||||
.GetRequiredService<IEmailTemplateDefinitionManager>() |
|
||||
.GetOrNull(contributorContext.Name); |
|
||||
} |
|
||||
|
|
||||
protected virtual IFileInfo FindVirtualFileInfo(EmailTemplateProviderContributorContext contributorContext, EmailTemplateDefinition templateDefinition) |
|
||||
{ |
|
||||
var virtualFilePath = templateDefinition?.GetVirtualFilePathOrNull(); |
|
||||
if (virtualFilePath == null) |
|
||||
{ |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
var virtualFileProvider = contributorContext.ServiceProvider.GetRequiredService<IVirtualFileProvider>(); |
|
||||
|
|
||||
var fileInfo = virtualFileProvider.GetFileInfo(virtualFilePath); |
|
||||
if (fileInfo?.Exists != true) |
|
||||
{ |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
return fileInfo; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,12 @@ |
|||||
|
namespace Volo.Abp.Emailing.Templates.VirtualFiles |
||||
|
{ |
||||
|
public static class EmailTemplateDefinitionExtensions |
||||
|
{ |
||||
|
public static EmailTemplateDefinition AddTemplateVirtualFile( |
||||
|
this EmailTemplateDefinition emailTemplateDefinition, string path) |
||||
|
{ |
||||
|
emailTemplateDefinition.Contributors.Add(new VirtualFileEmailTemplateContributor(path)); |
||||
|
return emailTemplateDefinition; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,68 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.FileProviders; |
||||
|
using Volo.Abp.VirtualFileSystem; |
||||
|
|
||||
|
namespace Volo.Abp.Emailing.Templates.VirtualFiles |
||||
|
{ |
||||
|
public class VirtualFileEmailTemplateContributor : IEmailTemplateContributor |
||||
|
{ |
||||
|
private readonly string _virtualPath; |
||||
|
|
||||
|
private IVirtualFileProvider _virtualFileProvider; |
||||
|
|
||||
|
private Dictionary<string, string> _templateDictionary; |
||||
|
|
||||
|
private readonly object _syncObj = new object(); |
||||
|
|
||||
|
public VirtualFileEmailTemplateContributor(string virtualPath) |
||||
|
{ |
||||
|
_virtualPath = virtualPath; |
||||
|
} |
||||
|
|
||||
|
public void Initialize(EmailTemplateInitializationContext context) |
||||
|
{ |
||||
|
_virtualFileProvider = context.ServiceProvider.GetRequiredService<IVirtualFileProvider>(); |
||||
|
} |
||||
|
|
||||
|
public string GetOrNull(string cultureName) |
||||
|
{ |
||||
|
return GetTemplateDictionary().GetOrDefault(cultureName); |
||||
|
} |
||||
|
|
||||
|
private Dictionary<string, string> GetTemplateDictionary() |
||||
|
{ |
||||
|
var dictionaries = _templateDictionary; |
||||
|
if (dictionaries != null) |
||||
|
{ |
||||
|
return dictionaries; |
||||
|
} |
||||
|
|
||||
|
lock (_syncObj) |
||||
|
{ |
||||
|
dictionaries = _templateDictionary; |
||||
|
if (dictionaries != null) |
||||
|
{ |
||||
|
return dictionaries; |
||||
|
} |
||||
|
|
||||
|
_templateDictionary = new Dictionary<string, string>(); |
||||
|
foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath)) |
||||
|
{ |
||||
|
if (file.IsDirectory) |
||||
|
{ |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
// TODO: How to normalize file names?
|
||||
|
_templateDictionary.Add(file.Name.RemovePostFix(".tpl"), file.ReadAsString()); |
||||
|
} |
||||
|
|
||||
|
dictionaries = _templateDictionary; |
||||
|
} |
||||
|
|
||||
|
return dictionaries; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,4 @@ |
|||||
|
Please confirm your email address by clicking the link below. |
||||
|
We may need to send you critical information about our service and it is important that we have an accurate email address. |
||||
|
|
||||
|
<a href="#">Confirm email address</a> |
||||
@ -0,0 +1,4 @@ |
|||||
|
Lütfen aşağıdaki bağlantıya tıklayarak e-posta adresinizi onaylayın. |
||||
|
Size hizmetimizle ilgili kritik bilgileri göndermemiz gerekebilir ve doğru bir e-posta adresimizin olması önemlidir. |
||||
|
|
||||
|
<a href="#">E-posta adresini onayla</a> |
||||
@ -0,0 +1,4 @@ |
|||||
|
Please confirm your email address by clicking the link below. |
||||
|
We may need to send you critical information about our service and it is important that we have an accurate email address. |
||||
|
|
||||
|
<a href="#">Confirm email address</a> |
||||
@ -1,9 +0,0 @@ |
|||||
<!DOCTYPE html> |
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<meta charset="utf-8" /> |
|
||||
</head> |
|
||||
<body> |
|
||||
This is a test template! |
|
||||
</body> |
|
||||
</html> |
|
||||
Loading…
Reference in new issue