feat: admin editable email templates
addresses #869eg7ptr
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Config;
|
||||
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
|
||||
/**
|
||||
* Reads the delivered wording of the admin-editable mails from config/email_texts.yaml.
|
||||
*
|
||||
* That wording is the fallback used whenever no email_text row exists for a key, so the
|
||||
* mails keep working on a fresh database and "reset to default" needs nothing but deleting
|
||||
* the row.
|
||||
*
|
||||
* The file is parsed lazily and memoised: a request that sends no mail and opens no admin
|
||||
* screen never touches it, and one that does reads it once. Nothing here is validated at
|
||||
* compile time, so a missing entry surfaces as an error the first time the catalogue is
|
||||
* built - EmailTextCatalogTest builds all of them.
|
||||
*/
|
||||
class EmailTextCatalog
|
||||
{
|
||||
/**
|
||||
* @var array<string, EmailTextDefinition>|null
|
||||
*/
|
||||
private ?array $definitions = null;
|
||||
|
||||
public function __construct(
|
||||
private readonly string $emailTextsFile,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, EmailTextDefinition> keyed by EmailTextKey value
|
||||
*/
|
||||
public function all(): array
|
||||
{
|
||||
return $this->definitions ??= $this->build();
|
||||
}
|
||||
|
||||
public function get(EmailTextKey $key): EmailTextDefinition
|
||||
{
|
||||
return $this->all()[$key->value];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, EmailTextDefinition>
|
||||
*/
|
||||
private function build(): array
|
||||
{
|
||||
$config = Yaml::parseFile($this->emailTextsFile);
|
||||
$descriptions = $config['placeholders'];
|
||||
|
||||
$definitions = [];
|
||||
|
||||
foreach (EmailTextKey::cases() as $key) {
|
||||
$text = $config['texts'][$key->value];
|
||||
|
||||
$placeholders = [];
|
||||
|
||||
foreach ($text['placeholders'] as $name) {
|
||||
$placeholders[$name] = $descriptions[$name];
|
||||
}
|
||||
|
||||
$definitions[$key->value] = new EmailTextDefinition(
|
||||
$key,
|
||||
$text['label'],
|
||||
$placeholders,
|
||||
$text['subject'],
|
||||
$text['headline'],
|
||||
$text['body'],
|
||||
);
|
||||
}
|
||||
|
||||
return $definitions;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user