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